从源码角度分析Mybatis级联映射的实现原理

news2025/7/9 10:40:39

Mybatis是一个半自动化ORM框架,可以将数据库中的记录转换为java实体对象,但是java实体属性通常采用驼峰命名法,而数据库字段习惯采用下划线分隔命名法,因此需要用户指定java实体属性与数据库表字段之间的映射关系。 mybatis的Mapper 配置中提供了resultMap 标签,用于建立数据库字段与java实体属性之间的映射关系。例如:

 <resultMap id="userMap" type="com.th.entity.User">
    <result column="id" property="id"></result>
    <result column="user_name" property="username"></result>
    <result column="pass_word" property="password"></result>
    <result column="bithday" property="bithday"></result>
    <collection property="orderList" ofType="com.th.entity.Order" fetchType="lazy">
      <result column="oid" property="id"></result>
      <result column="order_time" property="ordertime"></result>
      <result column="total" property="total"></result>
    </collection>
  </resultMap>

Mybatis 在启动时,所有配置信息都会被转换为java对象,Mybatis 通过ResultMap类描述resultMap标签的配置信息;在XMLMapperBuilder类的configurationElement()方法中,调用resultMapElements()方法对所有resultMap标签进行解析。resultMapElements()方法最终会调用重载的resultMapElement()方法对每个resultMap标签进行解析。代码如下:
在这里插入图片描述

对resultMap标签解析完成后,在StatementHandler组件与数据库完成交互后,需要根据resultMap标签的配置把结果转换为Resultmap对象,就会使用ResultSetHandler组件对结果集进行处理。

在PreparedStatementHandler.query方法中,调用PreparedStatement.execute() 方法完成与数据库交互之后,会调用resultSetHandler.handleResultSets()方法对结果集进行处理。代码如下:
在这里插入图片描述
DefaultResultSetHandler类是ResultSetHandler接口的唯一默认实现,DefaultResultSetHandler.handleResultSets()方法中,简化了对JDBC中ResultSet对象的操作,将ResultSet对象包装成ResultSetWrapper对象,然后获取MappedStatement对象对应的ResultMap对象,然后再调用重载的HandleResultSet()方法进行处理,代码如下:
在这里插入图片描述

在重载的handleResultSet()方法中做了些逻辑判断,最终都会调用handleRowValues()方法进行处理,代码如下:
在这里插入图片描述
handleRowValues()方法中判断ResultMap中是否有嵌套的ResultMap,当使用association或collection标签通过JOIN查询方式进行级联映射时 ,HasNestedResultMaps()方法返回true;如果有嵌套的RresultMap,则调用handleRowValuesForNestedResultMap()方法进行处理,否则调用handleRowValuesForSimpleResultMap()方法,代码如下:
在这里插入图片描述

简单映射结果处理

handleRowValuesForSimpleResultMap()方法不含嵌套映射的简单映射的处理。
在这里插入图片描述

嵌套映射结果处理

handleRowValuesForNestedResultMap ()方法是对嵌套映射结果进行处理,在处理过程中,对结果集对象进行遍历,处理每一行数据,首先调用resolveDiscriminatedResultMap()方法处理resultmap标签中通过discriminator标签配置的鉴别器信息,根据字段值获取对应的ResultMap对象,然后调用getRowValue() 方法将结果集中的一行数据转换为java实体对象。
在这里插入图片描述
简单映射结果和嵌套映射结果调用了getRowValue() 方法将结果集中的一行数据转换为java实体对象。代码如下:
在这里插入图片描述

多结果集处理

针对多结果集处理,在getRowValue()方法中调用 applyPropertyMappings()方法映射ResultMap中明确指定的字段。代码如下:
在这里插入图片描述
applyPropertyMappings()会调用getPropertyMappingValue()方法完成映射操作,代码如下:
在这里插入图片描述

getPropertyMappingValue()会调用addPendingChildRelation()对多结果集的情况进行处理,处理代码如下:

在这里插入图片描述

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

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

相关文章

智慧网格解决方案-最新全套文件

智慧网格解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、民生管理2、网格化管理3、智慧党建4、网上政务5、综治管理四、获取 - 智慧网格全套最新解决方案合集一、建设背景 在我国现代化转型中&#xff0c;社会环境的复杂性和不确定性增强&#xff0c;传统的基层…

智能合约开发 基于Hardhat(实操)

Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。 ​ Hardhat内置了Hardhat网络&#xff0c;这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试&#xff0c;跟踪调用堆栈、 console.log() 和交易失败时的明确错误信息提示等 ​安装 # 创建项目目录 …

TSRFormer:复杂场景的表格结构识别新利器

编者按&#xff1a;近年来&#xff0c;各大企业和组织机构都在经历数字化转型。将文档转换成计算机所能识别的样态&#xff0c;是数字化转型的关键步骤&#xff0c;如何识别出图片中表格具体的结构与内容&#xff0c;并直接提取其中的数据和信息是学术界和工业界共同瞩目的焦点…

C语言操作符大全(建议收藏)

前言 &#x1f496;作者&#xff1a;龟龟不断向前 ✨简介&#xff1a;宁愿做一只不停跑的慢乌龟&#xff0c;也不想当一只三分钟热度的兔子。 &#x1f47b;专栏&#xff1a;C初阶知识点 &#x1f47b;工具分享&#xff1a; 刷题&#xff1a; 牛客网 leetcode笔记软件&#xff…

操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别

操作系统4小时速成&#xff1a;进程管理占考试40%&#xff0c;进程状态&#xff0c;组织&#xff0c;通信&#xff0c;线程拥有调度&#xff0c;进程拥有资源&#xff0c;进程和线程的区别 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招…

生活中的5 个自动化Python 项目——从初学者到高级(附零基础学习教程)

前言 如果你正在学习 Python&#xff0c;你应该尝试自动化你的日常任务。&#xff08;文末送读者福利&#xff09; 您不仅可以通过实现您已经知道的知识来学习更多 Python&#xff0c;而且最终&#xff0c;您可以看到所有的辛勤工作是如何得到回报的。 最近&#xff0c;由于…

拉格朗日粒子扩散FLEXPART模式

当前&#xff0c;大气污染是我国重要的环境问题之一。为了高效、精准地治理区域大气污染&#xff0c;需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉…

第五节.常用Linux命令—远程管理

第五节.常用Linux命令—远程管理 1.关机/重启&#xff1a;(shutdown) 1).命令格式: 命令作用shutdown 选项 时间关机/重新启动 2).常用命令: 命令含义shutdown -r now重新启动操作系统&#xff0c;其中now表示现在shutdown now立刻关机&#xff0c;其中now表示现在shutdown …

热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(一)

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 本文…

css水平居中的几种方法

实现方法实现方法&#xff1a;定位 position 偏移值 left margin-left 回退定位 position 偏移值 left CSS-2d transform文字居中&#xff1a;text-align:center; 行内块元素弹性布局: display:flex; [推荐]实现方法&#xff1a; 1、添加 margin 值 auto 2、定位 positio…

[附源码]计算机毕业设计JAVA电影影评网

[附源码]计算机毕业设计JAVA电影影评网 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Mav…

企业 SDLC 安全生命周期管理

最近看了很多SDLC的东西&#xff0c;把其中比较重要关键的记录一下&#xff0c;用简洁的语言说清楚 0x01 SDL 介绍 SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践&#xff0c;全称为Security Development Lifecycle 0x02 为什么要SDL 目的是为了从安全漏…

硕士论文阅读——基于机器视觉和深度学习的工人安全帽检测与身份识别方法

文章目录零、摘要一、绪论1、背景与研究意义2、国内外研究现状&#xff08;1&#xff09;安全帽佩戴检测研究现状与不足&#xff08;2&#xff09;身份识别研究现状与不足&#xff08;3&#xff09;基于深度学习的目标检测二、深度学习目标检测理论1、卷积神经网络&#xff08;…

jQuery基础

目录 jQyery简介 获取jQuery jQuery基本语法 1.使用jQuery弹出提示框 2.$(document).ready()与window.onload的区别 jQuery选择器 jQuery层次选择器 jQyery简介 jQuery由美国人John Resig于2006年创建。jQuery是目前最流行的JavaScript程序&#xff0c;它是对JavaScript对…

Windows OpenGL 图像灰度图

目录 一.OpenGL 图像灰度图 1.原始图片2.效果演示 二.OpenGL 图像灰度图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES …

27k入职阿里测试岗那天,我哭了,这5个月付出的一切总算没有白费~

先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;16年普通二本学校毕业&#xff0c;经历过一些失败的工作经历后&#xff0c;经推荐就进入了华为的测试岗&#xff0c;进去才知道是接了个外包项目&#xff0c;不太稳定的样子&#xff0c;可是刚毕业谁知道什么外包不外…

Linux任务调度

基本原理&#xff1a; crontab [选项] -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前用户所有的crontab任务 快速入门 设置任务调度文件: /etc/crontab 设置个人任务调度。执行crontab -e命令。 接…

100道Spring面试题以及参考答案(2022年最新版)

77道Spring面试题以及参考答案&#xff08;2022年最新版&#xff09;&#xff0c;分享给大家~ 一、Spring概述 1. 什么是spring&#xff1f; Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各…

netstat命令应用和ifconfig命令应用

记录: 318 场景: 在CentOS 7.9操作系统上&#xff0c;使用netstat命令监控和查看TCP/IP等网络信息&#xff1b;使用ifconfig命令查看IP地址等网络信息。 版本: 操作系统: CentOS 7.9 1.基础环境 在CentOS 7.9操作系统&#xff0c;使用netstat命令和ifconfig命令&#xff…

Linux之LNMP离线安装

一、需求说明 LNMP一键安装包对于小型系统部署来说真的是非常方便&#xff0c;日常工作中除了在线安装&#xff0c;也存在部分场景要求离线安装。比如内网专网、严格限制访问外网的网络等&#xff0c;有些院校的实验室就是这种情况&#xff0c;需要使用光盘来完成系统的部署安装…