resultType与resultMap的使用
需求: resultType与resultMap的使用
一. ============================= 查询订单信息, 关联查询用户信息, 属于 一对一 ================
主表: 订单表
子表: 用户表
对应关系: 订单表-->用户表: 一对一; 用户表-->订单表: 一对多;
1. resultType用于配置sql查询结果与pojo完全相对应的属性(即查询结果对应的列要包括在对应pojo中的属性中)
使用resultType, 如果查询结果的列超出对应pojo的属性, 就要另外定义一个pojo, 用于扩展原来pojo的字段,
比如: 要查询订单, 关联查询订单对应的用户信息.
这是时候就需要定义一个订单的扩展类OrdersCustom:
(1) 因为要映射订单信息, 所以此类要继承Orders类;
(2) 因为还要映射订单之外的关联用户的信息, 所以要在此类中把用户的需要查询的属性添加进来;
对应的xml文件和Mapper接口面对的都是OrdersCustom类, 而不再是Orders类或者Users类
xml:
<id />
<result />
2. 而使用resultMap映射查询结果的时候, 不需要另外定义一个扩展类,
直接在Orders类中添加User对象(即把查询到的用户信息都封装成User对象user之中)
然后在xml中分别配置好订单信息和用户信息即可, 订单信息和resultType一样配置, 用户信息使用association来映射
<resultMap id="resultMap的名字" type="Orders类(主表对应的类)">
<!-- 配置Order属性(略) -->
<!-- 配置User属性 -->
<association property="user" javaType="User类的全类名">
<id column="User表的唯一标识" property="" />
<result column="普通属性列" property="普通属性" />
</association>
</resultMap>
二. =============== 需求: 查询订单信息, 关联查询订单明细信息 , 一对多 ==============
主表: 订单表(Orders)
关联表: 订单明细表(OrderDetail)
关联关系: 订单表-->订单明细: 一对多; 订单明细-->订单表: 一对一
分析:
由于要查询订单信息, 关联查询订单明细信息, 一张订单表对应多条订单明细信息, 所以要在
订单类Order类中添加订单明细类OrderDetail类属性, 而且是一对多, 所以使用List
public class Order {
// 订单信息
private XXX xxx;
......
// 订单明细信息
private List<OrderDetail> orderDetails;
// 对应的setter/getter方法
}
xml文件:
使用collection, 上面的association是对应单条记录(即一个订单对应单个用户), 而collection对应的是多条记录(即一个订单对应多条订单明细)
<resultMap id="" type="">
--------如果xml中已经配置了订单信息和用户信息, 那么在这个resultMap中只需要使用extends继承过来即可----------
<!-- 订单信息 -->
<!-- 用户信息 -->
-------------------------------------------------------------------------------------------------------------------
<!-- 订单明细信息 -->
<collection property="Order类中的订单明细属性orderDetails" ofType="订单明细类的全类名(即List中的POJO的类型)">
<id column="订单明细表的唯一标识(如果没有就需要添加一个唯一标识)" property="对应属性 " />
<result column="" property="" />
</collection>
</resultMap>
三. ========== 多对多, 需求: 查询用户及用户购买的商品=====================================
分析: 由于用户表和商品表之间没有直接关系, 需要使用订单表和订单明细表进行连接, 所以
主表: 用户表User
关联表: 订单表Order, 订单明细表OrderDetail, 商品表Item
映射思路:
1. 将用户信息映射到user中;
2. 在User类中添加订单属性orders, private List<Orders> orderDetails;
3. 在Order类中添加订单明细属性orderDetails, private List<OrderDetail> orderDetails;
4. 在OrderDetail类中添加商品属性item, private Item item;
xml文件:
<resultMap id="resultMap的名字" type="User的全类名">
<!-- 用户信息 -->
<id />
<result />
<!-- 订单信息 -->
<collection>
<id />
<result />
<!-- 订单明细信息 -->
<collection>
<id />
<result />
<!-- 商品信息 -->
<association property="" javaType="">
<id />
<result />
</association>
</collection>
</collection>
</resultMap>
总结:
(1) 使用resultType比使用resultMap简单, 使用场景: 打印订单明细(未来要纸张打印)
(2) resultType不能实现延迟加载, resultMap可以使用延迟加载
(3) 对查询结果又特殊要求就使用resultMap, 比如要求一定要包装到User对象中, 或者一定要延迟加载等等情况
使用场景: 树型菜单, 鼠标点击之后触发js事件然后展示二级菜单明细
(4) 使用resultMap会比较方便的获取到用户信息, 如通过getUser()即可
(5) 使用resultType要自己手动循环遍历取值, 使用resultMap不需要手动遍历
------------------------------------------------------
多对多:
-----------------------------------------------------