sqlsessionfactorybuilder解析xml的核心是先由xmlconfigbuilder解析全局配置,再由xmlmapperbuilder解析映射文件,最终组装成configuration对象。

SqlSessionFactoryBuilder 解析 XML 的核心动作是:用 XMLConfigBuilder 读取并结构化配置,再交由 XMLMapperBuilder 深度解析映射文件,最终组装成一个完整的 Configuration 对象。
XMLConfigBuilder 负责全局配置解析
当你调用 new SqlSessionFactoryBuilder().build(reader),底层会立即创建一个 XMLConfigBuilder 实例。它内部封装了基于 DOM 的 XPathParser(不是纯 SAX,实际混合使用),用于逐节点遍历 <configuration></configuration> 根元素下的所有子标签:
-
<properties></properties>:加载外部属性,支持resource或url,并合并到运行时变量中 -
<settings></settings>:转为Properties对象,如cacheEnabled、lazyLoadingEnabled等开关项被提取并校验 -
<typealiases></typealiases>:注册别名,支持<typealias></typealias>标签或包扫描,类名自动映射为短名 -
<plugins></plugins>:实例化拦截器(Interceptor),按声明顺序加入插件链 -
<environments></environments>:解析数据源与事务管理器,根据environment参数激活指定环境 -
<mappers></mappers>:不直接解析 SQL,而是收集<mapper></mapper>的resource、url或class属性,为后续映射文件加载做准备
XMLMapperBuilder 负责 SQL 映射文件解析
在 XMLConfigBuilder 处理完 <mappers></mappers> 后,会对每个 resource="com/example/mapper/UserMapper.xml" 创建一个 XMLMapperBuilder。它真正把 XML 中的 SQL 片段翻译成可执行对象:
- 读取
<mapper namespace="com.example.mapper.UserMapper"></mapper>,绑定到对应接口类型 - 将每个
<select id="selectById"></select>转为MappedStatement,包含 SQL 文本、参数类型、结果映射规则 - 解析
<resultmap></resultmap>生成ResultMap对象,处理嵌套查询、集合映射、自动映射策略 - 识别
<sql></sql>片段并缓存为SqlFragment,供<include></include>引用 - 所有生成的
MappedStatement最终注册进Configuration.mappedStatements的Map<string mappedstatement></string>
Configuration 是整个解析过程的归宿
所有解析结果不会散落各处,而是统一汇聚到一个 Configuration 实例中。它就像 MyBatis 的“内存配置中心”,保存着:
- 数据源(
Environment)、类型处理器(TypeHandlerRegistry)、插件列表(interceptorChain) - 所有已注册的 Mapper 接口类型(
mapperRegistry)及其代理工厂 - 全部
MappedStatement,key 是namespace + "." + id(例如"com.example.mapper.UserMapper.selectById")
最后,XMLConfigBuilder.parse() 返回这个 Configuration,再由 SqlSessionFactoryBuilder.build(Configuration) 封装为 DefaultSqlSessionFactory —— 这就是你后续获取 SqlSession 的源头。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











