Mybatis中resultMap的使用总结

下面就是关于“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日

相关文章

  • 利用5分钟快速搭建一个springboot项目的全过程

    下面是详细的攻略过程,包括两个示例。 前置条件 在开始搭建 Spring Boot 项目之前,需要确保以下环境已经安装和配置好: Java JDK 8+,可使用 java -version 命令检查 Java 安装情况。 Maven 3.0+,可使用 mvn -v 命令检查 Maven 安装情况。 IntelliJ IDEA(或其他任意一款 IDE) 步骤一…

    Java 2023年5月15日
    00
  • Spring Boot应用程序中如何使用Keycloak详解

    使用Keycloak是为应用程序添加身份验证和授权的一种流行方式。Spring Boot提供了一个快速简便的方式整合Keycloak。本文将会以实例的方式介绍如何在Spring Boot应用程序中使用Keycloak。 准备工作 在开始使用Keycloak前,需要进行以下准备工作: 安装Java SDK和Maven 下载和安装Keycloak 创建Keycl…

    Java 2023年6月3日
    00
  • java 生成xml并转为字符串的方法

    一、Java 生成 XML 的两种方式 Java 可以通过两种方式来生成 XML:DOM 方式和 SAX 方式。DOM 方式使用内存模型来存储 XML 文件,而 SAX 方式则使用事件驱动模式来解析 XML 文件。 DOM 方式 在 DOM 方式下,Java 代码会把整个 XML 文件加载到内存中,在内存模型中修改和操作节点。可以使用标准的 Java DOM…

    Java 2023年5月27日
    00
  • SpringBoot整合Scala构建Web服务的方法

    针对这个问题,我会分为以下几个部分来逐步讲解: SpringBoot整合Scala的基础知识 构建Scala的Web服务 示例说明 总结 接下来,我会一步步讲解每一个部分。 1. SpringBoot整合Scala的基础知识 首先需要介绍Scala语言和SpringBoot框架的基本概念。 Scala是一种面向对象的静态类型编程语言,同时也支持函数式编程,是…

    Java 2023年6月3日
    00
  • jQuery解析XML文件同时动态增加js文件的方法

    首先需要明确的是,jQuery提供了内置的函数来实现解析XML文件和动态增加js文件。下面是详细的操作步骤。 解析XML文件 步骤一:通过ajax方法获取XML数据 使用jQuery的ajax方法,通过URL链接获取XML数据。使用ajax方法时,需要设置dataType为xml。 $.ajax({ url: ‘xml/your_xml_file.xml’,…

    Java 2023年6月15日
    00
  • eclipse创建springboot项目的三种方式总结

    在Eclipse中,我们可以使用以下三种方式来创建Spring Boot项目: 使用Spring Initializr创建项目 使用Eclipse自带的Spring Boot项目向导创建项目 使用Maven或Gradle创建项目 以下是每种方式的详细步骤和示例: 1. 使用Spring Initializr创建项目 步骤 打开Eclipse,选择File -…

    Java 2023年5月14日
    00
  • Midjourney:一步一步教你如何使用 AI 绘画 MJ

    一步一步如何使用 Midjourney 教程:教学怎么用 MJ? 一、Midjourney(MJ)是什么? Midjourney是一款使用文字描述来生成高质量图像的AI绘画工具。这篇文章主要介绍了Midjourney及其用途,并针对Midjourney的使用提供了一些指南。该工具可以帮助人们更快速、更容易地创建图像。 与市场上的其他AI绘画工具相比,Midj…

    Java 2023年4月22日
    00
  • Java中String类常用方法使用详解

    Java中String类常用方法使用详解 String类是什么? String是Java编程语言中表示字符串的类。Java中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因此在已知要修改的字符串的情况下,可以选择使用字符串缓冲区。 常用方法 1. length() 该方法用…

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