mybatis
2025/6/5大约 2 分钟
太好了,MyBatis 是一个结构清晰、层次分明的优秀 ORM 框架,非常适合做源码阅读练习。下面我为你制定一个循序渐进的 MyBatis 源码阅读路线,从配置加载到执行 SQL 的全过程,并附上关键类与阅读建议。
🧭 一、整体阅读策略:配置 → 构建 → 执行 → 插件机制
📘 二、阅读路线详情
🧩 阶段 1:配置加载(XML 解析)
🔍 入口类:SqlSessionFactoryBuilder.build(InputStream)
核心类链:
SqlSessionFactoryBuilder
↓
XMLConfigBuilder
↓
Configuration(配置对象)重点关注:
XMLConfigBuilder.parseConfiguration():如何解析<mappers>、<environments>、<settings>XMLMapperBuilder:负责解析具体 SQL 映射文件(mapper XML)
📌 建议:
- 看完后你可以试着打印
Configuration实例,查看都加载了什么。
🏗️ 阶段 2:SqlSession 构建与管理
🔍 入口类:SqlSessionFactory.openSession()
核心类链:
SqlSessionFactory → DefaultSqlSessionFactory
↓
SqlSession → DefaultSqlSession关键点:
openSession()是如何创建数据库连接(环境、事务、执行器)- MyBatis 是如何用
Executor来调度 SQL 执行的
🔍 阶段 3:Mapper 接口的动态代理实现
🔍 使用点:sqlSession.getMapper(UserMapper.class)
核心类链:
MapperProxyFactory → MapperProxy
↓
MapperMethod → 执行方法关键类:
MapperProxy.invoke():拦截接口调用MapperMethod.execute():执行 SQL 调用链入口
📌 建议:
- 在这里打断点,调试实际方法调用的执行过程。
🧠 阶段 4:SQL 执行流程
🔍 关键执行入口:Executor.query() / Executor.update()
核心类链:
MappedStatement → SqlSource → BoundSql
↓
ParameterHandler(入参)
↓
StatementHandler(创建 JDBC 语句)
↓
ResultSetHandler(结果集处理)关键类说明:
| 类名 | 作用 |
|---|---|
MappedStatement | 包含 SQL、参数类型、结果类型等配置 |
SqlSource | 将 XML 中的动态 SQL 转成 BoundSql |
Executor | 负责调度整个 SQL 执行过程 |
ResultMap | 映射结果到对象 |
📌 建议:
- 尝试查看实际的
BoundSql.getSql(),观察动态 SQL 是怎么最终生成的。
🔌 阶段 5:插件机制(拦截器)
🔍 插件配置:
<plugins>
<plugin interceptor="com.example.MyInterceptor">
<property name="foo" value="bar"/>
</plugin>
</plugins>核心类链:
InterceptorChain → Plugin.wrap()
↓
动态代理生成插件代理对象📌 推荐尝试自己写一个 Interceptor 插件,拦截 Executor 或 StatementHandler,调试观察行为变化。
📍 三、建议的阅读顺序总结
SqlSessionFactoryBuilder→Configuration(配置加载)SqlSessionFactory.openSession()(会话创建)getMapper()→MapperProxy(动态代理)MappedStatement→Executor(SQL 执行过程)- 插件链
Interceptor(扩展机制)
🛠️ 四、推荐调试方法
用
Spring Boot + MyBatis搭建最简单 demo,开启日志:mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl打断点从
UserMapper.selectById()跟踪执行路径
🎯 五、额外提升工具
| 工具 | 用法 |
|---|---|
| MyBatis源码类图 | 在线工具整理类图 |
| PlantUML | 绘制类图帮助理解类之间关系 |
| IDEA UML 视图 | Cmd+Alt+U(类图)查看类结构图 |
如果你告诉我你现在看到的是哪一段代码,或者遇到不理解的类/方法,我可以为你做局部解析。是否需要我提供一张完整的 MyBatis 核心类图?