MyBatis 如何解析 XML 配置文件和 SQL 映射文件
MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。
MyBatis 主要解析两种类型的 XML 文件:
- 核心配置文件 (mybatis-config.xml): 定义 MyBatis 的全局配置信息,如数据源、事务管理器、类型别名、类型处理器、插件、映射器等。
- SQL 映射文件 (例如 UserMapper.xml): 定义 SQL 语句和映射规则,将 SQL 语句与 Mapper 接口的方法关联起来。
解析过程概述:
-
创建 XMLConfigBuilder (解析核心配置文件):
SqlSessionFactoryBuilder的build()方法会创建一个XMLConfigBuilder对象,用于解析核心配置文件。XMLConfigBuilder内部会创建一个 SAX 解析器 (XMLMapperEntityResolver)。XMLConfigBuilder会解析核心配置文件中的各个元素(<properties>,<settings>,<typeAliases>,<typeHandlers>,<plugins>,<environments>,<mappers>等),并将解析结果存储到Configuration对象中。
-
创建 XMLMapperBuilder (解析 SQL 映射文件):
- 在解析核心配置文件中的
<mappers>元素时,XMLConfigBuilder会为每个 SQL 映射文件创建一个XMLMapperBuilder对象。 XMLMapperBuilder内部也会创建一个 SAX 解析器。XMLMapperBuilder会解析 SQL 映射文件中的各个元素(<mapper>,<select>,<insert>,<update>,<delete>,<resultMap>,<sql>等),并将解析结果转换为MappedStatement对象,并添加到Configuration对象的mappedStatements集合中。
- 在解析核心配置文件中的
-
使用 XPath 解析 XML 元素:
- MyBatis 使用 XPath 表达式来定位和解析 XML 文件中的各个元素。
XMLConfigBuilder和XMLMapperBuilder都使用XPathParser来解析 XPath 表达式。
核心配置文件 (mybatis-config.xml) 解析过程 (XMLConfigBuilder):
-
解析
<properties>元素:- 读取
<properties>标签的resource或url属性,加载外部属性文件。 - 解析
<properties>标签内部的<property>子元素,获取属性名和属性值。 - 将属性存储到
Configuration对象的variables属性中(一个Properties对象)。
- 读取
-
解析
<settings>元素:- 解析
<settings>标签内部的<setting>子元素,获取设置名和设置值。 - 将设置存储到
Configuration对象的相应属性中(例如,cacheEnabled、lazyLoadingEnabled等)。
- 解析
-
解析
<typeAliases>元素:- 解析
<typeAliases>标签内部的<typeAlias>子元素,获取别名和对应的 Java 类型。 - 解析
<typeAliases>标签内部的<package>子元素,扫描指定包下的所有类,并自动生成别名(类名首字母小写)。 - 将别名和类型注册到
Configuration对象的typeAliasRegistry中。
- 解析
-
解析
<typeHandlers>元素:- 解析
<typeHandlers>标签内部的<typeHandler>子元素,获取类型处理器类名(或实例)。 - 解析
<typeHandlers>标签内部的<package>子元素,扫描指定包下的所有类型处理器类。 - 将类型处理器注册到
Configuration对象的typeHandlerRegistry中。
- 解析
-
解析
<objectFactory>元素:- 解析
<objectFactory>的type属性,获取对象工厂实现类。 - 反射创建其实例,并设置到
Configuration对象。
- 解析
-
解析
<plugins>元素:- 解析
<plugins>标签内部的<plugin>子元素,获取插件类的全限定名。 - 创建插件实例,并将插件添加到
Configuration对象的interceptorChain中。
- 解析
-
解析
<environments>元素:- 解析
<environments>标签的default属性,获取默认的环境 ID。 - 解析
<environments>标签内部的<environment>子元素,获取环境 ID、事务管理器配置和数据源配置。 - 根据配置创建
TransactionFactory和DataSourceFactory,并创建相应的Transaction和DataSource实例。 - 将环境配置存储到
Configuration对象的environment属性中。
- 解析
-
解析
<databaseIdProvider>元素:- 解析
<databaseIdProvider>的type属性,获取数据库厂商标识提供类。 - 解析其内部
<property>子元素,获取不同数据库对应的标识。
- 解析
-
解析
<mappers>元素:- 解析
<mappers>标签内部的<mapper>子元素,获取 SQL 映射文件的路径(resource、url或class属性)。 - 解析
<mappers>标签内部的<package>子元素,扫描指定包下的所有 Mapper 接口或 XML 映射文件。 - 对于每个 SQL 映射文件,创建一个
XMLMapperBuilder对象,并调用其parse()方法解析 SQL 映射文件。
- 解析
SQL 映射文件 (例如 UserMapper.xml) 解析过程 (XMLMapperBuilder):
-
解析
<mapper>元素:- 获取
<mapper>标签的namespace属性,作为 Mapper 接口的全限定名。
- 获取
-
解析
<cache>元素(如果有):- 解析
<cache>标签,获取缓存配置信息,创建Cache对象。
- 解析
-
解析
<parameterMap>元素(已废弃,不建议使用):
- 解析
<parameterMap>标签及其子元素,获取参数映射信息。
-
解析
<resultMap>元素:- 解析
<resultMap>标签及其子元素(<id>,<result>,<association>,<collection>,<discriminator>),获取结果映射规则。 - 创建
ResultMap对象,并添加到Configuration对象的resultMaps集合中。
- 解析
-
解析
<sql>元素:- 解析
<sql>标签,获取可重用的 SQL 片段。 - 将 SQL 片段存储到
Configuration对象的sqlFragments集合中。
- 解析
-
解析
<select>,<insert>,<update>,<delete>元素:- 解析这些标签的属性(
id,parameterType,resultType,resultMap,statementType,flushCache,useCache,timeout等)。 - 解析 SQL 语句内容,处理占位符(
#{}和${})。 - 创建
MappedStatement对象,并将 SQL 语句、参数类型、结果类型、SQL 类型(SELECT,INSERT,UPDATE,DELETE)等信息存储到MappedStatement对象中。 - 将
MappedStatement对象添加到Configuration对象的mappedStatements集合中。
- 解析这些标签的属性(
关键类:
XMLConfigBuilder: 负责解析核心配置文件。XMLMapperBuilder: 负责解析 SQL 映射文件。XPathParser: 用于解析 XPath 表达式。Configuration: 保存 MyBatis 的全局配置信息,以及解析后的MappedStatement、ResultMap等对象。MappedStatement: 代表一个 SQL 语句,包含了 SQL 语句的 ID、参数类型、结果类型、SQL 语句内容等信息。ResultMap: 代表一个结果映射规则,定义了如何将查询结果集映射为 Java 对象。
总结:
MyBatis 使用 SAX 解析器和 XPath 表达式来解析 XML 配置文件。XMLConfigBuilder 负责解析核心配置文件,XMLMapperBuilder 负责解析 SQL 映射文件。解析后的配置信息存储在 Configuration 对象中,MappedStatement 对象代表 SQL 语句,ResultMap 对象代表结果映射规则。
相关文章:
MyBatis 如何解析 XML 配置文件和 SQL 映射文件
MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。 MyBatis 主要解析两种类型的 XML 文件: 核心配置文件 (mybatis-config.xml): 定…...
使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法
使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法 现在PRD文档要如何写更高效、更清晰、更完整? 还是按以前的思路写PRD,就还是以前的样子。 现在AI这么强大,产品经理如何使用DeepSeek写PRD文档,产品经…...
【VUE2】第五期——VueCli创建项目、Vuex多组件共享数据、json-server——模拟服务端api
黑马程序员视频地址:091-vuex的基本认知_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p91 目录 1 VueCli 自定义创建项目 2 Eslint代码规范 2.1 规…...
rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64
在我在Linux中安装离线CAN工具时,出现了一个问题, rootwanghuo:~# rpm -ivh can-uilts-v2019.00.0-alt1.aarch64.rpm error: Failed dependencies:rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64 意思是尝试安装 can-uilts-v20…...
CNN 稠密任务经典结构
FCN UNet FPN FCNUNETFPNpadding无(逐渐变小) 有(左右对称)上采样 双线性双线性 最近邻跳跃链接 相加 Cropcat 1x1卷积相加 三个网络差不多,UNet名字最直观,后续流传…...
算法刷题整理合集(二)
本篇博客旨在记录自已的算法刷题练习成长,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是算法小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来…...
STM32配套程序接线图
1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…...
Houdini学习笔记
1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体...
如何在Futter开发中做性能优化?
目录 1. 避免不必要的Widget重建 问题:频繁调用setState()导致整个Widget树重建。 优化策略: 2. 高效处理长列表 问题:ListView一次性加载所有子项导致内存暴涨。 优化策略: 3. 图片加载优化 问题:加载高分辨率…...
仿Ant Design Vue风格自定义浏览器滚动条样式
仿Ant Design Vue风格自定义浏览器滚动条样式 问题原因 浏览器默认的滚动条样式很丑,无法满足需求,需要自定义滚动条样式,参考ant-design-vue的样式 css修改滚动相关属性可查阅官方文档 选择器介绍 ::webkit-scrollbar:滚动条…...
Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台
1. 前言 1.1 什么是Apache Ignite Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。 1.2 为什么选择Apache Ignite 高性能:Ignite利用内…...
OpenCV中文路径图片读写终极指南(Python实现)
文章目录 OpenCV中文路径图片读写终极指南(Python实现)一、问题深度解析1.1 现象观察1.2 底层原因 二、中文路径读取方案2.1 终极解决方案(推荐)2.2 快速修复 三、中文路径保存方案3.1 通用保存函数3.2 使用示例 四、技术原理详解…...
单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明
单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤: 编写测试用例,覆盖代码的各个分支和边界条件。使用测试框架(如JUnit、NUnit)执行测试。检查测试结果,确保代码按预期运行。修复发现的缺陷并重新测…...
《CircleCI:CircleCI:解锁软件开发持续集成(CI)和持续部署(CD)高效密码》:此文为AI自动生成
《CircleCI:CircleCI:解锁软件开发持续集成(CI)和持续部署(CD)高效密码》:此文为AI自动生成 一、CircleCI 初印象 在当今软件开发的快节奏赛道上,持续集成(CIÿ…...
网络安全反渗透 网络安全攻防渗透
网络渗透防范主要从两个方面来进行防范,一方面是从思想意识上进行防范,另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面,纵观容易出现网络安全事故或者事件的公司和个人,在这些…...
《GitHub网路访问不稳定:解决办法》:此文为AI自动生成
《GitHub网路访问不稳定:解决办法》:此文为AI自动生成 GitHub 网路访问不稳定初现 在当今数字化时代,软件开发行业蓬勃发展,GitHub 作为全球最大的代码托管平台,已然成为无数开发者不可或缺的 “宝库”。它不仅汇聚了…...
G-Star 公益行 | 温暖相约 3.30 上海「开源×AI 赋能公益」Meetup
你是否曾想过,在这个数字化浪潮席卷的时代,公益组织如何突破技术瓶颈?当 AI 成为热门话题,它能为公益事业带来怎样的温度?开源的力量,如何让每一份善意都拥有无限可能? G-Star 公益行ÿ…...
docker pull 镜像问题
问题一:pull镜像报错:time out 分析:源问题,网络不稳定,更换加速源,地址:/etc/docker/daemon.json 解决:更换地址,如下,然后敲:docker daemon-reload &&…...
【Go】字符串相关知识点
字符串(String)是 Go 语言中最常用的数据类型之一,广泛应用于文本处理、数据解析、网络通信等场景。Go 语言的字符串是不可变的 UTF-8 字节序列,在性能和安全性方面与其他编程语言有所不同。 源代码 package main//字符类型 byt…...
STAR Decomposition 一种针对极端事件的信号分解方法 论文精读加复现
STAR 分解🚀 在时序预测任务中,为了情绪化信号的各种成分,例如趋势信息季节信息等往往都需要对信号进行分解。目前熟知的分解方式有很多种,经验模态分解 EMD 变分模态分解 VMD ,还有 集合经验模态分解 EEMD,…...
基于SpringBoot + Vue 的房屋租赁系统
基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色:用户、管理员、房东 管理员:个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…...
Excel中国式排名,3种方法!
大家好,我是小鱼。 什么是中国式排名呢? 举个例子比如说公司一共有10名员工进行成绩考核,如果9个人考核成绩都是90分,你是89分,按照国际惯用的排名法则:9 个人考核成绩并列第一,你第10名&…...
Flutter:跑马灯公告栏
组件 import dart:async; import package:flutter/material.dart; import package:ducafe_ui_core/ducafe_ui_core.dart;class MarqueeNotice extends StatefulWidget {/// 公告数据列表,每条公告包含title和descfinal List<Map<String, String>> notic…...
Jmeter下载及环境配置
Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址: https://www.oracle.com/cn/java/technologies/downloads/ 注意:需要自己注册账号 下载完成,解压后的目录为: …...
【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统
在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…...
OpenCV特征提取与深度学习CNN特征提取差异
一、特征生成方式 OpenCV传统方法 手工设计特征:依赖人工设计的算法(如SIFT、FAST、BRIEF)提取图像中的角点、边缘等低层次特征,需手动调整参数以适应不同场景。数学驱动:基于梯度变化、几何变换等数学规…...
微信小程序threejs三维开发
微信小程序threejs开发 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…...
关于在vue3中使用keep-live+component标签组合,实现对指定某些组件进行缓存或不缓存的问题
今天收到一个需求,在vue3写的动态组件条件下,要对指定的几个vue组件进行缓存。 我们用到了keep-livecomponent标签进行动态的渲染 可以通过exclude(排除)和include(包含)来进行指定缓存 <el-tabs v-model"activeName" type"card"…...
[Java实战]性能优化qps从1万到3万
一、问题背景 事情起因是项目上springboot项目提供的tps达不到客户要求,除了增加服务器提高tps之外,作为团队的技术总监,架构师,技术扛把子,本着我不入地狱谁入地狱的原则,决心从代码上优化,让客户享受到飞一般的感觉。虽然大多数编程工作在写下第一行代码时已经完成…...
30天学习Java第四天——设计模式
设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结,它是开发人员在软件设计时,对常见问题的解决方案的总结和抽象。 一句话就是,设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...
