INDEX · MyBatis
MyBatis 源码分析索引
阅读方法:每篇一个 Java 代码块:真实 MyBatis 3.5.x 源码 + 行内注释,聚焦一条机制。 按顺序读:先看接口调用怎么变成 SQL,再看 SQL 交给谁执行、缓存挂在哪。
核心机制
| 篇目 | 一句话 |
|---|---|
| 01-Mapper 动态代理 | 接口无实现类,JDK 动态代理运行期生成代理,MapperProxy 把调用翻译成 SQL |
| 02-SqlSession 与缓存 | SqlSession 是门面,Executor 真执行;一级缓存(session 内)、二级缓存(namespace 跨 session) |
| 03-配置解析与Configuration | XMLConfigBuilder 逐节点解析,Configuration 是全局注册中心 |
| 04-Executor 执行链 | selectList 到 JDBC PreparedStatement 全链路;SIMPLE/REUSE/BATCH 三种 Executor |
与其他笔记的关系
- Mapper 代理和 AOP 动态代理 是同一套 JDK 动态代理,区别:AOP 代理有实现的类做增强,MyBatis 代理纯接口翻译成 SQL
- MyBatis 由 Spring 管理时,Mapper 被注册成 bean、SqlSession 交给 Spring 事务管控,见 @Transactional 原理 的连接绑 ThreadLocal
- 底层仍是 JDBC,连接来自连接池
一次查询的完整链路
代码块收起展开
userMapper.selectById(1)
→ MapperProxy.invoke // 动态代理拦截
→ MapperMethod.execute // 按 namespace.方法名 定位 SQL
→ SqlSession.selectOne
→ CachingExecutor.query // 探二级缓存(若开)
→ BaseExecutor.query // 探一级缓存
→ SimpleExecutor.doQuery // 未命中,真查
→ StatementHandler // JDBC:建 Statement、设参、执行
→ ResultSetHandler // ResultSet 映射成 Java 对象