
MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。
MyBatis 主要解析两种类型的 XML 文件:
解析过程概述:
创建 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 元素:
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 映射文件。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 片段。Configuration
对象的
sqlFragments
集合中。解析
<select>
,
<insert>
,
<update>
,
<delete>
元素:
id
,
parameterType
,
resultType
,
resultMap
,
statementType
,
flushCache
,
useCache
,
timeout
等)。#{}
和
${}
)。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
对象代表结果映射规则。
