MyBatis 如何解析 XML 配置文件和 SQL 映射文件

news/2025/3/18 14:04:34/

MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。

MyBatis 主要解析两种类型的 XML 文件:

  1. 核心配置文件 (mybatis-config.xml): 定义 MyBatis 的全局配置信息,如数据源、事务管理器、类型别名、类型处理器、插件、映射器等。
  2. SQL 映射文件 (例如 UserMapper.xml): 定义 SQL 语句和映射规则,将 SQL 语句与 Mapper 接口的方法关联起来。

解析过程概述:

  1. 创建 XMLConfigBuilder (解析核心配置文件):

    • SqlSessionFactoryBuilderbuild() 方法会创建一个 XMLConfigBuilder 对象,用于解析核心配置文件。
    • XMLConfigBuilder 内部会创建一个 SAX 解析器 (XMLMapperEntityResolver)。
    • XMLConfigBuilder 会解析核心配置文件中的各个元素(<properties>, <settings>, <typeAliases>, <typeHandlers>, <plugins>, <environments>, <mappers> 等),并将解析结果存储到 Configuration 对象中。
  2. 创建 XMLMapperBuilder (解析 SQL 映射文件):

    • 在解析核心配置文件中的 <mappers> 元素时,XMLConfigBuilder 会为每个 SQL 映射文件创建一个 XMLMapperBuilder 对象。
    • XMLMapperBuilder 内部也会创建一个 SAX 解析器。
    • XMLMapperBuilder 会解析 SQL 映射文件中的各个元素(<mapper>, <select>, <insert>, <update>, <delete>, <resultMap>, <sql> 等),并将解析结果转换为 MappedStatement 对象,并添加到 Configuration 对象的 mappedStatements 集合中。
  3. 使用 XPath 解析 XML 元素:

    • MyBatis 使用 XPath 表达式来定位和解析 XML 文件中的各个元素。
    • XMLConfigBuilderXMLMapperBuilder 都使用 XPathParser 来解析 XPath 表达式。

核心配置文件 (mybatis-config.xml) 解析过程 (XMLConfigBuilder):

  1. 解析 <properties> 元素:

    • 读取 <properties> 标签的 resourceurl 属性,加载外部属性文件。
    • 解析 <properties> 标签内部的 <property> 子元素,获取属性名和属性值。
    • 将属性存储到 Configuration 对象的 variables 属性中(一个 Properties 对象)。
  2. 解析 <settings> 元素:

    • 解析 <settings> 标签内部的 <setting> 子元素,获取设置名和设置值。
    • 将设置存储到 Configuration 对象的相应属性中(例如,cacheEnabledlazyLoadingEnabled 等)。
  3. 解析 <typeAliases> 元素:

    • 解析 <typeAliases> 标签内部的 <typeAlias> 子元素,获取别名和对应的 Java 类型。
    • 解析 <typeAliases> 标签内部的 <package> 子元素,扫描指定包下的所有类,并自动生成别名(类名首字母小写)。
    • 将别名和类型注册到 Configuration 对象的 typeAliasRegistry 中。
  4. 解析 <typeHandlers> 元素:

    • 解析 <typeHandlers> 标签内部的 <typeHandler> 子元素,获取类型处理器类名(或实例)。
    • 解析 <typeHandlers> 标签内部的 <package> 子元素,扫描指定包下的所有类型处理器类。
    • 将类型处理器注册到 Configuration 对象的 typeHandlerRegistry 中。
  5. 解析 <objectFactory> 元素:

    • 解析<objectFactory>type属性,获取对象工厂实现类。
    • 反射创建其实例,并设置到Configuration对象。
  6. 解析 <plugins> 元素:

    • 解析 <plugins> 标签内部的 <plugin> 子元素,获取插件类的全限定名。
    • 创建插件实例,并将插件添加到 Configuration 对象的 interceptorChain 中。
  7. 解析 <environments> 元素:

    • 解析 <environments> 标签的 default 属性,获取默认的环境 ID。
    • 解析 <environments> 标签内部的 <environment> 子元素,获取环境 ID、事务管理器配置和数据源配置。
    • 根据配置创建 TransactionFactoryDataSourceFactory,并创建相应的 TransactionDataSource 实例。
    • 将环境配置存储到 Configuration 对象的 environment 属性中。
  8. 解析<databaseIdProvider>元素:

    • 解析<databaseIdProvider>type属性,获取数据库厂商标识提供类。
    • 解析其内部<property>子元素,获取不同数据库对应的标识。
  9. 解析 <mappers> 元素:

    • 解析 <mappers> 标签内部的 <mapper> 子元素,获取 SQL 映射文件的路径(resourceurlclass 属性)。
    • 解析 <mappers> 标签内部的 <package> 子元素,扫描指定包下的所有 Mapper 接口或 XML 映射文件。
    • 对于每个 SQL 映射文件,创建一个 XMLMapperBuilder 对象,并调用其 parse() 方法解析 SQL 映射文件。

SQL 映射文件 (例如 UserMapper.xml) 解析过程 (XMLMapperBuilder):

  1. 解析 <mapper> 元素:

    • 获取 <mapper> 标签的 namespace 属性,作为 Mapper 接口的全限定名。
  2. 解析 <cache> 元素(如果有):

    • 解析<cache>标签,获取缓存配置信息,创建Cache对象。
  3. 解析 <parameterMap> 元素(已废弃,不建议使用):

  • 解析 <parameterMap> 标签及其子元素,获取参数映射信息。
  1. 解析 <resultMap> 元素:

    • 解析 <resultMap> 标签及其子元素(<id>, <result>, <association>, <collection>, <discriminator>),获取结果映射规则。
    • 创建 ResultMap 对象,并添加到 Configuration 对象的 resultMaps 集合中。
  2. 解析 <sql> 元素:

    • 解析 <sql> 标签,获取可重用的 SQL 片段。
    • 将 SQL 片段存储到 Configuration 对象的 sqlFragments 集合中。
  3. 解析 <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 的全局配置信息,以及解析后的 MappedStatementResultMap 等对象。
  • MappedStatement: 代表一个 SQL 语句,包含了 SQL 语句的 ID、参数类型、结果类型、SQL 语句内容等信息。
  • ResultMap: 代表一个结果映射规则,定义了如何将查询结果集映射为 Java 对象。

总结:

MyBatis 使用 SAX 解析器和 XPath 表达式来解析 XML 配置文件。XMLConfigBuilder 负责解析核心配置文件,XMLMapperBuilder 负责解析 SQL 映射文件。解析后的配置信息存储在 Configuration 对象中,MappedStatement 对象代表 SQL 语句,ResultMap 对象代表结果映射规则。


http://www.ppmy.cn/news/1580086.html

相关文章

UnitTest框架管理测试用例——python自动化测试

UnitTest框架 UnitTest是Python自带一个单元测试框架&#xff0c;常用它来做单元测试。 注意:对于测试来说&#xff0c;UnitTest框架的作用是 自动化脚本(用例代码)执行框架————(使用UnitTest框架来管理 运行多个测试用例的) 为什么使用UnitTest框架 能够组织多个用例去执…

Android视频渲染SurfaceView强制全屏与原始比例切换

1.创建UI添加强制全屏与播放按钮 2.SurfaceView控件设置全屏显示 3.全屏点击事件处理实现 4.播放点击事件处理 5.使用接口更新强制全屏与原始比例文字 强制全屏/原始比例 点击实现

力扣hot100二刷——二叉树

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

完善 Django 框架以实现传递视频、图片给算法模块进行识别分析

要完善 Django 框架以实现传递视频、图片给算法模块进行识别分析&#xff0c;可按以下步骤进行&#xff1a; 1. 项目初始化 首先&#xff0c;确保你已经安装了 Django 和其他必要的库&#xff08;如 Pillow 用于图片处理&#xff09;。创建一个新的 Django 项目和应用&#x…

甲骨文找回二次验证的方法(超简单)

因为更换手机丢失了二次验证。 然后给客服沟通&#xff0c;获得了找到二次验证的办法&#xff0c;希望对你有用。 1、登录到账号登陆界面&#xff0c;查看地址栏当中自己的IDCE地址&#xff08;yourIDCS_Stripe_here&#xff09;部分&#xff0c;并复制。 https://idcs-yourID…

ZooKeeper的五大核心作用及其在分布式系统中的关键价值

引言 在分布式系统的复杂架构中&#xff0c;协调多个节点的一致性、可靠性和高可用性始终是技术挑战的核心。​Apache ZooKeeper作为业界广泛采用的分布式协调服务&#xff0c;凭借其简洁的树形数据模型&#xff08;ZNode&#xff09;和高效的原子广播协议&#xff08;ZAB&…

Secure and Privacy-Preserving Decentralized Federated Learning同态加密联邦学习文献阅读

Secure and Privacy-Preserving Decentralized Federated Learning for Personalized Recommendations in Consumer Electronics Using Blockchain and Homomorphic Encryption 区块链加同态联邦学习 概括 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目…

游戏引擎学习第161天

回顾并计划今天的工作 我们从头开始编写一款完整的游戏&#xff0c;完全不依赖游戏引擎和库。我们会从最基本的渲染代码开始&#xff0c;一直到高层的AI代码&#xff0c;涵盖其中的一切。 目前&#xff0c;我们正在做一些比较轻松有趣的事情&#xff0c;可以说是比较随意的内…