当前位置: 首页 > news >正文

【MyBatis】源码学习 05 - 关于 xml 文件解析的分析

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1、章节目录概览
      • 2、`14.3`:`SqlSourceBuilder` 类与 `StaticSqlSource` 类
      • 3、`14.4.2`:`ResultMapResolver` 类
      • 3.1、测试代码说明
      • 3.2、结果集 `userMap` 解析流程
      • 3.3、结果集 `getGirl` 解析流程
      • 3.4、鉴别器 `discriminator` 解析流程
      • 4、`14.6`:XML 文件解析
      • 5、`14.6.2`:配置文件解析
      • 6、`14.6.3`:数据库操作语句解析
      • 7、`14.6.4`:Statement 解析
      • 8、`14.7`:注解映射的解析

前言

本文内容对应的是书本第 14 章的内容,主要是关于 builder 包的学习,本章节的内容比较多,每一小节都有相应的例子进行说明,也附带了源码的注释说明,因此本文只是选择了本章节一部分的内容来进行 Debug 分析说明。

参考目录

  • 《通用源码阅读指导书:MyBatis源码详解》
    本文主要内容来自 第14章 builder包
  • 《通用源码阅读指导书——MyBatis源码详解》配套示例
    书中涉及的 Demo 示例,本文示例在 Demo13 的基础上进行了简单改造。

与上篇一样,需要说明的是,书中使用的框架版本和本文(本专栏)使用的版本不一样。

名称书中版本专栏版本
MyBatis3.5.23.5.11+
Spring Boot2.X3.X
JDK817+

随着版本的升级迭代,会有一些内容不尽相同,需要结合着进行学习。

学习笔记

1、章节目录概览

由于我在微信读书看书的时候,电子版对于书本章节里面的小节并没有进行详细的划分,有些小节的内容并没有在目录体现出来,对于想要快速查找资料不太方便,所以下面简单的做了整理,方便后面复习时进行对照查找。

(加粗的部分是下面会进行分析的内容)

  • 14.1 建造者模式
  • 14.2 建造者基类与工具类
  • 14.3 SqlSourceBuilder类与StaticSqlSource类
  • 14.4 CacheRefResolver类和ResultMapResolver类
    • 14.4.1 CacheRefResolver类
    • 14.4.2 ResultMapResolver类
  • 14.5 ParameterExpression类
  • 14.6 XML文件解析
    • 14.6.1 XML文件的声明解析
    • 14.6.2 配置文件解析
    • 14.6.3 数据库操作语句解析
    • 14.6.4 Statement解析
    • 14.6.5 引用解析
  • 14.7 注解映射的解析
    • 14.7.1 注解映射的使用
    • 14.7.2 注解映射解析的触发
    • 14.7.3 直接注解映射的解析
    • 14.7.4 间接注解映射的解析

2、14.3SqlSourceBuilder 类与 StaticSqlSource

SqlSourceBuilder 类能够将 DynamicSqlSource 和 RawSqlSource 中的“#{}”符号替换掉,从而将它们转化为 StaticSqlSource。

#{} 其实是 xml 文件中很重要的参数占位符,而 SqlSourceBuilder 的作用就是把占位符解析并转换成为 SQL,下面通过一个简单的示例来 Debug 看一下这个过程。

测试的SQL:

	<select id="selectById" resultType="User">SELECT * FROM `user` WHERE id = #{id}</select>

SqlSourceBuilder#parse
在这里插入图片描述

GenericTokenParser#parse
在这里插入图片描述

在这里插入图片描述

解析完成后,返回 SqlSourceBuilder#parse 方法构建 StaticSqlSource

在这里插入图片描述

StaticSqlSource#StaticSqlSource
在这里插入图片描述

3、14.4.2ResultMapResolver

借助于 MapperBuilderAssistant 的 addResultMap 方法,ResultMapResolver 完成了ResultMap 的继承关系解析,最终给出一个解析完继承关系之后的ResultMap 对象。

3.1、测试代码说明

跟参考目录 Demo 中的 Demo13 类似,测试代码如下:
在这里插入图片描述

ResultMap 对象的解析由主节点到子节点依次进行,下面的分析也分成三个部分,分别是 userMapgetGirl 以及 discriminator

3.2、结果集 userMap 解析流程

XMLMapperBuilder#resultMapElements
在这里插入图片描述

XMLMapperBuilder#resultMapElement
在这里插入图片描述

resultMap 继承关系的解析由 ResultMapResolver 类来完成。

ResultMapResolver#resolve
在这里插入图片描述

在这里插入图片描述

借助于 MapperBuilderAssistant 的 addResultMap 方法,ResultMapResolver 完成了ResultMap 的继承关系解析,最终给出一个解析完继承关系之后的ResultMap 对象。

MapperBuilderAssistant#addResultMap
在这里插入图片描述

在这里插入图片描述

3.3、结果集 getGirl 解析流程

XMLMapperBuilder#resultMapElements
在这里插入图片描述

XMLMapperBuilder#resultMapElement
在这里插入图片描述

ResultMapResolver#resolve
在这里插入图片描述

MapperBuilderAssistant#addResultMap
在这里插入图片描述

在这里插入图片描述

3.4、鉴别器 discriminator 解析流程

XMLMapperBuilder#resultMapElement
在这里插入图片描述

XMLMapperBuilder#processDiscriminatorElement
在这里插入图片描述

解析结果:
在这里插入图片描述

4、14.6:XML 文件解析

解析的语句:

<!DOCTYPE mapper   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

在这里插入图片描述

在这里插入图片描述

5、14.6.2:配置文件解析

先抛出结论:

XMLConfigBuilder在 MyBatis的配置解析中起到了引导的作用,正是从它的parse方法开始,引发了配置文件和映射文件的解析。

放到代码当中,实际上是创建 SqlSessionFactory 时,XMLConfigBuilder 对 XML 文件进行解析。

执行方法的调用链如下:

  • org.apache.ibatis.session.SqlSessionFactoryBuilder#build
    • org.apache.ibatis.builder.xml.XMLConfigBuilder#parse
      • org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration
        • org.apache.ibatis.builder.xml.XMLConfigBuilder#environmentsElement

XML 配置文件 mybatis-config.xml
在这里插入图片描述

XMLConfigBuilder#parseConfiguration
在这里插入图片描述

XMLConfigBuilder#environmentsElement
在这里插入图片描述

一共三部分:默认环境,事务管理器 TransactionFactory,数据源 DataSourceFactory

参数 XNode context
在这里插入图片描述

默认环境
在这里插入图片描述

事务管理器 TransactionFactory

XMLConfigBuilder#transactionManagerElement
在这里插入图片描述

数据源 DataSourceFactory

XMLConfigBuilder#dataSourceElement
在这里插入图片描述

最终解析完成 XMLConfigBuilder#environmentsElement
在这里插入图片描述

6、14.6.3:数据库操作语句解析

parse 方法为解析的入口方法,然后调用configurationElement 方法逐层完成解析。

和配置文件解析过程类似,执行方法的调用链如下:

  • org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration
    • org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement
      • org.apache.ibatis.builder.xml.XMLMapperBuilder#parse
        • org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement

由 configurationElement(parser.evalNode(“/mapper”))语句触发后,系统会依次解析映射文件的各个节点。

XMLMapperBuilder#parse
在这里插入图片描述

参数 XNode context
在这里插入图片描述

  • cacheRefElement:缓存引用
  • cacheElement:缓存
  • parameterMapElement:参数映射
  • resultMapElements:结果映射
  • sqlElement:sql
  • buildStatementFromContext:从上下文构建语句

7、14.6.4:Statement 解析

这里主要是承接上一小节对 buildStatementFromContext 方法进行了说明。

执行方法的调用链如下:

  • org.apache.ibatis.builder.xml.XMLMapperBuilder#buildStatementFromContext
    • org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

XMLStatementBuilder#parseStatementNode
在这里插入图片描述

在这里插入图片描述

MapperBuilderAssistant#addMappedStatement
在这里插入图片描述

在这里插入图片描述

解析完成的 statement
在这里插入图片描述

在这里插入图片描述

8、14.7:注解映射的解析

这里主要是对于书中没有详细说明的 泛型桥接方法 进行简单的拓展。

关于这一方面我和 ChatGPT 来回讨论了几次然后有了以下说明:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

还有一些补充说明作为辅助理解:
在这里插入图片描述

在这里插入图片描述

关于该方法的参数讨论:
在这里插入图片描述

在这里插入图片描述

(完)

相关文章:

【MyBatis】源码学习 05 - 关于 xml 文件解析的分析

文章目录前言参考目录学习笔记1、章节目录概览2、14.3&#xff1a;SqlSourceBuilder 类与 StaticSqlSource 类3、14.4.2&#xff1a;ResultMapResolver 类3.1、测试代码说明3.2、结果集 userMap 解析流程3.3、结果集 getGirl 解析流程3.4、鉴别器 discriminator 解析流程4、14.…...

代码随想录算法训练营第二天| 977. 有序数组的平方、209. 长度最小子数组、59.螺旋矩阵II

977 有序数组的平方题目链接&#xff1a;977 有序数组的平方介绍给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。思路看到题目的第一反应&#xff0c;首先负数的平方跟正数的平方是相同的&…...

Ethercat系列(10)用QT实现SOEM主站

首先将SOEM编译成静态Lib库可以参考前面的博文(83条消息) VS2017下编译SOEM(Simle Open EtherCAT Master)_soem vs_CoderIsArt的博客-CSDN博客make_libsoem_lib.bat "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build" x86用QT创建…...

论文投稿指南——中文核心期刊推荐(科学、科学研究)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

jQuery属性操作prop()、attr()和data()

jQuery 提供了一些属性操作的方法&#xff0c;主要包括 prop()、attr() 和 data() 等。通过这些方法&#xff0c;能够实现不同的需求。下面我们分别进行详细讲解。 1.prop() 方法 prop0 方法用来设置或获取元素固有属性值。元素固有属性是指元素本身自带的属性&#xff0c;如 …...

git的使用

1.git的四个区域&#xff1a; 2.常规git命令 git status 查看working directory哪些文件被更改了git add .把更改add到staging area&#xff0c;缓存的地方。改一个地方可以就先暂存一下&#xff0c;最后确认是哪些改动后再一起commit,以免不必要的版本。 在暂存区域&#xff…...

webpack生产环境配置

3 webpack生产环境配置 由于笔记文档没有按照之前的md格式书写&#xff0c;所以排版上代码上存在问题&#x1f622;&#x1f622;&#x1f622;&#x1f622; 09 提取css成单独文件 使用下载插件 npm i mini-css-extract-plugin0.9.0 -D webpack配置此时a,b提取成单独文件,并且…...

linux下安装jenkins

1.初始化Jenkins安装环境 系统版本&#xff1a;Red Hat Enterprise Linux 8.7 将脚本文件jenkins_install_env.sh 、 jenkins_install.sh和apache-maven-3.6.2-bin.tar.gz、jdk-8u251-linux-x64.tar.gz都上传到/usr/local/src目录下执行jenkins_install_env.sh脚本初始化Jenki…...

IGKBoard(imx6ull)-I2C接口编程之SHT20温湿度采样

文章目录1- 使能开发板I2C通信接口2- SHT20硬件连接3- 编码实现SHT20温湿度采样思路&#xff08;1&#xff09;查看sht20从设备地址&#xff08;i2cdetect&#xff09;&#xff08;2&#xff09;获取数据大体流程【1】软复位【2】触发测量与通讯时序&#xff08;3&#xff09;返…...

MyBatis——配置文件完成增删改查

1.首先先创建一个新的表,使用下面的sql语句 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20…...

Python内置函数 — all,any

1、all 源码注释&#xff1a; def all(*args, **kwargs): # real signature unknown"""Return True if bool(x) is True for all values x in the iterable.If the iterable is empty, return True."""pass 语法格式&#xff1a; all(iterable)…...

Pycharm配置QGIS环境

版本信息&#xff1a;QGIS&#xff1a; 3.22.16Pycharm&#xff1a;2022.3.2 (Community Edition)在QGIS官网下载安装包&#xff0c;下载稳定版本即可。配置步骤&#xff1a;安装完成后&#xff0c;使用Pycharm新建工程Python编译器选择之前配置好的编译器环境选择左侧第一个Vi…...

【C++】stack 与 queue

stack 与 queuestackSTL 容器中 stack 的使用模拟实现 stackqueueSTL 容器中 queue 的使用模拟实现 queuestack 在数据结构中&#xff0c;我们了解到&#xff0c;stack 栈结构&#xff0c;是一种先进后出的结构&#xff0c;并且我们是使用顺序表来进行实现栈的操作的。 STL 容…...

ARC142E Pairing Wizards

ARC142E Pairing Wizards 题目大意 有nnn个法师&#xff0c;编号为111到nnn。法师iii有强度aia_iai​&#xff0c;他计划打败强壮度为bib_ibi​的怪物。 你可以执行以下操作任意次&#xff1a; 选中一个法师&#xff0c;将它的强壮度增加1 一对法师(i,j)(i,j)(i,j)称为好的…...

Spark开发实战-主播打赏排行榜统计

&#xff08;一&#xff09;需求分析 计算每个大区当天金币收入排名前N的主播 背景&#xff1a; 我们有一款直播APP&#xff0c;已经在很多国家上线并运营了一段时间&#xff0c;产品经理希望开发一个功能&#xff0c;计算前N主播排行榜&#xff0c;按天更新排名信息&#xf…...

python 如何存储数据 (python 的文件和异常)

文章目录存储数据1. 使用 json.dump() 和 json.load()json.dump()2. 保存和读取用户生成的数据存储数据 很多程序都要求用户输入某种信息&#xff0c;如让用户存储游戏首选项或提供要可视化的数据。不管专注的是什么&#xff0c;程序都把用户提供的信息存储在列表和字典等数据结…...

第三章-OpenCV基础-8-绘图函数

前置内容 这篇内容不是本书内容,但后续用的到&#xff0c;特做记录。 使用OpenCV中不可避免需要用到各种绘图功能,比如绘制人脸库、显示人脸识别信息,那就需要用到OpenCV的绘图函数&#xff0c;这些函数包括cv2.line()&#xff0c; cv2.circle()&#xff0c;cv2.rectangle()…...

逆约瑟夫问题

约瑟夫问题可以说十分经典&#xff0c;其没有公式解也是广为人知的~ 目录 前言 一、约瑟夫问题与逆约瑟夫问题 1.约瑟夫问题 2.逆约瑟夫问题 二、思考与尝试&#xff08;显然有很多失败&#xff09; 问题分析 尝试一&#xff1a;递归/递推的尝试 尝试二&#xff1a;条件…...

MySQL之三大日志(更新中)

MySQL之三大日志&#xff08;更新中&#xff09; MySQL日志记录着数据库运行过程中的各种信息&#xff0c;包括&#xff1a;错误日志、普通查询日志、慢查询日志、二进制日志、中继日志、事务日志等。 综合上一篇《MySQL之"幻读"问题》涉及到事务&#xff0c;本文主…...

如何使用EvilTree在文件中搜索正则或关键字匹配的内容

关于EvilTree EvilTree是一款功能强大的文件内容搜索工具&#xff0c;该工具基于经典的“tree”命令实现其功能&#xff0c;本质上来说它就是“tree”命令的一个独立Python 3重制版。但EvilTree还增加了在文件中搜索用户提供的关键字或正则表达式的额外功能&#xff0c;而且还…...

Windows 11安卓子系统实战:无需商店直装APK的终极指南

1. Windows 11安卓子系统核心概念解析 Windows 11安卓子系统&#xff08;Windows Subsystem for Android&#xff0c;简称WSA&#xff09;是微软推出的重磅功能&#xff0c;它让Windows系统首次实现了原生运行安卓应用的能力。这个功能本质上是在Windows内核层构建了一个轻量化…...

ESP32硬件定时器虚拟化:16路ISR定时器实现原理与工程实践

1. ESP32_New_TimerInterrupt 库深度解析&#xff1a;16路高精度硬件定时器中断的工程实践1.1 为什么嵌入式系统迫切需要此库在ESP32系列微控制器的实际工程开发中&#xff0c;硬件定时器资源极其稀缺且关键。标准ESP32芯片仅配备两组定时器组&#xff08;Timer Group 0/1&…...

从‘偏差-方差’到一行代码:用NumPy/PyTorch五步实现GAE,附PPO实战避坑点

从‘偏差-方差’到一行代码&#xff1a;用NumPy/PyTorch五步实现GAE&#xff0c;附PPO实战避坑点 强化学习中的策略优化常常面临一个核心挑战&#xff1a;如何准确评估动作的价值&#xff1f;广义优势估计&#xff08;GAE&#xff09;通过巧妙平衡偏差与方差&#xff0c;成为PP…...

Undecimus革新性全流程越狱技术指南:从核心价值到实用工具

Undecimus革新性全流程越狱技术指南&#xff1a;从核心价值到实用工具 【免费下载链接】Undecimus unc0ver jailbreak for iOS 11.0 - 12.4 项目地址: https://gitcode.com/gh_mirrors/un/Undecimus 一、核心价值&#xff1a;破解iOS生态三大痛点 Undecimus作为针对iOS…...

Java面向对象实战:从0到1手写奇偶判断工具类[特殊字符]新手保姆级教程

&#x1f338;你好呀&#xff01;我是断弦承露&#x1f31f;感谢陪伴&#xff5e; 小白博主在线求友&#x1f33f; 跟着小白学/Java/软件设计/鸿蒙开发/芯片开发&#x1f4d6;专栏汇总&#xff1a;《软件设计师》专栏 | 《Java》专栏 | 《 RISC-V 处理器实战》专栏 | 《Flutter…...

WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用

WebGL BIM可视化&#xff1a;浏览器端BIM解决方案的技术实践与行业应用 【免费下载链接】xeokit-bim-viewer A browser-based BIM viewer, built on the xeokit SDK 项目地址: https://gitcode.com/gh_mirrors/xe/xeokit-bim-viewer 如何解决浏览器端BIM模型加载慢、操…...

从零搭建SRS流媒体服务器:实现RTMP推拉流的实战部署指南

1. 为什么选择SRS搭建流媒体服务器&#xff1f; 最近几年直播和实时视频的需求爆发式增长&#xff0c;很多开发者都在寻找轻量高效的流媒体服务器方案。我测试过不少开源方案&#xff0c;最终发现SRS&#xff08;Simple Realtime Server&#xff09;是最适合个人和小团队自建的…...

ConvNeXt 改进 :ConvNeXt添加SAConv(可切换空洞卷积),自适应融合多尺度特征,优化小目标与遮挡目标感知,二次创新CNBlock结构

本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Co…...

告别模糊人像:AI驱动的面部增强新方案

告别模糊人像&#xff1a;AI驱动的面部增强新方案 【免费下载链接】DZ-FaceDetailer a node for comfyui for restore/edit/enchance faces utilizing face recognition 项目地址: https://gitcode.com/gh_mirrors/dz/DZ-FaceDetailer 在数字图像处理领域&#xff0c;人…...

从数据采集到模型部署:用Lerobot+本地数据集训练一个会抓积木的机械臂(避坑指南)

从数据采集到模型部署&#xff1a;用Lerobot本地数据集训练一个会抓积木的机械臂&#xff08;避坑指南&#xff09; 当机械臂第一次准确抓取乐高积木并放入指定盒子时&#xff0c;那种成就感远超单纯调通代码的快感。Lerobot框架的出现&#xff0c;让机器人学习从实验室走向个人…...