ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis的ResultMap和ResultType的区别

2022-09-04 14:30:09  阅读:218  来源: 互联网

标签:resultType ResultMap pojo 查询 ResultType resultMap Mybatis


在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解

resultType:当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。

因此对于单表查询的话用resultType是最合适的。但是,如果在写pojo时,不想用数据库表中定义的字段名称,也是可以使用resultMap进行处理对应的。多表连接查询时,若是一对一的连接查询,那么需要新建一个pojo,pojo中包括两个表中需要查询出的所有的字段,这个地方的处理方式通常为创建一个继承一个表字段的pojo,再在里面添加另外一个表内需要查询出的字段即可。若是一对多查询时,若是使用内连接查询,则很可能出现查询出的字段有重复。使用双重for循环嵌套处理即可。

resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。

<!-- 订单查询关联用户的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"/>     
   </resultMap> 

resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用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> 

若是一对多的表连接方式,比如订单表和订单明细表即为一对多连接,若是不对sql语句进行处理,由于一个订单对应多条订单明细,因此查询出的结果对于订单表数据来说将会出现重复,例如:

resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性,在mapper.xml中采用如下的处理方式:

<!-- 订单及订单明细的resultMap 
 使用extends继承,不用在中配置订单信息和用户信息的映射 
  --> 
 <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"> 
   <!-- 订单信息 --> 
   <!-- 用户信息 --> 
   <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 --> 
    
    
​    <!-- 订单明细信息 
​    一个订单关联查询出了多条明细,要使用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> 

在查询时,虽然一条订单信息对应多条订单明细,由于将多条信息明细存储到了list中,因此查询后将不再出现重复数据,达到了去重的效果

参考2

ResultMap和ResultType是什么?

官方文档说明:

ResultType: 期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。

ResultMap: 对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。

白话文说明:

ResultMapResultType都是用于设置mybatis增删改查后返回的数据类型。那么什么时候用ResultMap,什么时候用ResultType呢?

  1. 如果你搜索只是返回一个值,比如说String ,或者是int,那你直接用resultType就行了。

例如:

//dao中的接口   
int countArticleThumbs();
//xml对应的
<select id ="countArticleThumbs" ResultType="int">
  select count(*) from thumbs;
</select>

该SQL返回的是int型,那么ResultType定义成int型即可直接与Java进行绑定(基本数据类型默认可不写)。

\2. 但是你如果是返回一个复杂的对象,就可以使用ResultMap(当然ResultType也是可以的)。

例如:

创建User 对象, 拥有两个字段id,userName。

//dao中的接口
User queryUser(String id);

  <resultMap id="User" type="com.ssbm.ccapp.model.app.Usre">
    <result column="user_name" jdbcType="VARCHAR" property="userName" />
  </resultMap>
  
<!--文章点赞数+1-->
 <select id="queryUser" resultMap="User">
     select * from user where id = #{id}
 </select>

从代码中可以清晰的看出,resultMap可以对返回的参数进行配置,mybatis可以进行驼峰自动转换(默认是关闭的,开启该配置的操作看mybatis操作手册--mybatis - MyBatis 3),当数据库字段和Java对象字段不满足驼峰(列名不匹配),可以通过resultMap这里来配置,进行字段匹配。

标签:resultType,ResultMap,pojo,查询,ResultType,resultMap,Mybatis
来源: https://www.cnblogs.com/javaxubo/p/16655060.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有