开篇
在《mybatis的配置文件学习》中已经接触到了resultMap的用法,sql查询出来的列名和pojo的属性名不一致则无法映射,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系就可以解决该的问题,博客中提到的是简单属性,那么如果在返回的结果中包括对象类型或对象类型的集合使用resultMap应该如何映射呢?而使用resultType是否能够实现呢?
正文
使用resultMap的实例映射单个或多个对象集合的实例。
Pojo
订单:做以下两个不同的测试user和orderdetails属性对应的注释掉一个。
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
//订单明细
private List<Orderdetail> orderdetails;
}
用户:
public class User {
//属性名和数据库表的字段对应
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
}
一对一:关联查询到的单个对象:
需求说明:查询订单信息,关联查询创建订单的用户信息,一个订单只能属于一个用户
Mapper.xml
resulMap映射单个pojo对象,使用的是association
<!-- 订单查询关联用户的resultMap
将整个查询的结果映射到cn.itcast.mybatis.po.Orders中-->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
<!-- 配置映射的订单信息 -->
<!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
column:订单信息的唯 一标识 列
property:订单信息的唯 一标识 列所映射到Orders中哪个属性-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property=note/>
<!-- 配置映射的关联的用户信息 -->
<!-- association:用于映射 关联查询单个对象的信息
property:要将关联查询的用户信息映射到Orders中哪个属性-->
<association property="user" javaType="cn.itcast.mybatis.po.User">
<!-- id:关联查询用户的唯 一标识
column:指定唯 一标识用户信息的列
javaType:映射到user的哪个属性-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
使用resultMap的statement
<!-- 查询订单关联查询用户信息,使用resultmap -->
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
一对多:关联查询到多条记录映射到集合对象:
需求说明:查询订单信息,关联查询该条订单的多条详细信息,一个订单可以包括多个商品,所以可以包括多条详细信息
Mapper.xml
resulMap映射多个pojo对象的集合,使用的是collection
<!-- 订单及订单明细的resultMap
-->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" >
<!-- 订单信息 -->
<!-- 配置映射的订单信息 -->
<!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
column:订单信息的唯 一标识 列
property:订单信息的唯 一标识 列所映射到Orders中哪个属性-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property=note/>
<!-- 订单明细信息
一个订单关联查询出了多条明细,要使用collection进行映射
collection:对关联查询到多条记录映射到集合对象中
property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
ofType:指定映射到list集合属性中pojo的类型
-->
<collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
<!-- id:订单明细唯 一标识
property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性
-->
<id column="orderdetail_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>
</collection>
</resultMap>
结果:
使用resultType实现:
查询订单信息,关联查询创建订单的用户信息
第一步:建立扩展pojo类,该类继承orders类,同时将sql查到的用户名、性别、地址作为扩展属性添加。
//通过此类映射订单和用户查询的结果,让此类继承包括 字段较多的pojo类
public class OrdersCustom extends Orders{
//添加用户属性
private String username;
private String sex;
private String address;
}
第二步:编写mapper.xml文件,和之前使用的相同
<select id="findOrdersUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
resultType使用比较简单,但是无法映射出pojo对象,也无法映射出pojo对象的list集合。结果如下:
总结
resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
resultMap:
作用:使用association和collection完成一对一和一对多的高级映射。
两者都可以完成一对一、一对多的查询,只是返回的结果不同,我们可以根据自己的需求确定到底使用哪个。例如同样是查询订单信息,关联查询创建订单的用户信息需求,如果返回的数据是在页面上进行展示,我们就没有必要使用resultMap将user的相关信息包装到user对象中,这样使用的使用需要先拿到user对象然后获取属性中的值,如果使用resultType就可以直接遍历结果获得user相关信息在页面上进行展示。