【Mybatis】——ResultMap学习

开篇

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

使用resultMapstatement

<!-- 查询订单关联查询用户信息,使用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

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

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
MyBatis中,resultMap是用于自定义查询结果映射的一种方式。它可以通过指定字段名和属性名的对应关系来进行映射,并且可以选择性地指定要显示的列。使用resultMap可以实现更加灵活和定制化的结果映射操作。 需要注意的是,在使用resultMap时,字段名和属性名需要保持一致,这样才能进行自动映射匹配。在默认映射级别下,即使没有显式地进行属性名和字段名的匹配,只要字段名和属性名一致,就可以在后台获取到未匹配过的属性值。但是如果字段名和属性名不一致,并且在resultMap中也没有进行映射,那么就无法在后台获取并输出未匹配的属性值。 总结来说,resultMapMyBatis中用于自定义查询结果映射的一种机制,可以灵活地进行字段和属性的映射,提供了更多的定制化选项。在使用resultMap时,需要注意字段名和属性名的一致性,以及在需要自动映射未匹配属性值的情况下,进行相应的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *3* *4* [MyBatisresultMap详解](https://blog.csdn.net/weixin_49707895/article/details/109564527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值