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

Mybatis的ResultMap和ResultType的区别

时间:2022-09-04 14:35:24浏览次数:78  
标签: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
From: https://www.cnblogs.com/javaxubo/p/16655060.html

相关文章

  • SpringBoot+mybatis项目 配置控制台打印sql语句
    @SpringBoot+mybatis项目配置控制台打印sql语句前几天在做项目的过程中,使用的持久层框架是mybatis,在mapper.xml中自己写sql,当时写完了自己的业务代码,测试时候一直觉得数......
  • mybatis的面试问题以及基础知识
    1.什么是映射,mybatis中的映射指的是什么?映射:人的身份证号唯一对应的唯一的人的性命,也就是通过特定的存在的关系将A和B一一对应,这就是映射,在计算机中,计算机只会听懂0和1,我......
  • Mybatis
    1、概述MyBatis是一款优秀的持久层框架MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程MyBatis可以使用简单的XML或注解来配置和映射......
  • MybatisPlus笔记
    MyBatis-PlusMyBatis-Plus概述需要基础:学习过Spring、SpringMVC、Mybatis为什么要学习它呢?MyBatisPlus可以节省我们大量的工作时间,所有的CRUD代码都可以自动化完成!JPA......
  • MybatisPlus笔记
    MyBatis-PlusMyBatis-Plus概述需要基础:学习过Spring、SpringMVC、Mybatis为什么要学习它呢?MyBatisPlus可以节省我们大量的工作时间,所有的CRUD代码都可以自动化完成!JPA......
  • mybatis-plus-generator 配置不生成 entity, controller, mapper 等
    3.5.2版本有需求不生成controller于是baidu发现如下方法.templateConfig(builder->builder.controller(""))配置后确实不生成controller 又有需求不生成entit......
  • Mybatis笔记
    Mybatis1、Mybatis简介1.1什么是Mybatis如何获得Mybatismaven仓库:<!--https://mvnrepository.com/artifact/org.mybatis/mybatis-->    <dependency> ......
  • MyBatis-分页插件
    分页插件的使用步骤1.添加依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId>......
  • Mybatis都有哪些Executor执行器?区别是什么?
     三种,SimpleExecutor,ReuseExecutor,BatchExecutor.SimpleExecutor:每执行一次update/select,开启一个statement对象,用完立刻关闭。ReuseExecutor:执行update/select,......
  • mybatis collection嵌套集合
    业务场景:商户集合嵌套卡券集合  JAVA代码:@DatapublicclassUserMerchantCardVo{/**商户名称*/privateStringmerchantName;/**商户地址*/......