Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ResultMap与ResultType的区别

ResultMap与ResultType的区别

作者头像
萌萌哒的瓤瓤
发布于 2021-01-13 09:53:08
发布于 2021-01-13 09:53:08
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

养成习惯,先赞后看!!!

两者的区别主要就是在返回类型上.

在mybatis中我们可能返回的数据类型主要就是下面这两种:

  • 单个集合----ResultType,ResultMap
  • 多重集合----ResultMap

那么什么样的数据才叫单个集合,什么样的数据才叫多重集合呢?我们通过下面两张图,大家就能理解了:

单个集合:

多重集合:

看完上面两张图大家就能基本知道他们的差别了,那么他们俩的具体使用场景又是怎样的呢?

举两个例子大家就懂了

获取所有用户的数据 的时候显然我们只需要获得用户信息即可了,并不需要在获取其他额外的数据.

但是在 进行用户的角色校验 的时候,显然我们不仅需要获得该用户的相关信息,其次我们还需要获得该用户的角色信息,那么显然我们返回的数据就不能只包含用户信息,所以我们必须将数据封装成上述多重集合的形式,这样才能方便我们进行角色的校验.

了解完上面的概念之后,大家基本就了解了他们两者的区别了,但是大家又要问了,上面你说 ResultMap既能用于单个集合,又能用于多重集合,那么我们为什么不全是用ResultMap呢?还要使用ResultType呢?

这里主要是因为ResultType虽然只针对单个集合,但是他是可以直接调用我们已经编写好的实体类的,但是ResultMap则不同,它不管如何都需要我们进行自定义,所以主要还是用在多重集合的情况下,单个集合的情况下还是使用ResultType.

这样大家基本就能了解清楚他们俩的不同了,了解完不同之后,我们再来具体的讲解一下如何使用他们:

  • ResultType

ResultType使用起来就比较的简单了,上面我们已经说过了,是可以直接调用我们的实体类的,所以我们基本上就是直接copy实体类的相对路径即可了,下面是一个栗子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectAll" resultType="com.auguigu.gmall.bean.PmsProductInfo">
select * from pms_product_info
</select>

可以看到我们只需要将我们需要返回的实体类的路径直接赋给ResultType即可,简单方便.

  • ResultMap

但是ResultMap相对来说就比较麻烦,其实主要就是 需要告诉Mybatis你是将那几个实体类进行多重组合的 ,这样剩下的事就可以全交给mybatis来做了.还是通过下面的栗子,我们详细讲解一下.

多重集合的两个实体类:

  • PmsProductSaleAttr
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PmsProductSaleAttr implements Serializable {

    @Id
    @Column
    Integer id;

    @Column
    Integer productId;

    @Column
    Integer saleAttrId;

    @Column
    String saleAttrName;

    @Transient
    List<PmsProductSaleAttrValue> pmsProductSaleAttrValueList;
}
  • PmsProductSaleAttrValue
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PmsProductSaleAttrValue implements Serializable {
    @Id
    @Column
    Integer id;

    @Column
    Integer productId;

    @Column
    Integer saleAttrId;

    @Column
    String saleAttrValueName;

    @Transient
    Integer isChecked;

}

之后我们再来看一下我们在mapper.xml文件中定义的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectspuSaleAttrListCheckBySku" resultMap="selectspuSaleAttrListCheckBySkuMap">
        SELECT
            sa.id as sa_id,
            sav.id as sav_id,
            sa.*,
            sav.*,
            if(ssav.sku_id,1,0) as isChecked
        FROM
            pms_product_sale_attr sa
                INNER JOIN pms_product_sale_attr_value sav ON sa.product_id = sav.product_id
                AND sa.sale_attr_id = sav.sale_attr_id
                AND sa.product_id = #{productId}
                LEFT JOIN pms_sku_sale_attr_value ssav ON sav.id = ssav.sale_attr_value_id
                AND ssav.sku_id = #{skuId}
                ORDER BY sav.id
    </select>
    <resultMap id="selectspuSaleAttrListCheckBySkuMap" type="com.auguigu.gmall.bean.PmsProductSaleAttr" autoMapping="true">
        <result column="sa_id" property="id"></result>
        <collection property="pmsProductSaleAttrValueList" ofType="com.auguigu.gmall.bean.PmsProductSaleAttrValue" autoMapping="true">
            <result column="sav_id" property="id"></result>
        </collection>
    </resultMap>

在分析代码之前,我们下来看一下该SQL语句执行之后,我们获得的数据是什么样的?

可以看到我们获得数据中又好几个字段名称都是重复的,这样就使得mybatis很难去做匹配,所以我们重点就是告诉mybatis该如何去做匹配.

首先ResultMap里面填的就是我们下面已经定义好的ResultMap的名字,接下来我们就重点看我们是如何来定义这个ResultMap的.

首先我们先来看ResultMap部分,再来看Collection

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<resultMap id="selectspuSaleAttrListCheckBySkuMap" type="com.auguigu.gmall.bean.PmsProductSaleAttr" autoMapping="true">
        <result column="sa_id" property="id"></result>
</resultMap>

我们首先需要先给我们的ResultMap定义一个名称即id,之后我们就需要定义ResultMap的type,这里的type是我们多重集合中最外层的实体对象,之后我们就需要定义该实体对象的主键即可,column指的是我们定义的返回数据中的字段名,property则是指的是我们在实体类中定义的主键,剩下的字段我们通过autoMapping=true即可让mybatis帮我们自动处理了.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<collection property="pmsProductSaleAttrValueList" ofType="com.auguigu.gmall.bean.PmsProductSaleAttrValue" autoMapping="true">
            <result column="sav_id" property="id"></result>
</collection>

了解完ResultMap是怎么定义的之后,collection看起来就比较简单了,这里我们就只需要看collection中的property即可,这里填的是最外层的实体类中定义的下一层集合的对象的名称,即下图所示:

其次还有一点就是这里的type,可以看到这里的type不像上面的ResultMap一样还是type了还是用的是oftype,这样就能会更加表示出多重集合这个概念了.

这样我们的ResultMap对象就定义完成了.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mybatis之collection实现递归查询级联数据
mybatis之collection实现递归查询级联数据 数据库结构: mbatis mapper文件: <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.xiepanpan.gmall.pms.entity.ProductCategory"> <id column="id" property="id" /> <result column="parent_id" property="parentId
周杰伦本人
2022/10/25
1.2K0
mybatis之collection实现递归查询级联数据
Mybatis中的resultMap和resultType区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。 ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。 ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。 一、ResultMap 当返回类型直接是一个ResultMap的时候也是非常有用的,这主要用在进行复杂联合查询上,因为进行简单查询是没有什么必要的。先看看一个返回类型为ResultMap的简单查询,再看看复杂查询的用法。
全栈程序员站长
2022/11/17
9310
MyBatis 中 ResultType 和 ResultMap 的区别
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
一个会写诗的程序员
2018/09/12
7.4K1
MyBatis(二)-CURD (ResultMap 一对一,一对多)
注意:增删改操作,和select查询标签最大的区别是:返回只有影响行数,所有没有resultType属性,而查询必须有resultType;
化羽羽
2022/10/28
1K0
ResultMap和ResultType在使用中的区别
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说ResultMap和ResultType在使用中的区别,希望能够帮助大家进步!!!
Java架构师必看
2022/01/11
2K0
8. 自定义映射resultMap
在 Mybatis 中,resultType 和 resultMap 都用于定义查询结果的映射关系。它们的使用场景如下:
捞月亮的小北
2023/12/01
2410
8. 自定义映射resultMap
Mybatis Mapper.xml 配置文件中 resultMap 节点的源码解析
在上篇文章 Mybatis 解析 SQL 源码分析一 介绍了 Maper.xml 配置文件的解析,但是没有解析 resultMap 节点,因为该解析比较复杂,也比较难理解,所有单独拿出来进行解析。
Java技术编程
2020/05/21
2.2K0
七、MyBatis自定义映射resultMap
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)
刘大猫
2025/03/02
1630
MyBatis之ResultMap的association和collection标签详解(图文例子)
一、前言 MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。 二、ResultMap 的属性列表 属性 描述 id 当前命名空间中的一个唯一标识,用于标识一个结果映射。 type 类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的
掉发的小王
2022/07/11
1.5K0
后端技术:mybatis中resultMap用法示例笔记
resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合,主要作用是将实体类中的字段与数据库表中的字段进行关联映射。并且支持复杂的返回结果类型。
小明互联网技术分享社区
2021/07/21
7060
Mybatis之ResultMap
Mybatis之ResultMap 本人独立博客https://chenjiabing666.github.io/ 实体类 通常实体类中的属性要和数据库表中的字段一致,包括类型,字段名称 因此我们在单表查询的时候不需要使用<resultMap>指定实体类和表中的字段对应关系,但是如果我们在查询的时候使用了别名,或者属性字段和表的字段不一致,那么我们就需要用<resultMap>指定对应关系了 准备 创建一个User类 public class User implements Serializable {
爱撒谎的男孩
2018/05/10
9091
Mybatis之ResultMap
Mybatis高级查询(一):resultMap与resultType
resultType:将查询结果按照sql列名pojo属性名一致性映射到pojo中
许喜朝
2020/08/11
1.3K0
resultMap 和 resultType的用法和区别详解
作为一位Java博主,我热衷于分享有关MyBatis的知识。在本篇博客中,我将深入探讨MyBatis中的 resultMap 和 resultType 的用法和区别。这两个概念在数据库结果映射中扮演着重要的角色。通过丰富的内容、示例代码以及深入的研究,我们将解开它们的奥秘,以帮助您更好地利用它们在Java应用程序中进行数据映射。
默 语
2024/11/20
1620
MyBatis-ResultMap
上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为模型。
愷龍
2022/12/31
4050
MyBatis-ResultMap
SSM第五讲 动态SQL与高级查询
就是相对与固定SQL。就是通过传入的参数不一样,可以组成不同结构的SQL语句. 这种根据参数的条件修改SQL结构的SQL语句,我们称为动态SQL语句.
易兮科技
2020/09/27
2.1K1
SSM第五讲  动态SQL与高级查询
mybatis的resultType integer(resultmap标签详解)
在官方文档中对resultType做了如下介绍:从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。
全栈程序员站长
2022/07/29
2.9K0
全文检索工具:第一章:Spring-data-elasticSearch搜索
@Document(indexName = "search11", type = "article",shards = 1,replicas = 0)
Java廖志伟
2022/09/28
4200
全文检索工具:第一章:Spring-data-elasticSearch搜索
mybatis的resultMap完美解析(含github实例)!!!
在 select 语句中查询得到的是一张二维表, 水平方向上看是一个个字段, 垂直方向上看是一条条记录。作为面向对象的语言, Java 中的的对象是根据类定义创建的。 类之间的引用关系可以认为是嵌套的关系。
用户5224393
2019/06/05
2.2K0
mybatis的resultMap完美解析(含github实例)!!!
从Mapper到JavaBean源码层面解析ResultMap是怎么映射的
在源码工程的test中以NestedQueryCacheTest测试类下的testThatNestedQueryItemsAreRetrievedFromCache为例:
关忆北.
2022/05/30
6430
从Mapper到JavaBean源码层面解析ResultMap是怎么映射的
oracle表之间的关联
mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-
微醺
2019/01/17
1.2K0
相关推荐
mybatis之collection实现递归查询级联数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验