下面我将详细讲解MyBatis的Mapper XML中resultMap标签的使用详解。
1. result标签和resultMap标签的区别
在MyBatis中,通过 select
元素的 resultType
或 resultMap
属性指定查询结果的映射方式。其中, 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
标签,但是需要注意一下:
association
标签表示一对一的关系collection
标签表示一对多的关系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>
这样,我们就可以查询用户以及他的所有订单了,orders
是 User
对象中的属性,该属性类型是 List<Order>
。
总结
通过本文,我们了解了 resultMap
标签的基本用法和在多表查询中的应用。实际开发中,如果需要复杂的映射操作,我们可以使用 resultMap
,它能够很好地解决映射问题,并提高代码的可读性和营养性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis的mapper.xml中resultMap标签的使用详解 - Python技术站