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

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 对象代表结果映射规则。

相关推荐
Roye_ack18 小时前
【项目实战 Day5】springboot + vue 苍穹外卖系统(Redis + 店铺经营状态模块 完结)
java·spring boot·redis·学习·mybatis
祈祷苍天赐我java之术18 小时前
Redis 缓存三大坑:击穿、穿透、雪崩的解析与解决
redis·缓存·mybatis
咖啡Beans1 天前
了解Mybatis拦截器
java·spring boot·mybatis
翟工说1 天前
Mybatis源码(2)-mapper创建过程
mybatis
Jabes.yang1 天前
互联网大厂Java面试:从Spring到Kafka的技术挑战
spring boot·spring cloud·eureka·kafka·mybatis·jpa·java面试
tuokuac2 天前
MyBatis“别名扫描”功能
java·mybatis
lunzi_fly2 天前
【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession的创建与生命周期
mybatis
对不起初见i2 天前
MyBatis-Plus 全方位深度指南:从入门到精通
java·数据库·mybatis
lunzi_fly3 天前
【源码解读之 Mybatis】【基础篇】--第4篇:Mapper 接口的动态代理机制解析
mybatis
lunz_fly19923 天前
【源码解读之 Mybatis】【基础篇】--第4篇:Mapper 接口的动态代理机制解析
mybatis