mybatis的mapper.xml中resultMap标签的使用详解

下面我将详细讲解MyBatis的Mapper XML中resultMap标签的使用详解。

1. result标签和resultMap标签的区别

在MyBatis中,通过 select 元素的 resultTyperesultMap 属性指定查询结果的映射方式。其中, resultType 属性可通过 JavaBean 对象或基本数据类型指定映射方式,它不需要你在 XML 中写出,这里就不再详细讲解。现在我们关注一下 resultMap 属性。

resultMap 可以理解为“结果映射”,它作为 select 元素的属性之一,表示该查询的结果集的映射方式。这里的“映射方式”不仅仅是指把查询结果的列名映射到 JavaBean 对象的属性名,还包括一些其他的处理,比如类型转换、关联对象的加载等等。

resultMap 属性有两种形式:一种是直接指定 resultMap 属性值为 resultMap 元素的 id 值,此种方式会将 resultMap 元素的内容应用到该 select 元素中;另外一种是直接在 select 元素中定义 resultMap 标签,可以看做是 resultType 和 resultMap 的混合用法,此种情况下, resultMap 标签只会应用到当前的 select 元素中。

resultMap 通常是定义在 Mapper.xml 中的,它可以对查询结果进行复杂的映射操作,包括一些高级映射,比如继承映射、关联映射等。

resultMap 标签对应的还有一个 result 标签,两者都是用来进行映射的,但是它们的用法和作用有所不同。resultMap 标签通常比 result 标签使用更加灵活,而且可以映射复杂类型。

重要区分:result 标签仅用于单个元素的映射,比如 <result column=”id” property=”id”/> 定义,它将结果集的 id 列赋值到 JavaBean 的 id 属性中。而 resultMap 标签与 select 元素的查询结果一一对应,可以创建对象,并将多个列映射到单个对象的属性上,也可以使用元素的嵌套字符创来映射一个对象的多个属性,是与 select 元素关联的。

2. resultMap的基本使用

下面,我将介绍resultMap的基本用法。假设我们有以下表:

user(id, name, age, email)

它映射到 JavaBean 的属性是:

id -> id
name -> name
age -> age
email -> email

可以通过下面的 resultMap 定义将查询结果映射成 User 对象:

<resultMap id="userMap" type="User">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="age" property="age"/>
  <result column="email" property="email"/>
</resultMap>

select 元素中指定该 resultMap

<select id="getUser" parameterType="int" resultMap="userMap">
  SELECT * FROM user WHERE id = #{id}
</select>

这里的 userMap 是上面定义的 resultMap。这样,就可以将查询结果映射成 User 对象了。

3.映射嵌套结果

有时查询的结果不仅仅是一个对象,也可以是多个对象,甚至可以嵌套映射。下面是一个例子,我们有以下两个表:

1. user(id, name, age, email)
2. order(id, order_no, user_id)

这个时候,我们需要查询一个用户以及他的所有订单,这样的结果需要映射成一个 User 对象,其中包含许多 Order 对象。这里我们依然使用 resultMap 标签,但是需要注意一下:

  1. association 标签表示一对一的关系
  2. collection 标签表示一对多的关系
  3. select 标签用于关联查询
<resultMap id="userOrderMap" type="User">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="age" property="age"/>
  <result column="email" property="email"/>
  <collection property="orders" ofType="Order">
    <id column="id" property="id"/>
    <result column="order_no" property="orderNo"/>
    <result column="user_id" property="userId"/>
    <association property="user" resultMap="userMap">
      <select id="getUser" parameterType="int" resultMap="userMap">
        SELECT * FROM user WHERE id = #{userId}
      </select>
    </association>
  </collection>
</resultMap>

这里的 association 标签表示 Order 对象中的 User 对象,collection 标签表示 User 对象中的 Order 对象集合。同时,我们可以使用 select 标签关联查询用户信息。

最后,我们在 select 元素中指定该 resultMap

<select id="getUserOrder" parameterType="int" resultMap="userOrderMap">
  SELECT * FROM user WHERE id = #{id}
</select>

这样,我们就可以查询用户以及他的所有订单了,ordersUser 对象中的属性,该属性类型是 List<Order>

总结

通过本文,我们了解了 resultMap 标签的基本用法和在多表查询中的应用。实际开发中,如果需要复杂的映射操作,我们可以使用 resultMap,它能够很好地解决映射问题,并提高代码的可读性和营养性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis的mapper.xml中resultMap标签的使用详解 - Python技术站

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

相关文章

  • spring启动后保证创建的对象不被垃圾回收器回收

    确保spring创建的对象不被垃圾回收器回收需要明白spring是如何管理bean的。bean是指spring容器中的对象,它们都有自己的生命周期,spring对bean的管理保证了bean在合适的时间被创建并放入容器中,并在合适的时间被销毁。因此,在合适的时机,spring 将会自动为 bean 进行垃圾回收。但是,如果我们不想让被 spring 管理的 …

    Java 2023年5月19日
    00
  • Java程序中的延迟加载功能使用

    Java程序中延迟加载指的是在运行时不立即加载所有需要的类和资源,而是在需要时再进行加载,节省了内存使用,提高了程序的运行效率。常见的延迟加载方式主要有“懒加载”和“通过接口来实现延迟加载”的方式。下面就分别介绍这两种方法的使用。 懒加载实现 懒加载概念 懒加载(Lazy Loading),也称为延迟加载,是指实例在第一次使用时才会被创建,或者在需要使用的时…

    Java 2023年5月20日
    00
  • spring boot的健康检查HealthIndicators实战

    下面我将详细讲解关于 “spring boot的健康检查HealthIndicators实战” 的完整攻略: 1. 什么是 HealthIndicators HealthIndicators 是 Spring Boot 中提供的健康检查指示器,可以通过实现 HealthIndicator 接口并返回一个 Health 对象来表示应用程序的健康状态。Healt…

    Java 2023年5月20日
    00
  • Hibernate分页的两种实现方法

    Hibernate是目前最为流行的ORM框架之一,提供了非常便捷的持久化操作,而在实际应用中,我们经常需要对数据进行分页,以免一次性将所有数据全部加载到内存中,影响系统性能。那么Hibernate分页的实现方法有哪些呢?接下来我将详细阐述两种实现方法,其中一种是使用Criteria API的方式,另一种是使用SQL语句的方式。 使用Criteria API实…

    Java 2023年5月20日
    00
  • Java Filter过滤器的使用教程

    Java Filter过滤器的使用教程 Java Filter是Servlet规范提供的一种过滤器机制,用于在Servlet请求和响应之前对请求进行过滤和处理。Filter的使用可以提高Web应用程序的安全性和性能。在本文中,我们将详细讲解Java Filter的使用教程。 Filter过滤器的基本概念 Filter是Servlet中的一种过滤器机制,主要用…

    Java 2023年6月15日
    00
  • 一文带你掌握Java中Scanner类的使用

    一文带你掌握Java中Scanner类的使用 Scanner类是Java中很常用的一个类,它可以读取用户在控制台上的输入数据。在处理用户输入数据的时候,使用Scanner类可以大大简化代码,并且提高开发效率。本文将详细介绍Scanner类的使用方法,包括Scanner类的创建、读取不同数据类型、异常处理等内容,希望能帮助Java初学者快速掌握Scanner类…

    Java 2023年5月26日
    00
  • SpringBoot中如何统一接口返回与全局异常处理详解

    下面我将从以下三个方面来详细讲解Spring Boot如何统一接口返回以及全局异常处理: 统一接口返回 全局异常处理 示例说明 1. 统一接口返回 在Spring Boot中,我们可以通过统一定义返回结果的数据类型,并在结果中包含状态码、消息提示和返回数据来实现统一接口返回。下面是一个示例实现: @Data public class Result<T&…

    Java 2023年5月25日
    00
  • Java编译器用maven打war包出错解决办法

    下面是详细讲解“Java编译器用maven打war包出错解决办法”的完整攻略。 问题描述 当使用Java编译器用maven打war包时,有时会遇到错误,例如“Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile)…

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