学习 MyBatis 源码,特别是结合 mybatis-spring-boot-starter,是理解 Java 持久层框架设计模式、Spring Boot 自动化配置以及动态代理机制的绝佳途径。
建议遵循 "由浅入深、先宏观后微观、从外部触发到内部原理" 的原则。以下为学习大纲:
阶段一:环境搭建与前置准备(知其然)
在深入源码前,必须先理清 MyBatis 的基本组件及其在 Spring Boot 中的表现。
- Demo 搭建: 编写一个最简单的 Spring Boot + MyBatis 示例(包含
Mapper接口、XML映射文件)。 - 配置分析: 研究
application.yml中的mybatis.configuration配置项。 - 关键断点定位: 标记
SqlSessionFactory、SqlSession、MapperProxy等核心类。
阶段二:Spring Boot 集成原理(入口寻找)
这是很多人的盲区。理解 MyBatis 是如何"自动"跑起来的。
-
自动配置类: 研读
MybatisAutoConfiguration。 -
了解
SqlSessionFactory是如何作为 Bean 被创建的。 -
了解
SqlSessionTemplate的作用(它是线程安全的SqlSession包装)。 -
Mapper 扫描机制:
-
分析
@MapperScan的原理。 -
核心类:
ClassPathMapperScanner和MapperFactoryBean(这是接口变 Bean 的关键)。
阶段三:MyBatis 核心生命周期(宏观架构)
将源码拆解为三个阶段:初始化 -> 代理产生 -> 执行请求。
1. 配置解析阶段 (Initialization)
- 核心:
SqlSessionFactoryBuilder和XMLConfigBuilder。 - 目标: 理解 MyBatis 如何把
mybatis-config.xml或 YAML 配置解析成内存中的Configuration对象。
2. Mapper 代理生成 (Proxy)
- 核心:
MapperProxyFactory和MapperProxy。 - 目标: 搞清楚为什么你只写了接口,MyBatis 就能帮你创建实现类。深入理解 JDK 动态代理 在这里的应用。
3. SQL 执行流程 (Execution) - 最核心部分
- 执行器 (Executor):
SimpleExecutor、ReuseExecutor、BatchExecutor以及装饰者CachingExecutor。 - 四大对象 (The Big Four):
Executor:调度执行。StatementHandler:处理 JDBC Statement。ParameterHandler:处理参数映射。ResultSetHandler:处理结果集转换(ORM 的核心)。
阶段四:高级特性与插件原理(进阶提升)
深入理解 MyBatis 的扩展性设计。
-
一级缓存与二级缓存: 源码分析缓存的失效时机,以及
PerpetualCache的实现。 -
插件机制 (Plugins):
-
研究
Interceptor接口。 -
理解 MyBatis 如何利用 责任链模式 对四大对象进行拦截。
-
延迟加载: 了解
Javassist或Cglib是如何实现懒加载代理的。
阶段五:设计模式总结(思维升华)
MyBatis 是设计模式的教科书,学习时要有意识地去识别:
| 模式 | 应用场景 |
|---|---|
| 工厂模式 | SqlSessionFactory 的创建 |
| 代理模式 | MapperProxy 接口实现 |
| 装饰器模式 | CachingExecutor 对基本执行器的增强 |
| 模板方法模式 | BaseExecutor 定义执行骨架 |
| 责任链模式 | InterceptorChain 处理插件 |
💡 学习建议
- Debug 技巧: 紧盯
SqlSession.getMapper()和MapperProxy.invoke()这两个关键点。 - 看图说话: 学习过程中,尝试自己画出时序图(Sequence Diagram),梳理从 Controller 调用 Mapper 到数据库返回结果的全过程。
- 弱化 XML 解析: 不要花太多时间在
XMLConfigBuilder的繁琐解析逻辑上,那只是体力活,重点看解析后的数据结构。