其他分享
首页 > 其他分享> > Mybatis的ResultMap和ResultType的区别

Mybatis的ResultMap和ResultType的区别

作者:互联网

在使用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