【Mybatis】——ResultMap学习

来源:互联网 发布:网络客户服务的优势有 编辑:程序博客网 时间:2024/06/01 09:49

开篇

在《mybatis的配置文件学习》中已经接触到了resultMap的用法,sql查询出来的列名和pojo的属性名不一致则无法映射,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系就可以解决该的问题,博客中提到的是简单属性,那么如果在返回的结果中包括对象类型或对象类型的集合使用resultMap应该如何映射呢?而使用resultType是否能够实现呢?

正文

使用resultMap的实例映射单个或多个对象集合的实例。

Pojo

订单:做以下两个不同的测试userorderdetails属性对应的注释掉一个。

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:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个idcolumn:订单信息的唯 一标识 列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>

使用resultMapstatement

<!-- 查询订单关联查询用户信息,使用resultmap --><select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">SELECTorders.*,USER.username,USER.sex,USER.addressFROMorders,USERWHERE orders.user_id = user.id</select>

一对多:关联查询到多条记录映射到集合对象:

需求说明:查询订单信息,关联查询该条订单的多条详细信息,一个订单可以包括多个商品,所以可以包括多条详细信息

Mapper.xml

resulMap映射多个pojo对象的集合,使用的是collection

<!-- 订单及订单明细的resultMap --><resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" ><!-- 订单信息 --><!-- 配置映射的订单信息 --><!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个idcolumn:订单信息的唯 一标识 列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">SELECTorders.*,USER.username,USER.sex,USER.addressFROMorders,USERWHERE orders.user_id = user.id</select>


resultType使用比较简单,但是无法映射出pojo对象,也无法映射出pojo对象的list集合。结果如下:


 

 

 

总结

resultType

作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。

resultMap

作用:使用associationcollection完成一对一和一对多的高级映射。

 

两者都可以完成一对一、一对多的查询,只是返回的结果不同,我们可以根据自己的需求确定到底使用哪个。例如同样是查询订单信息,关联查询创建订单的用户信息需求,如果返回的数据是在页面上进行展示,我们就没有必要使用resultMapuser的相关信息包装到user对象中,这样使用的使用需要先拿到user对象然后获取属性中的值,如果使用resultType就可以直接遍历结果获得user相关信息在页面上进行展示。

0 0
原创粉丝点击