resultType自动映射与结果映射resultMap

news2025/1/13 17:44:51

今天继续完善一下mybatis系列相关博客,以便查阅,同时也希望能帮助到有需要的小伙伴,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

这一篇记录一下mybatis的结果映射,虽说在其它博客中也有所体现,但是并不完整,博客中关于parameterType、resultType就不使用全限定名了,都使用别名代替。mybatis已经给常用的数据类型起好了别名,它们都是不区分大小写的,具体参考官网:Java 类型内建的类型别名

resultMap元素是MyBatis中最重要最强大的元素。它可以让你从90%的JDBC ResultSets数据提取代码中解放出来,并在一些情形下允许你进行一些JDBC不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份resultMap能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了

目录

简单结果映射

高级结果映射

resultType自动映射


简单结果映射

之前你已经见过简单映射语句的示例,它们没有显式指定 resultMap。比如:

<select id="selectHashMap1" resultType="hashmap">
    select *
    from mybatis_user
</select>

上述语句只是简单地将所有的列映射到HashMap的键上,这由resultType属性指定。虽然在大部分情况下都够用,但是HashMap并不是一个很好的领域模型。你的程序更可能会使用JavaBean作为领域模型。MyBatis对两者都提供了支持。

看看下面这个 JavaBean:

@Data
@Builder
public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String province;
    private String city;
    private Date  createdTime;
    private String  createdBy;
    private Date  updatedTime;
    private String  updatedBy;
}

基于JavaBean的规范,这些属性会对应到select语句中的列名。这样的一个JavaBean可以被映射到ResultSet,就像映射到HashMap一样简单。

<select id="selectHashMap" parameterType="int" resultType="User">
    select *
    from mybatis_user
    where id = #{id}
</select>

在这些情况下,MyBatis会在幕后自动创建一个ResultMap,再根据属性名来映射列到JavaBean的属性上。如果列名和属性名不匹配,可以在SELECT语句中设置列别名来完成匹配。比如:

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
  from mybatis_user
  where id = #{id}
</select>

你会发现上面的例子没有一个需要显式配置ResultMap,这就是ResultMap的优秀之处——你完全可以不用显式地配置它们。 虽然上面的例子不用显式配置ResultMap。 但为了讲解,我们来看看如果在刚刚的示例中,显式使用外部的resultMap会怎样,这也是解决列名和属性名不匹配的另外一种方式,这里只选取三个属性,并且列name写成user_name演示一下:

<resultMap id="userResultMap" type="User">
  <id property="id" column="id" />
  <result property="name" column="user_name"/>
  <result property="province" column="province"/>
</resultMap>

然后在引用它的语句中设置resultMap属性就行了(注意我们去掉了 resultType 属性)。比如:

<select id="selectUsers" resultMap="userResultMap">
  select id, user_name, province
  from mybatis_user
  where id = #{id}
</select>

高级结果映射

参考:

springboot整合mybatis使用association做关联查询 一对一查询

springboot整合mybatis使用collection查询 一对多 多对一 多对多查询

resultType自动映射

resultType功能虽说不如resultMap强大,但是一般的查询也都能满足,相比使用resultMap有时候可能更加方便,如上面的查询:

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
  from mybatis_user
  where id = #{id}
</select>

另外,对于有嵌套关系的查询同样可以使用,如下:

@Data
public class UserWifeDto implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String province;
    private String city;
    private Date createdTime;
    private String  createdBy;
    private Date  updatedTime;
    private String  updatedBy;
    private String wifeName;
    private Wife wife;
}
<select id="testAutomappering" resultType="com.yjh.learn.mybatislearn.dto.UserWifeDto">
     select u.*, w.wife_name from mybatis_user u 
       left join mybatis_wife w on u.id = w.user_id where u.id = #{id}
</select>
<select id="testAutomappering1" resultType="com.yjh.learn.mybatislearn.dto.UserWifeDto">
    select u.*, w.* from mybatis_user u
       left join mybatis_wife w on u.id = w.user_id where u.id = #{id}
</select>
@Test
public void test6(){
    UserWifeDto dto = userMapper.testAutomappering(1);
    System.out.println("--- dto ---" + dto);
    UserWifeDto dto1 = userMapper.testAutomappering1(1);
    System.out.println("--- dto1 ---" + dto1);
}

 mapper就省了不贴代码了,如上两个查询都能查询到wifeName的值,但是wife为null,如下:

 

 如果只是只需要关联查询出副表的部分属性这样没什么问题,如果需要关联查询出的属性太多,一般使用对象接收,但是上面这样就查询不出来了,如果想查询wife的所有属性,就需要借助resultMap了,可以借助association和collection描述对象之间的关系完成映射,参考高级结果映射中的博客,这里记录一下不使用association和collection直接使用resultMap级联属性封装结果集的方式完成结果映射,如下:

<select id="testCascadeResultMap" resultMap="cascadeResultMap">
    select u.*, w.* from mybatis_user u
       left join mybatis_wife w on u.id = w.user_id where u.id = #{id}
</select>
<resultMap id="cascadeResultMap" type="com.yjh.learn.mybatislearn.dto.UserWifeDto">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="province" column="province"/>
    <result property="city" column="city"/>
    <result property="createdTime" column="created_time"/>
    <result property="createdBy" column="created_by"/>
    <result property="updatedTime" column="updated_time"/>
    <result property="updatedBy" column="updated_by"/>
    <result property="wife.wifeId" column="wife_id"/>
    <result property="wife.userId" column="user_id"/>
    <result property="wife.wifeName" column="wife_name"/>
</resultMap>

如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

week 9 吴恩达 迁移学习 多任务学习 端到端学习

文章目录一、错误分析二、快速构建系统然后迭代三、训练和测试的不同数据分布1、不匹配数据的偏差和方差2、解决数据不匹配问题。四、迁移学习 transfer learning五、多任务学习 multi-task learning六、端到端 end-to-end learning一、错误分析 当我们在构建一个系统时&#…

自动驾驶BEV火了,再给它加点脑洞会靠谱吗?

作者 | 洪泽鑫 编辑 | Bruce百度今年Create大会上辅助驾驶板块的内容挺硬核的&#xff0c;不在这个行业内基本听不懂。 正好是研究兴趣所在&#xff0c;结合百度给的资料&#xff0c;试着来中译中一下。 总的来说&#xff0c;百度是弄了一个车路一体的BEV感知方案——叫UniBEV。…

基于FPGA的UDP 通信(二)

引言前文链接&#xff1a;基于FPGA的UDP 通信&#xff08;一&#xff09;本文继续介绍与以太网数据协议相关的内容。以太网帧协议IEEE802.3标准规定了&#xff0c;以太网数据传输的格式&#xff1a;字段解释&#xff1a;字段名称字段长度/&#xff08;字节&#xff09;含义前导…

【MyBatis】第二篇:核心配置文件常用标签

前提 Mbatis的配置文件中的顺序如下&#xff1a; MyBatis核心配置文件中的标签必须安装指定的顺序配置。 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?…

SweetAlert让消息弹出窗口更加具有个性化!

SweetAlertSweetAlert是指可对JavaScript标准功能alert()和confirm()进行个性化定制的库。SweetAlert的要点官网上有很多示例&#xff0c;看了这些基本上就OK了。但是&#xff0c;在kintone上使用时&#xff0c;【弹出消息后更新页面】这个处理只参照示例来写的话&#xff0c;一…

微信小程序分包

1.什么是分包&#xff1f; 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2.分包的好处对小程序进行分包的好处主要有以下两点: 可以优化小程序首次启动的下载时间在多…

Elasticsearch 核心技术(四):索引管理、映射管理、文档管理(REST API)

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、索引管理1. 创建索引创建一个索引索引设置映射字段别名2. 获取索引3. 删除索…

阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]

阿拉伯数转中文与英文前言一、阿拉伯数字转换1、阿拉伯数字转中文a、案例b、解决方案2、阿拉伯数转英文a、案例b、解决方案总结参考文献前言 如果思考算法的解法方案是一种模拟&#xff0c;那么这一般不是个好的解决方案。对于一个复杂的问题&#xff0c;挖掘其中的规律&#…

制造业管理系统如何帮助企业快速应对品质异常问题?

在企业生产制造过程中&#xff0c;成品发生品质异常问题是不可避免的。当成品出现问题&#xff0c;为了有效防范批量品质事故&#xff0c;品管需要快速判断可能是哪个材料引起的&#xff0c;需要知道这批成品是谁做的&#xff0c;什么时候做的&#xff0c;提供材料的分别是哪个…

MySQL基础篇语句--DDL语句

SQL简介 当面对一个陌生的数据库时,通常需要一种方式与它交互&#xff0c;以完成用户所需要的各种工作&#xff0c;这个时候&#xff0c;就要用到SQL语言了。 SQL是Structure Query Language(结构化查询语言)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由…

传统推荐模型(一)协同过滤算法_UserCF和ItemCF

传统推荐模型&#xff08;一&#xff09;协同过滤算法_UserCF 1、UserCF 协同过滤就是协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出目标用户可能感兴趣的信息的推荐过程。 物品1物品2物品3物品4物品5用户131233用户243435用户333154用户41552…

OneNote(或印象笔记)迁移到Joplin的方法

2023年1月10日实操记录简介背景是必须卸载OneNote&#xff0c;所以要迁移笔记。告别了用了23年的Outlook &#xff0c;和10年左右的OneNote&#xff0c;小伤感&#xff0c;自此一别 就不能用练就的VBA技能在Excel和Access中处理数据了。。。基本前提Joplin支持.enex格式文件的导…

总结述职报告撰写方法,报告目的、对象、内容、技巧等

导语 又到年末时&#xff0c;述职报告再一次席卷而来。这篇文章将带来干货满满的述职报告撰写方法&#xff0c;包括述职目的、对象、内容、技巧等多个方面。 一、述职目的 有多少人认为&#xff0c;述职只是走个形式&#xff0c;走个过场的&#xff1f; 如果你这样认为&#x…

2023济南制药机械展|中国(济南)国际制药机械与包装技术展览会

2023中国&#xff08;济南&#xff09;国际制药机械与包装技术展览会将于2023年3月30-4月1日在山东国际会展中心&#xff08;济南市槐荫区日照路1号&#xff09;同期举办&#xff1a;2023第11届国际生物发酵展2023国际生化仪器与实验室装备展2023国际生物技术与生物制药展支持单…

以太网链路聚合与交换机堆叠、集群

网络的可靠性 网络的可靠性指当设备或者链路出现单点或者多点故障时保证网络服务不间断的能力网络的可靠性可以从单板、设备、链路多个层面实现 一般重要的核心设备都有一定的冗余 s12700E-8机框正面结构 框式交换机由机框、电源模块、风扇模块、主控板、交换网板&#xff…

CSS入门六、常用技巧

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

人工智能-linux高级操作命令

目录1、 重定向命令2、查看文件内容命令3、链接命令3.1 软链接4、查找文件内容命令5、查找文件命令6、压缩和解压缩文件7、文件权限命名8、获取管理员权限的相关命令9、远程登陆、远程拷贝10、软件安装与卸载11、vim介绍1、 重定向命令 将目录下的文件名全部写入新文件 touch …

场景编程集锦 - BMI指数与健身达人

1. 场景描述 BMI指数&#xff08;身体质量指数&#xff0c;英文Body Mass Index&#xff09;是用体重公斤数除以身高米数的平方得出的数字&#xff0c;是目前国际上通用的衡量人体胖瘦程度以及是否健康的一个标准。“身体质量指数”这个概念&#xff0c;是由19世纪中期的比利时…

马蹄集 宽度与对齐

宽度与对齐 难度&#xff1a;白银 时间限制&#xff1a;1秒巴占用内存&#xff1a;64M 输出455、-123、987654&#xff0c;宽度为5&#xff0c;分别左对齐和右对齐 格式 输入格式&#xff1a;无 输出格式&#xff1a;输出为整型&#xff0c;空格分隔。每个数的输出占一行 #inc…

[34]. 在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置题目算法设计&#xff1a;二分查找题目 算法设计&#xff1a;二分查找 进行两次二分查找&#xff08;定制版本&#xff09;&#xff0c;第一次先查找【第一个大于等于target的数】&#xff0c;第二次再查找【第一个大于target的数】…