Mybatis 中如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

这篇具有很好参考价值的文章主要介绍了Mybatis 中如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Mybatis中,可以通过配置映射文件来将SQL执行结果封装为目标对象并返回。 一种映射形式是使用resultType属性,将查询结果映射为指定的目标对象。例如:

xmlCopy code<select id="selectUser" resultType="com.example.User">
  SELECT * FROM user WHERE id = #{id}
</select>

另一种映射形式是使用resultMap属性,通过定义映射关系来将查询结果映射为目标对象。例如:

xmlCopy code<resultMap id="userMap" type="com.example.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="age" column="age"/>
</resultMap>
<select id="selectUser" resultMap="userMap">
  SELECT * FROM user WHERE id = #{id}
</select>

除了以上两种形式,还可以使用@Results和@Result注解来进行映射配置。例如:

javaCopy code@Results({
  @Result(property = "id", column = "id"),
  @Result(property = "name", column = "name"),
  @Result(property = "age", column = "age")
})
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(int id);

以上是Mybatis中将SQL执行结果封装为目标对象并返回的几种映射形式。根据具体的需求和使用场景,可以选择合适的方式来进行对象映射。

以下是一个示例代码,演示了如何使用Mybatis将SQL执行结果封装为目标对象并返回:

创建User类作为目标对象:

javaCopy codepublic class User {
    private int id;
    private String name;
    private int age;
    
    // 省略getter和setter方法
}

创建映射文件(userMapper.xml):

xmlCopy code<!-- 配置命名空间 -->
<mapper namespace="com.example.UserMapper">
    <!-- 使用resultType将结果映射为User对象 -->
    <select id="selectUser" resultType="com.example.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <!-- 使用resultMap定义映射关系将结果映射为User对象 -->
    <resultMap id="userMap" type="com.example.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>
    <select id="selectUserWithMap" resultMap="userMap">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

创建UserMapper接口:

javaCopy codepublic interface UserMapper {
    User selectUser(int id);
    User selectUserWithMap(int id);
}

配置Mybatis的SqlSessionFactory和MapperScannerConfigurer:

javaCopy code@Configuration
@MapperScan("com.example.mapper")
public class MybatisConfig {
    
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }
    
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
        scannerConfigurer.setBasePackage("com.example.mapper");
        return scannerConfigurer;
    }
    
    // 省略其他配置
}

使用UserMapper进行查询:

javaCopy code@Autowired
private UserMapper userMapper;
public void getUser() {
    // 使用resultType方式
    User user = userMapper.selectUser(1);
    System.out.println(user.getId() + " - " + user.getName() + " - " + user.getAge());
    
    // 使用resultMap方式
    User userWithMap = userMapper.selectUserWithMap(1);
    System.out.println(userWithMap.getId() + " - " + userWithMap.getName() + " - " + userWithMap.getAge());
}

以上示例代码演示了如何使用Mybatis将SQL执行结果封装为目标对象并返回,包括使用resultType和resultMap两种映射形式。根据具体的需求选择合适的方式进行对象映射。

目录

Mybatis 中如何将 SQL 执行结果封装为目标对象并返回?都有哪些映射形式?

引言

结果映射

基于列名的映射

基于属性的映射

嵌套映射

自动映射

结论


Mybatis 中如何将 SQL 执行结果封装为目标对象并返回?都有哪些映射形式?

引言

Mybatis 是一个优秀的持久层框架,它提供了多种方式将 SQL 执行结果封装为目标对象并返回。本文将介绍在 Mybatis 中如何进行结果映射,并探讨几种常见的映射形式。

结果映射

结果映射是将 SQL 执行结果与目标对象进行关联的过程。Mybatis 提供了多种方式来进行结果映射,以便满足不同的需求。

基于列名的映射

在基于列名的映射中,Mybatis 会将 SQL 查询结果中的列名与目标对象的属性名进行匹配,并将查询结果的值赋给目标对象对应的属性。需要注意的是,目标对象的属性名必须和查询结果的列名一致,且不区分大小写。 示例:

javaCopy codepublic class User {
    private Long id;
    private String username;
    // getters and setters
}
// Mapper XML 文件
<select id="getUserById" resultType="User">
    SELECT id, username FROM users WHERE id = #{id}
</select>

基于属性的映射

在基于属性的映射中,Mybatis 会将 SQL 查询结果中的值按照属性的顺序,依次赋给目标对象的属性。需要注意的是,查询结果的列数必须与目标对象的属性个数一致,且按顺序对应。 示例:

javaCopy codepublic class User {
    private Long id;
    private String username;
    // getters and setters
}
// Mapper XML 文件
<select id="getUserById" resultType="User">
    SELECT id, username FROM users WHERE id = #{id}
</select>

嵌套映射

嵌套映射是指将 SQL 查询结果包含的多个表的数据映射为一个复杂的目标对象。在 Mybatis 中,可以通过定义复杂的结果映射关系来实现嵌套映射。 示例:

javaCopy codepublic class Order {
    private Long id;
    private String orderNo;
    private User user;
    // getters and setters
}
// Mapper XML 文件
<select id="getOrderById" resultMap="OrderResultMap">
    SELECT o.id, o.order_no, u.id as user_id, u.username as user_username
    FROM orders o
    LEFT JOIN users u ON o.user_id = u.id
    WHERE o.id = #{id}
</select>
<resultMap id="OrderResultMap" type="Order">
    <id property="id" column="id"/>
    <result property="orderNo" column="order_no"/>
    <association property="user" javaType="User">
        <id property="id" column="user_id"/>
        <result property="username" column="user_username"/>
    </association>
</resultMap>

自动映射

自动映射是 Mybatis 提供的一种便捷的映射方式。在自动映射中,Mybatis 会根据查询结果的列名与目标对象的属性名自动进行映射,无需手动定义映射关系。需要注意的是,自动映射对于复杂的映射关系可能无法满足需求,此时需要使用其他映射方式。 示例:

javaCopy codepublic class User {
    private Long id;
    private String username;
    // getters and setters
}
// Mapper XML 文件
<select id="getUserById" resultMap="AutoMapping">
    SELECT id, username FROM users WHERE id = #{id}
</select>
<resultMap id="AutoMapping" type="User" autoMapping="true"/>

结论

在 Mybatis 中,实现将 SQL 执行结果封装为目标对象并返回的过程是通过结果映射来实现的。基于列名的映射和基于属性的映射是最常见的映射方式,可以满足大部分的需求。而嵌套映射可以实现将多个表的数据映射为一个复杂的目标对象。自动映射提供了一种便捷的方式,可以根据列名自动进行映射,但对于复杂的映射关系可能无法满足需求。在实际应用中,根据具体的业务需求选择合适的映射方式,以实现高效、灵活的数据映射。文章来源地址https://www.toymoban.com/news/detail-722674.html

到了这里,关于Mybatis 中如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis处理返回结果集

    1 简单类型输出映射 返回简单基本类型 返回结果需要定义后才能使用简称 eg:resultType=\\\"Admin\\\" 已经定义过别名了,所以就可以使用简称 那么java中其它常用类型简称如何使用?(不使用简称就需要用全类名,eg:java.util.List) 在mybatis底层源码中定义了一些常用的类型的简称 也可以

    2024年02月13日
    浏览(21)
  • java 异步执行代码(先返回结果,后执行代码)

            在用户那,角色那变更后,要更新数据,因为更新要比较长时间,需要先返回结果(2:已接收待执行)。更新结束后,再返回值结果。 (执行结果. 0:执行失败 ; 1:执行成功; 2:已接收待执行) 使用 ExecutorService 异步 加 Thread.sleep(1000 * 10); 就明显看得出差别了。

    2024年02月09日
    浏览(35)
  • java 异步执行代码(先返回结果,后执行代码

            在用户那,角色那变更后,要更新数据,因为更新要比较长时间,需要先返回结果(2:已接收待执行)。更新结束后,再返回值结果。 (执行结果. 0:执行失败 ; 1:执行成功; 2:已接收待执行) 使用 ExecutorService 异步 加 Thread.sleep(1000 * 10); 就明显看得出差别了。

    2024年02月12日
    浏览(27)
  • mybatis模糊查询以及结果封装详解

    创建maven项目:项目结构如图所示 准备数据库表: 准备pom.xml所需的依赖: 编写核心配置文件加载所需要的资源 编写config.xml文件 创建工厂连接数据处理工具SqlSessionUtil.java SqlSessionUtil.java 创建学生实体类对象Student.java 1、添加模糊查询的接口方法:getStudentSname; 2、配置接口方

    2023年04月22日
    浏览(35)
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    博友的需求就是我最大的动力 博友一说话,本狗笑哈哈。 博友要我写啥,我就写啥 。 特来一篇关于 SpringBoot接口返回结果及异常统一处理 ,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好印象不是。项目前后端分离, 规范的数据传输格式,让REST风格的API具有简单

    2024年02月08日
    浏览(33)
  • mybatis查询多个结果返回map--@MapKey使用方法

    目录         介绍  源码分析: 在使用mybatis的时候遇到一种情况,查询结果集返回多个,想用map接收,以前是用List对象接收,然后java代码中转换成map。其实mybatis是支持返回map的。下面就介绍使用方法。 测试代码: 下面@MapKey中的id是BusinessPricePO中的一个属性id,否则会报错

    2024年02月12日
    浏览(27)
  • 使用多线程执行任务,并获取返回结果,附异步实现

    这里创建了一个包含三个线程的固定线程池 线程池的介绍 根据主机情况实现自定义线程池: 也可以通过继承 ThreadPoolExecutor 类来实现一个自定义线程池工具类。ThreadPoolExecutor 是 Java 标准库中提供的一个线程池实现,通过继承它,我们可以实现自定义的线程池。 下面是一个继

    2024年02月16日
    浏览(29)
  • 关于Elasticsearch(es)中使用sql返回结果只有1000条

    es中返回的结果只有1000条,这是默认的,想要返回更多的结果,需要做两步: 1、设置max_result_window的大小 PUT indexName/_settings { “max_result_window”:20000 } max_result_window表示结果的最大数量 但是你这样设置完了之后,查询依旧还是1000条 2、查询的时候加上fetch_size 这表示页面上显

    2024年02月14日
    浏览(29)
  • MyBatis动态SQL、模糊查询与结果映射

    目录 前言 一、MyBatis动态SQL 1.动态SQL是什么 2.动态SQL的作用 3.常用动态SQL元素 1. where + if 元素 2. set + if 元素 3. choose + when + otherwise 元素 4. 自定义 trim 元素  1. 自定义 trim 元素改写上面的 where + if 语句 2. 自定义 trim 元素改写上面的 set + if 语句 5. foreach 元素 6.SQL片段重用 二、

    2024年02月11日
    浏览(29)
  • bat 获取手机SN & 处理adb cmd 返回结果-(For 中执行多条cmd 的用法)

    tips: ①对应的 Notepad++ 的快捷键为 Ctrl+k (单行、多行注释) Ctrl+q (区块注释)         参数作为输出参数时,注意:                 ★函数内不要使用SETLOCAL和ENDLOCAL                 ★此文件不要设置setlocal enabledelayedexpansion  执行结果: 执行结果:

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包