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

发布于:2025-03-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

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