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,它能够很好地解决映射问题,并提高代码的可读性和营养性。

阅读剩余 55%

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

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

相关文章

  • Java 把json对象转成map键值对的方法

    将 JSON 对象转换成 Map 对象有两种方法: 1. 使用 Jackson 库 Jackson 是一个流行的 JSON 处理库,它可以轻松地将 JSON 转换成 Java 对象或 Map 对象,反之亦然。可以通过 Maven 或 Gradle 将 Jackson 依赖项添加到项目中: <dependency> <groupId>c…

    Java 2023年5月26日
    00
  • selenium+java破解极验滑动验证码的示例代码

    请见以下攻略: selenium+java破解极验滑动验证码的示例代码攻略 简介 极验滑动验证码是一种常用的图形验证码,它需要用户在滑动拼图的同时,滑块位置与拼图位置匹配,才能完成验证。本篇攻略讲解使用selenium结合java来破解极验滑动验证码,并提供两个示例说明。 准备工作 在使用selenium之前,你需要先下载安装好java sdk和seleni…

    Java 2023年6月15日
    00
  • Java异常 Factory method’sqlSessionFactory’rew exception;ested exception is java.lang.NoSuchMethodError:

    题目中描述的异常信息 “Factory method ‘sqlSessionFactory’ threw exception; nested exception is java.lang.NoSuchMethodError:” 实际上提供了有用的提示信息,可以作为排除问题的起点。异常信息中的 “Factory method ‘sqlSessionFactor…

    Java 2023年5月27日
    00
  • 详解Spring Boot Security工作流程

    下面我将详细讲解 Spring Boot Security 工作流程的完整攻略。 一、什么是 Spring Boot Security Spring Boot Security 基于 Spring Security,是一款用于 Spring Boot 应用程序的 Spring Security 扩展。它提供了一些便捷的方式来配置和使用 Spring Secu…

    Java 2023年5月19日
    00
  • Spring与Dubbo搭建一个简单的分布式详情

    Spring和Dubbo的组合是搭建分布式应用程序的常用方案之一。在此提供一个完整的攻略,来帮助你搭建一个简单的分布式系统。 步骤一:创建Dubbo服务提供者 1.1 首先,需要创建一个Dubbo服务提供者。这个提供者将会接收来自客户端的请求,并返回响应结果。下面是一个简单的示例代码: @Service @DubboService public class …

    Java 2023年5月31日
    00
  • Java代码中4种字符串拼接方式分析

    Java代码中4种字符串拼接方式分析 在Java开发中,我们经常需要进行字符串的拼接操作。本文将详细介绍Java代码中的4种字符串拼接方式,包括StringBuilder、StringBuffer、String.format()和”+”拼接方式,并分析它们之间的优缺点。 1. StringBuilder StringBuilder是一个可变的字符串类,它提供…

    Java 2023年5月26日
    00
  • c#深拷贝文件夹示例

    当我们需要复制文件夹时,常见的方法是使用递归方式逐一复制文件夹下的所有文件和子文件夹。但是,这种简单的复制方式只是浅拷贝,也就是说,它只是复制了指向文件和文件夹的引用,并没有复制实际的数据。也就是说,如果原始文件夹中的文件被更改或删除,那么复制后的文件夹也会受到影响。这时,我们需要使用深拷贝的方式,即真正地复制文件和文件夹的数据,使得复制后的文件夹与原始文件…

    Java 2023年5月19日
    00
  • Java Mybatis框架由浅入深全解析上篇

    Java Mybatis框架由浅入深全解析上篇 介绍 Java Mybatis框架是一个基于Java语言的数据映射框架,它是一种半自动化的ORM框架,通过XML配置文件或注解的方式将Java对象与数据库进行映射。 Mybatis的基本结构 Mybatis的基本结构包括四个部分: Configuration(配置类):读取mybatis配置文件中的信息,生成全…

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