浅谈MyBatis中的resultMap(个人总结)

article/2025/10/7 8:13:23

官方文档:          mybatis – MyBatis 3 | XML 映射器https://mybatis.org/mybatis-3/zh/sqlmap-xml.html“resultMap 元素是 MyBatis 中最重要最强大的元素......ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了”

 —— MyBatis 官方文档


        当要查询的数据很复杂的时候,比如需要同时查询好几个表,比如要查询的 entity 中不仅有一些基础数据,还引用了某一个类,甚至还声明了某一个 List<> 集合。可以说要查询出来的数据还是很复杂的,这个时候就需要 resultMap 这个牛批的玩意了。

首先要了解,一个 resultMap 中都有些什么常用的玩意:

<resultMap id="唯一标识" type="映射的entity对象的绝对路径"><id column="表主键字段" jdbcType="字段类型" property="映射entity对象的主键属性" /><result column="表某个字段" jdbcType="字段类型" property="映射entity对象的某个属性"/><!-- 指的是entity对象中的对象属性 --><association property="entity中某个对象属性" javaType="这个对象的绝对路径"><id column="这个对象属性对应的表的主键字段" jdbcType="字段类型" property="这个对象属性内的主键属性"/><result column="表某个字段" jdbcType="字段类型" property="这个对象属性内的某个属性"/></association><!-- 指的是entity对象中的集合属性 --><collection property="entity中的某个集合属性" ofType="这个集合泛型所存实体类的绝对路径"><id column="这个集合属性中泛型所存实体类对象对应表的主键字段" jdbcType="字段类型"property="这个集合属性中泛型所存实体类对象的主键属性"/><result column="表某个字段" jdbcType="字段类型" property="这个集合属性泛型所存实体类对象的属性"/>  </collection><!-- 引用另一个resultMap (套娃) --><collection property="entity中的某个集合属性" resultMap="这个引用的resultMap的type,就是这个集合属性泛型所存实体类的绝对路径"/>
</resultMap>

注意: 

        一个<resultMap></resultMap>,就是对应着一个实体类。id就是他的名字,type就是他们的身体。实体类和对应表是一一对应的,实体类中每一个属性都对应着一个表中的字段。其中有个别属性上标明注解@TableField(exist = false),其含义就是该属性在表中不存在,大多为引用的属性,引用的集合,或者是为了满足某种业务需求而声明的某种标志(比如sql多表查询时把某个表中的某个字段数据给另一个实体中某个属性赋值而起的别名)等等。

那么对于实体类中的各个属性:

        主键id则建议使用 <id column="" ../>

        一般的字段建议使用 <result column="" ../>

        引用了另外某个实体类对象 <association ... />

        引用了由某个实体类组成的集合 <collection ... />


那么使用时还需要注意什么?

        如果是单表映射的话,其中的 <result column=" " ../> 中的值,默认情况下就是对应着数据库的字段。这玩意可能底层是这么实现的,可能表中的下划线_和Java规范中的驼峰命名是有自动转换的功能的。完了它自己匹配。但是要注意这个column的值,对应的其实是指实际查询出来的字段。也就是说如果你给它起了个别名,那它可能就不知道它自己是谁了。

举个栗子: 

正常情况下:column默认值为字段

<resultMap id="roleMap" type="com.wlong.modules.base.entity.RoleEntity"><result property="roleName" column="role_name" />
</resultMap>
<select id="selectRoleById" parameterType="Integer" resultMap="roleMap">select * from `role` where id = #{id}
</select><!-- 结果为:Role{ id=1, roleName='wlong', age=20} -->

如果查询字段起了别名,那么column的值就是别名

<resultMap id="roleMap" type="com.wlong.modules.base.entity.RoleEntity"><result property="roleName" column="r"></result>
</resultMap>
<select id="queryRoleById" parameterType="Integer" resultMap="roleMap">select id, role_name r, age, from `role` where id = #{id}
</select><!-- 结果为:Role{ id=1, roleName='wlong', age=20} -->

反例:如果查询时使用别名,而column值没修改时(roleName结果为null)

<resultMap id="roleMap" type="com.wlong.modules.base.entity.RoleEntity"><result property="roleName" column="role_name"></result>
</resultMap>
<select id="queryRoleById" parameterType="Integer" resultMap="roleMap">select id, role_name r, age, from `role` where id = #{id}
</select><!-- 结果为:Role{ id=1, roleName='null', age=20} -->

所以当声明好了 <resultMap> 该如何使用?

<sql id="随便起个名" >表别名2.字段名1 , 表别名2.字段名2 ,表别名2.字段名3 ,....... 表别名2.字段名n</sql><!--查询表1的全部信息,同时把关联表2的信息也查出来(通过where决定要查出什么)-->
<select id="dao和service中定义的方法名" resultMap="要查的某个entity对象的resultMap的id">select a.*,<include refid="上边随便起的那个名"/> from 表1名 表别名1, 表2名 表别名2<where>...</where>
</select>

之所以搞出来一个<sql>,那纯纯是为了方便。执行一次数据库的查询,只需要拿到想要的个别信息就行了,没必要咔咔都给查出来,瞅着都烦气。而且要是需要的不需要的全查出来,浪费时间不说,还浪费内存。甚至浪费感情。= = 

前端需要什么,后端就给传什么,数据库就给查什么。所有的数据处理要求sql基本都可以满足。要知道你每敲的一行代码全部都是围绕着业务去做的,撇开业务不谈的代码都是无用功。


推荐去看一个大佬的文章,本文中有些是借鉴大佬原文的,结合例子写的非常详细。感谢感谢!

对resultMap中column的理解_krismile__qh的博客-CSDN博客https://blog.csdn.net/krismile__qh/article/details/90644058

还有这个大佬,写的也非常好。感谢感谢! 

mybatis Sql查询 返回对象或者list数据中包含一个对象的list集合_yijian941215的博客-CSDN博客_sql查询返回list集合https://blog.csdn.net/yijian941215/article/details/90439882

.The End



http://chatgpt.dhexx.cn/article/C5GFjxhD.shtml

相关文章

resultMap和resultType的使用区别

如今从事编程工作也大半年了&#xff0c;还是弄不明白mybtis中resultMap和resultType到底怎么使用&#xff0c;看了众多资料&#xff0c;研究了公司和git上不少代码&#xff0c;发现了一些区别 在实体类中定义好了数据库字段&#xff0c;就可以不用resultMap&#xff0c;直接用…

mybatis的resultMap用法

目录 1.前言 2.准备工作 2.1 类型别名 2.2 列名和属性名 2.3 mybatis映射文件处理特殊字符 2.4 sql片段 2.5 mybatis完成模糊查询 3.结果映射&#xff08;resultMap&#xff09; 4. 联表查询 4.1 一对一关联association 4.2 一对多关联collection 5.鉴别器 1.前言 …

mybatis中resultMap的理解

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上&#xff0c;在对复杂语句进行联合映射的时候&#xff0c;它很可能可以代替数千行的同等功能的代码。 R…

resultmap的用法

MyBatis中在查询进行select映射的时候&#xff0c;返回类型可以用resultType&#xff0c;也可以用resultMap&#xff0c;resultType是直接表示返回类型的&#xff0c;而resultMap则是对外部ResultMap的引用&#xff0c;但是resultType跟resultMap不能同时存在。在MyBatis进行查…

mybatis中resultMap配置细则

关注公众号【江南一点雨】&#xff0c;专注于 Spring Boot微服务以及前后端分离等全栈技术&#xff0c;定期视频教程分享&#xff0c;关注后回复 Java &#xff0c;领取松哥为你精心准备的 Java 干货&#xff01; resultMap算是mybatis映射器中最复杂的一个节点了&#xff0c;能…

深度解析resultMap标签

一般来说&#xff0c;一张表对应一份mapper映射文件&#xff0c;但部分属性在数据库中的存储并非直接存储其内容&#xff0c;而是存储其唯一标识&#xff0c;比如id&#xff0c;如下表中的员工政治面貌、部门、职级、岗位均是通过各个分表的id进行维护&#xff1a; 因此&#x…

ResultType和ResultMap的区别

ResultType和ResultMap都是执行查询语句时返回的结果集 ResultType ResultType相对与ResultMap而言更简单一点。只有满足ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;时&#xff0c;即数据库表中的字段名和实体类中的属性完全一致时&#x…

resultMap的用法以及关联结果集映射

resultType resultType可以把查询结果封装到pojo类型中&#xff0c;但必须pojo类的属性名和查询到的数据库表的字段名一致。 如果sql查询到的字段与pojo的属性名不一致&#xff0c;则需要使用resultMap将字段名和属性名对应起来&#xff0c;进行手动配置封装&#xff0c;将结…

[MyBatis]-resultMap结果映射集详解

resultMap结果映射集详解 resultmap是mybatis中最复杂的元素之一&#xff0c;它描述如何从结果集中加载对象&#xff0c;主要作用是定义映射规则、级联的更新、定制类型转化器。 resultmap构成元素 元素子元素作用constructoridArg 、arg用于配置构造器方法id将结果集标记为id…

MyBatis中ResultMap详解

简介&#xff1a; MyBatis的每一个查询映射的返回类型都是ResultMap&#xff0c;只是当我们提供的返回类型属性是resultType的时候&#xff0c;MyBatis会自动的给我们把对应的值赋给resultType所指定对象的属性&#xff0c;而当我们提供的返回类型是resultMap的时候&#xff0…

MyBatis多表查询resultMap设定

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Result Maps 是什么 ResultMap 属性 一、Java数据访问接口 二、XML实现 1、*分步查询 延迟加载 三、Test 1.读入数据 总结 Result Maps 是什么 resultMap 元素是 M…

JS字符串替换指定字符

碰到一个后端数据同步过来的xml文本段&#xff0c;内容里写死的宽度 在1920*1080的分辨率屏幕上&#xff0c;显示有问题&#xff0c;由于数据量太多&#xff0c;前端单独拿数据再处理一遍 RegExp方法&#xff1a; function replaceAll(str, find, replace) {return str.repla…

shell内置字符串替换

shell变量赋值语法&#xff1a; 使用规则解释单引号所见即所得&#xff0c;即输出时会将单引号内的所有內容都原样输出&#xff0c;或者描述为单引号里面看到的是什么就会输出什么&#xff0c;这称为强引用双引号 (默认)输出双引号内的所有内容&#xff1b;如果内容中有命令(…

python字符串替换

str.replace(old, new[, max]) 参数 old – 将被替换的子字符串。 new – 新字符串&#xff0c;用于替换old子字符串。 max – 可选字符串, 替换不超过 max 次 返回值 返回字符串中的 old&#xff08;旧字符串&#xff09; 替换成 new(新字符串)后生成的新字符串&#xff0c;如…

C++ 字符串替换

好久没有更新了&#xff0c;最近有点忙&#xff0c;今天抽点时间给大家水 写一篇关于替换字符串字符的文章 替换函数 string类型的字符串可以用swap函数来替换字符&#xff0c;例如&#xff1a; 冒泡排序 #include <bits/stdc.h> using namespace std;int main () {i…

Python字符串替换方法replace

字符串替换方法replace str1 .replace(old_str&#xff0c;new_str&#xff0c;count)字符串的替换&#xff0c;将str1中的 old_str 替换成new_str old_str:将要被替换的字符串 new_str:新的字符串&#xff0c;替换成的字符串# count:替换的次数,默认是全部替换 返回值:得到一个…

Java字符串替换的方法

java中字符串替换方法主要有三种&#xff0c;分别是replace()、replaceAll()和replaceFirst()&#xff0c;这三种方法可以在三种不同情况应用&#xff0c;下面就由我来具体说明这三种方法的应用情况吧。 replace() replace的参数是char和CharSequence&#xff0c;即可以支持字…

sed 字符串替换

1. sed替换的基本语法为: sed s/原字符串/替换字符串/ 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。 2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下&#xff1a; # 要…

字符串的替换

一、字符串“打劫&#xff01;我有枪”&#xff0c;“枪”是敏感词汇&#xff0c;替换为“*”&#xff0c;并输出打印 二、字符串“北京欢迎你”&#xff0c;替换字符为“郑州欢迎你们”&#xff0c;并输出打印 package work.twelve;/* 一、字符串“打劫&#xff01;我有枪”…

两种字符串替换的方法

1.语法&#xff1a; public String replace(CharSequence target,CharSquence replacement) 注&#xff1a;旧字符换成新字符 示例&#xff1a;店小二在菜单上写下一个馒头一文&#xff0c;“一个”二字容易被他人添上一笔变成“十个”&#xff0c;于是决定把“一”替换成汉字…