MyBatis
This content is not available in your language yet.
MyBatis 不是把 SQL 隐藏起来的全自动 ORM,而是把配置、SQL、参数、结果和事务组织成一条可插拔执行管线。读懂它的关键,是追踪一个 Mapper 方法如何从代理对象变成 MappedStatement,再变成 JDBC Statement。
本册问题地图
Section titled “本册问题地图”MyBatis 把“调用一个 Java 接口”翻译成“执行一条 SQL 并恢复对象图”。这条翻译链可以拆成五个连续问题:
- 接口为什么不需要实现类? 启动期把 XML/注解编译为
MappedStatement,运行期由 Mapper 动态代理查表分派。 - 参数怎样进入 SQL?
MapperMethod整理参数,SqlSource生成BoundSql,ParameterHandler 完成 JDBC 绑定。 - 不同执行策略在哪里切换?
SqlSession提供统一入口,Executor 负责 SIMPLE、REUSE、BATCH、缓存和事务边界。 - 数据库行怎样变回对象? ResultSetHandler 结合
ResultMap、类型处理器和嵌套规则构造对象图。 - 缓存和插件为什么容易互相影响? 两者都包裹执行链:缓存可能让后续阶段短路,插件可能改变 SQL、参数与缓存 key。
读完整册后,应当能从 Mapper 方法一路追到 JDBC,再从 ResultSet 追回应答对象;遇到问题时,也能先判断故障属于配置期、执行期还是映射期。
| 项 | 值 |
|---|---|
| 仓库 | mybatis/mybatis-3 |
| 本地路径 | E:\source\java\storage\mybatis-3 |
| 分支 | master |
| Commit | 008069ad(2026-08-12) |
| 最近 tag | mybatis-3.5.18 |
本册坐标基于上述 commit。行号会随上游演进漂移,类名与方法名更稳定。
| 模块 | 职责 | 关键包 |
|---|---|---|
| 配置与构建 | XML/注解解析,生成运行时元数据 | builder、mapping |
| 会话与绑定 | SqlSession 门面、Mapper 代理 |
session、binding |
| 执行器 | 查询、更新、事务、本地缓存 | executor |
| 插件 | 对四类运行时对象做代理 | plugin |
| 类型与结果 | 参数处理、嵌套结果映射 | type、executor.resultset |
读码入口顺序
Section titled “读码入口顺序”XMLConfigBuilder#parse:配置如何进入Configuration。MapperRegistry#getMapper:接口如何变成 JDK 动态代理。MapperMethod#execute:方法如何选择select/update分支。DefaultSqlSession#selectList:会话如何调用Executor。BaseExecutor#query:缓存键、一级缓存和 JDBC 边界。DefaultResultSetHandler#handleResultSets:结果集如何组装成对象图。
| 对象 | 对照点 |
|---|---|
| Hibernate | 管理实体状态与 SQL 生成;MyBatis 保留 SQL 主导权 |
| Spring JDBC | 都围绕 JDBC 模板化;MyBatis 额外提供 Mapper、映射元数据和缓存 |
| jOOQ | jOOQ 偏类型安全 DSL;MyBatis 偏 XML/注解运行时解析 |