Mybatis中resultMap的使用总结

yizhihongxing

下面就是关于“Mybatis中resultMap的使用总结”的详细攻略。

什么是resultMap

resultMap是MyBatis中比较重要的一个元素,可以自定义SQL返回结果。通过定义resultMap,我们可以灵活的控制与定制查询结果,使结果集可以和我们Java对象相映射。

resultMap是一个描述如何从JDBCResultSet中加载数据的规则集,它会告诉MyBatis如何映射结果集中的列到对象的属性。

resultMap的使用

1. resultMap的定义

resultMap的定义包含以下属性:

  • id:唯一标识resultMap,方便其他select语句引用
  • type:映射到的java类型,可以是基本类型、自定义类型或Map类型
  • extends:父类resultMap的引用
  • autoMapping:是否启用自动映射(默认为false)
  <resultMap id="personResultMap" type="com.example.PersonDO" autoMapping="true">
      <!-- 表中的字段名和Java类的属性名对应关系 -->
      <id property="id" column="id" />
      <result property="name" column="person_name" />
      <result property="age" column="person_age" />
  </resultMap>

2. resultMap的引用

在select语句中直接使用

  <select id="selectPersonList" resultMap="personResultMap">
    select id, person_name, person_age from person where id = #{id}
  </select>

在其他resultMap中使用(继承)

  <resultMap id="detailedPersonResultMap" type="com.example.DetailedPersonDO" extends="personResultMap">
      <!-- 表中的字段名和Java类的属性名对应关系 -->
      <result property="phone" column="person_phone" />
      <result property="email" column="person_email" />
  </resultMap>

3. 嵌套resultMap

resultMap可以嵌套,例如一个Person类中有多个Address,可以将Address的映射放在另一个resultMap中,然后在Person的resultMap中引用。

  <resultMap id="personResultMap" type="com.example.PersonDO" autoMapping="true">
      <id property="id" column="id" />
      <result property="name" column="person_name" />
      <result property="age" column="person_age" />
      <!-- 嵌套的Address resultMap -->
      <collection property="addressList" ofType="com.example.AddressDO" resultMap="addressResultMap"/>
  </resultMap>

  <resultMap id="addressResultMap" type="com.example.AddressDO">
      <id property="id" column="id" />
      <result property="province" column="address_province" />
      <result property="city" column="address_city" />
      <result property="street" column="address_street" />
  </resultMap>

  <select id="selectPersonList" resultMap="personResultMap">
    select p.id, p.person_name, p.person_age, a.id as address_id, a.address_province, a.address_city, a.address_street 
    from person p 
    left join address a on p.id = a.person_id
    where p.id = #{id}
  </select>

示例1:使用resultMap返回关联表查询结果

例如Person类和Address类都对应数据库中的表,表结构如下:

  • person表(id, person_name, person_age)
  • address表(id, person_id, address_province, address_city, address_street)

针对Person和Address表做关联查询,使用resultMap返回结果。

定义Person和AddressDO:

public class PersonDO {
    private Integer id;
    private String name;
    private Integer age;
    private List<AddressDO> addressList;
}
public class AddressDO {
    private Integer id;
    private Integer personId;
    private String province;
    private String city;
    private String street;
}

在xml中定义resultMap:

  <resultMap id="personResultMap" type="com.example.PersonDO">
      <id property="id" column="id" />
      <result property="name" column="person_name" />
      <result property="age" column="person_age" />
      <collection property="addressList" ofType="com.example.AddressDO" resultMap="addressResultMap"/>
  </resultMap>

  <resultMap id="addressResultMap" type="com.example.AddressDO">
      <id property="id" column="id" />
      <result property="personId" column="person_id" />
      <result property="province" column="address_province" />
      <result property="city" column="address_city" />
      <result property="street" column="address_street" />
  </resultMap>

定义select语句:

  <select id="selectPersonList" resultMap="personResultMap">
      select p.id, p.person_name, p.person_age, a.id as address_id, a.person_id, a.address_province, a.address_city, a.address_street 
      from person p 
      left join address a on p.id = a.person_id
      where p.id = #{id}
  </select>

查询结果会按照resultMap的映射规则返回PersonDO实例,其中包含了多个AddressDO实例,这些AddressDO实例被封装为List集合并设置到PersonDO实例的addressList属性。

示例2:使用resultMap对结果做类型转换

例如数据库中存储时间的字段都是datetime类型,但是Java中可能需要用LocalDateTime表示时间类型,可以通过resultMap对SQL查询结果进行类型转换。

定义PersonDO:

public class PersonDO {
    private Integer id;
    private String name;
    private Integer age;
    private LocalDateTime createTime;
}

在xml中定义resultMap:

  <resultMap id="personTimeResultMap" type="com.example.PersonDO">
      <id property="id" column="id" />
      <result property="name" column="person_name" />
      <result property="age" column="person_age" />
      <!-- 使用typeHandler实现类型转换 -->
      <result property="createTime" column="person_create_time" 
              typeHandler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
  </resultMap>

定义select语句:

  <select id="selectPersonTime" resultMap="personTimeResultMap">
      select id, person_name, person_age, person_create_time from person where id = #{id}
  </select>

查询结果会按照resultMap的映射规则返回PersonDO实例,其中createTime属性会被MyBatis自动使用注册的typeHandler进行类型转换封装为LocalDateTime类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis中resultMap的使用总结 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java文件上传与文件下载实现方法详解

    下面将详细讲解Java文件上传与文件下载实现方法详解,分为以下几个方面: 文件上传 文件上传通常需要以下几个步骤: 创建一个表单,允许用户选择要上传的文件; 通过后端编写的处理程序处理上传的文件; 将文件保存到服务器的指定位置。 下面使用Spring Boot框架和Thymeleaf模板实现文件上传。 首先,在Spring Boot中,我们需要添加Multi…

    Java 2023年5月20日
    00
  • Java8 将List转换为用逗号隔开的字符串的多种方法

    让我来详细讲解一下Java8将List转换为用逗号隔开的字符串的多种方法。 方法一:使用String.join()方法 使用String.join()方法是将List转换为用逗号隔开的字符串最为简单的方法之一。该方法java8中引入,允许我们将字符串列表连接起来,用指定的分隔符分隔。 示例代码如下: List<String> list = Arr…

    Java 2023年5月20日
    00
  • python实现数独算法实例

    python实现数独算法实例 介绍 数独是一种流行的逻辑游戏,也是计算机科学中常见的算法和数据结构问题。本文将介绍基于python实现数独算法的完整攻略。 算法原理 数独算法的原理可以归纳为两部分: 约束传播(Constraint Propagation)——基于已知的数推断未知的数; 回溯(Backtracking)——在没有更多的约束传播时,回溯到之前的…

    Java 2023年5月30日
    00
  • JS中表单的使用小结

    JS中表单的使用小结 在前端开发中,表单是不可避免的一个环节。HTML和CSS提供了表单的基本结构和样式,而JS可以用来处理表单中的数据和提交操作。在本文章中,将对JS中表单的使用做一个小结,并分享一些示例代码。 表单的基本结构 表单的基本结构包括form、input等元素,如下所示: <form> <label> 用户名:<i…

    Java 2023年5月26日
    00
  • Java多线程阻塞与唤醒代码示例

    下面是Java多线程阻塞与唤醒代码示例的完整攻略。 前置知识 在开始讲解Java多线程阻塞与唤醒代码示例之前,需要掌握以下知识点: 多线程的概念与基本操作,如创建线程、线程同步等; 线程阻塞与唤醒的概念与使用方法,如wait()、notify()、notifyAll()等; 线程状态的概念与使用,如Thread.State等。 示例一:生产者与消费者问题 生…

    Java 2023年5月19日
    00
  • Java中Arrays类与Math类详解

    Java中Arrays类与Math类详解 在Java中,Arrays类和Math类是常用的工具类,主要提供了一些静态方法来方便我们进行数组、数值计算等操作。 Arrays类 Arrays类提供了很多有用的方法来进行数组的操作,包括数组的排序、查找、复制等。 数组排序 排序算法 Arrays类中提供了sort()方法来对数组进行排序,在方法中我们可以通过传入C…

    Java 2023年5月26日
    00
  • SpringBoot用JdbcTemplates操作Mysql实例代码详解

    下面我将详细讲解“SpringBoot用JdbcTemplates操作Mysql实例代码详解”的完整攻略,包括示例说明。 介绍 Spring Boot是一个快速搭建基于Spring框架的应用程序的开发框架。它简化了许多开发任务,使得开发人员可以快速构建并启动应用程序。在Spring Boot中,JDBC是一种常用的访问关系数据库的方法。当使用Spring B…

    Java 2023年5月20日
    00
  • Java操作IO对象流进行数据的读写

    针对Java操作IO(输入/输出)对象流进行数据的读写,一般包括以下的几个步骤: 创建IO对象流(如FileInputStream、FileOutputStream等)以及处理器流(如InputStreamReader、OutputStreamWriter等) 读、写或处理流中读写的数据(如读文本文件、写二进制文件等) 关闭流以释放资源,避免内存泄漏 具体步…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部