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日

相关文章

  • SSM框架JSP使用Layui实现layer弹出层效果

    这里是关于SSM框架JSP使用Layui实现layer弹出层效果的完整攻略。 1. 前置知识 SSM框架的基本概念和使用方法 JSP页面的基本语法和编写方法 Layui的基本概念和使用方法 layer弹出层的基本概念和使用方法 2. 实现步骤 步骤1:引入Layui和layer的相关资源 在JSP页面中引入Layui和layer的相关资源,包括CSS和JS文…

    Java 2023年6月15日
    00
  • 基于SSM框架实现简单的登录注册的示例代码

    下面为您详细讲解“基于SSM框架实现简单的登录注册的示例代码”的完整攻略。 1. 环境准备 在实现基于SSM框架的登录注册功能之前,我们需要先准备好以下环境: JDK1.8及以上版本。 Maven:用于管理依赖、打包、发布等工作。 IntelliJ IDEA:一款智能、高效、集成化的开发工具。 MySQL数据库:作为本示例的数据存储介质。 2. SSM框架搭…

    Java 2023年6月15日
    00
  • Springboot Thymeleaf模板文件调用Java类静态方法

    当我们在开发使用Spring Boot框架搭建的Web应用程序时,遇到调用Java类的静态方法的需求时,我们可以通过Thymeleaf模板引擎实现。 Thymeleaf是一种能够处理服务器和客户端模板的Java模板引擎,它能够将HTML模板与数据模型结合起来,生成最终的HTML页面。因此,我们可以在HTML模板文件中调用Java类的静态方法,从而获得更加灵活…

    Java 2023年5月31日
    00
  • Java实现学生成绩输出到磁盘文件的方法详解

    Java实现学生成绩输出到磁盘文件的方法详解 在Java中,实现学生成绩输出到磁盘文件可以分为以下三个步骤: 创建一个磁盘文件对象。 将学生成绩数据写入文件。 关闭文件。 创建一个磁盘文件对象 要创建一个文件对象,在Java中有两种方法:使用File类或Path类。这里以File类为例。 // 引入File类 import java.io.File; // …

    Java 2023年5月27日
    00
  • 解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题

    当使用SpringMVC的MultipartFile上传文件时,可以使用MultipartFile的transferTo(dest)方法将文件保存到指定位置。但是,有时在调用此方法时可能会遇到java.io.FileNotFoundException: xxx不存在异常。这通常是因为在使用transferTo(dest)方法时,目标文件的路径指定不正确,或者…

    Java 2023年5月19日
    00
  • Spring boot中使用Spring-data-jpa方便快捷的访问数据库(推荐)

    使用Spring Boot和Spring Data JPA,可以方便地进行数据库访问,减少了繁琐的配置和代码编写,使开发变得更加简单和高效。 下面是使用Spring Boot和Spring Data JPA的完整攻略,包含两个示例。 1.引入依赖和配置 首先需要在项目的pom.xml文件中添加Spring Data JPA和数据库驱动的依赖。 <dep…

    Java 2023年5月20日
    00
  • Spring Boot超详细分析启动流程

    以下是“Spring Boot超详细分析启动流程”的完整攻略: 目录 准备工作 Spring Boot 启动流程分析 自定义启动流程 示例1:加载自定义配置文件 示例2:自定义Banner 准备工作 在分析 Spring Boot 启动流程之前,我们需要先了解几个基本概念: SpringApplicationBuilder:Spring Boot 启动入口,…

    Java 2023年5月15日
    00
  • SpringSecurity oAuth2.0的四种模式(小结)

    SpringSecurity OAuth2.0的四种模式 SpringSecurity OAuth2.0提供了四种授权模式,分别是Authorization Code、Implicit、Resource Owner Password Credentials和Client Credentials。下面将分别对这四种授权模式进行详细讲解。 Authorizati…

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