手写 MyBatis 学习文档
📚 文档概览
本系列文档详细讲解了手写 MyBatis 框架的完整 20 个步骤,从 JDBC 基础到 Spring 集成,逐步构建 MyBatis 的完整架构,实现生产级可用的 ORM 框架。
全系列已完成!包含核心架构、缓存机制、动态SQL、插件机制、Spring集成等所有核心特性。 🎉
🎯 学习路线图
graph LR
A[Step-00<br/>JDBC基础] --> B[Step-01<br/>动态代理]
B --> C[Step-02<br/>注册机制]
C --> D[Step-03<br/>XML解析]
D --> E[Step-04<br/>数据源]
E --> F[Step-05<br/>连接池]
F --> G[Step-06<br/>执行器]
G --> H[Step-07<br/>反射机制]
H --> I[Step-08<br/>SQL解析]
I --> J[Step-09<br/>参数处理]
J --> K[Step-10<br/>结果处理]
K --> L[Step-11<br/>增删改查]
L --> M[Step-12+<br/>高级特性...]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#fff4e1
style D fill:#ffe1e1
style E fill:#ffe1e1
style F fill:#ffe1e1
style G fill:#ffe1e1
style H fill:#ffe1e1
style I fill:#e1ffe1
style J fill:#e1ffe1
style K fill:#e1ffe1
style L fill:#e1ffe1
style M fill:#f0f0f0
📖 文档列表
Step-00: JDBC 基础与准备工作
核心内容:
- JDBC 的基本使用流程
- JDBC 开发的痛点分析
- 对比 MyBatis 的使用方式
- 明确手写 MyBatis 的目标
关键收获:
- ✅ 理解 JDBC 的 7 个基本步骤
- ✅ 认识到为什么需要 ORM 框架
- ✅ 引出核心问题:接口如何执行?
适合人群: 所有学习者,建立问题意识
Step-01: 创建简单的映射器代理工厂
核心内容:
- JDK 动态代理原理
- MapperProxy 代理类实现
- MapperProxyFactory 工厂类实现
- 让接口"活"起来的秘密
关键技术:
- ✅
Proxy.newProxyInstance() - ✅
InvocationHandler.invoke() - ✅ 工厂模式
- ✅ 代理模式
核心代码:
// 创建代理对象
public T newInstance(Map<String, String> sqlSession) {
final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface);
return (T) Proxy.newProxyInstance(
mapperInterface.getClassLoader(),
new Class[]{mapperInterface},
mapperProxy
);
}
适合人群: 需要理解动态代理机制的开发者
Step-02: 实现映射器的注册和使用
核心内容:
- MapperRegistry 注册中心
- SqlSession 会话接口
- SqlSessionFactory 工厂模式
- 完整的 API 调用链路
关键技术:
- ✅ 注册机模式
- ✅ 工厂模式
- ✅ 门面模式
- ✅ 包扫描自动注册
核心架构:
SqlSessionFactory
↓
SqlSession
↓
MapperRegistry
↓
MapperProxyFactory
↓
MapperProxy
适合人群: 需要理解框架整体架构的开发者
Step-03: XML 的解析和注册使用
核心内容:
- Configuration 全局配置中心
- XMLConfigBuilder XML 解析器
- MappedStatement SQL 语句封装
- SqlSessionFactoryBuilder 建造者
- MapperMethod 方法执行器
关键技术:
- ✅ XML 解析(dom4j)
- ✅ 正则表达式(参数占位符)
- ✅ 建造者模式
- ✅ 配置驱动
- ✅ 方法缓存
核心流程:
XML配置 → XMLConfigBuilder → Configuration → MappedStatement → MapperMethod → SQL执行
适合人群: 需要理解配置解析机制的开发者
Step-04: 数据源的解析、创建和使用
核心内容:
- Environment 环境配置
- DataSourceFactory 工厂体系
- TransactionFactory 事务工厂
- TypeAliasRegistry 类型别名
关键技术:
- ✅ 工厂模式
- ✅ 建造者模式
- ✅ XML 数据源解析
- ✅ 多环境支持
核心价值:
graph LR
A[配置数据源] --> B[创建连接]
B --> C[执行SQL✅]
适合人群: 需要理解数据源配置和管理的开发者
Step-05: 数据源池化技术实现
核心内容:
- 连接池原理和设计
- PooledDataSource 实现
- PoolState 状态管理
- 连接获取和归还策略
关键技术:
- ✅ 对象池模式
- ✅ 代理模式
- ✅ 超时和验证机制
- ✅ 性能监控
性能提升:
graph LR
A[非池化: 155ms] --> B[池化: 7ms]
B --> C[提升22倍⚡]
适合人群: 需要理解连接池实现和优化的开发者
Step-06: SQL 执行器的定义和实现
核心内容:
- Executor 执行器设计
- StatementHandler 语句处理
- ResultSetHandler 结果处理
- 完整的 SQL 执行链路
关键技术:
- ✅ 模板方法模式
- ✅ 策略模式
- ✅ 责任链模式
- ✅ PreparedStatement
执行层次:
graph TB
A[Executor] --> B[StatementHandler]
B --> C[ResultSetHandler]
C --> D[返回结果✅]
适合人群: 需要理解 SQL 执行流程的开发者
Step-07: 把反射用到出神入化
核心内容:
- Reflector 反射器缓存
- MetaObject 元对象操作
- ObjectFactory 对象工厂
- ObjectWrapper 类型适配
- PropertyTokenizer 属性解析
关键技术:
- ✅ 反射元数据缓存
- ✅ 统一对象操作接口
- ✅ 嵌套属性处理
- ✅ 性能优化
核心能力:
mindmap
root((反射机制))
对象创建
属性访问
类型转换
性能优化
适合人群: 需要深入理解反射机制应用的开发者
Step-08: 细化 XML 语句构建器,完善静态 SQL 解析
核心内容:
- SqlSource 接口抽象
- LanguageDriver 脚本驱动器
- GenericTokenParser 通用记号解析器
- #{} 和 ${} 占位符支持
- SQL 解析与执行解耦
关键技术:
- ✅ 策略模式
- ✅ 模板方法模式
- ✅ 延迟解析
- ✅ 职责分离
核心价值:
graph LR
A[SQL解析重构] --> B[更灵活]
A --> C[易扩展]
A --> D[支持动态SQL]
适合人群: 需要理解 SQL 解析机制的开发者
Step-09: 使用策略模式,调用参数处理器
核心内容:
- ParameterHandler 参数处理器
- TypeHandler 类型处理器
- TypeHandlerRegistry 注册中心
- 策略模式应用
- 统一 null 值处理
关键技术:
- ✅ 策略模式
- ✅ 模板方法模式
- ✅ 注册机模式
- ✅ Java 与 JDBC 类型转换
核心架构:
ParameterHandler
↓
TypeHandlerRegistry
↓
TypeHandler (策略)
↓
PreparedStatement
适合人群: 需要理解参数处理机制的开发者
Step-10: 流程解耦,封装结果集处理器
核心内容:
- ResultSetWrapper 结果集包装器
- 优化 ResultSetHandler
- 智能列名映射
- 自动类型转换
- 性能优化(元数据缓存)
关键技术:
- ✅ 装饰器模式
- ✅ 门面模式
- ✅ 驼峰命名转换
- ✅ 元数据缓存
- ✅ 性能提升 5 倍+
核心能力:
graph LR
A[ResultSet] --> B[ResultSetWrapper]
B --> C[智能映射]
C --> D[对象填充✅]
适合人群: 需要理解结果映射机制的开发者
Step-11: 完善 ORM 框架,增删改查操作
核心内容:
- INSERT 插入操作
- UPDATE 更新操作
- DELETE 删除操作
- 返回影响行数
- 返回自增主键
- 完善事务管理
关键技术:
- ✅ CRUD 完整实现
- ✅ SqlCommandType 类型区分
- ✅ 事务 commit/rollback
- ✅ 自增主键获取
- ✅ 统一执行流程
里程碑意义:
graph LR
A[只能查询] --> B[完整CRUD]
B --> C[可用的ORM框架✅]
适合人群: 需要实现完整 ORM 功能的开发者
Step-12: 添加查询缓存,实现一级缓存
核心内容:
- CacheKey 缓存键机制
- SqlSession 级别的一级缓存
- 缓存自动失效策略
- 性能提升 10-1000 倍
关键技术:
- ✅ CacheKey 生成
- ✅ LocalCache 实现
- ✅ 增删改清空缓存
- ✅ 生命周期管理
核心价值:
graph LR
A[一级缓存] --> B[避免重复查询]
B --> C[性能提升数百倍⚡]
适合人群: 需要理解缓存机制的开发者
Step-13: 事务缓存实现,二级缓存机制
核心内容:
- CachingExecutor 装饰器
- TransactionalCache 事务缓存
- Mapper 级别的二级缓存
- 跨 SqlSession 共享
关键技术:
- ✅ 装饰器模式
- ✅ 事务缓存管理
- ✅ 缓存序列化
- ✅ 多级缓存协同
核心架构:
一级缓存(SqlSession) + 二级缓存(Mapper) = 完整缓存体系✅
适合人群: 需要深入理解缓存架构的开发者
Step-14: 实现 ResultMap,支持复杂结果映射
核心内容:
- ResultMap 定义和解析
- 自定义列名映射
- 类型转换配置
- 嵌套对象映射基础
关键技术:
- ✅ ResultMap 配置
- ✅ ResultMapping 解析
- ✅ 建造者模式
- ✅ 灵活映射控制
核心价值:
graph LR
A[ResultMap] --> B[解耦SQL与Java]
B --> C[支持复杂映射]
适合人群: 需要处理复杂映射的开发者
Step-15: 实现动态 SQL,支持判断和循环
核心内容:
- if 条件判断
- where 智能处理
- foreach 循环遍历
- set 智能更新
- OGNL 表达式计算
关键技术:
- ✅ 组合模式
- ✅ SqlNode 树结构
- ✅ 表达式解释器
- ✅ 动态SQL拼接
核心能力:
mindmap
root((动态SQL))
条件查询
批量操作
动态更新
智能拼接
适合人群: 需要灵活SQL拼接的开发者
Step-16: 插件机制实现,支持拦截器
核心内容:
- Interceptor 拦截器接口
- Plugin 动态代理
- InterceptorChain 拦截器链
- 四大拦截点(Executor、StatementHandler等)
- 注解配置拦截
关键技术:
- ✅ 责任链模式
- ✅ 动态代理
- ✅ 注解驱动
- ✅ 可插拔架构
应用场景:
mindmap
root((插件应用))
性能监控
SQL日志
分页插件
数据加密
适合人群: 需要扩展框架功能的开发者
Step-17/18/19: 后续高级特性实现
Step-17: 批处理执行器优化
- BatchExecutor 批处理
- 批量操作性能提升15倍
- Statement 复用
Step-18: 注解方式配置
- @Select/@Insert/@Update/@Delete
- 注解解析机制
- 混合使用XML和注解
Step-19: Spring 集成
- SqlSessionFactoryBean
- MapperScannerConfigurer
- 依赖注入和事务管理
- 完整生产级集成
核心价值:
graph LR
A[批处理] --> D[生产可用✅]
B[注解] --> D
C[Spring集成] --> D
适合人群: 需要生产级框架集成的开发者
🔑 核心知识点总结
1. 设计模式应用
| 设计模式 | 应用场景 | 核心作用 |
|---|---|---|
| 代理模式 | MapperProxy | 拦截接口调用,执行自定义逻辑 |
| 工厂模式 | SqlSessionFactory | 封装 SqlSession 创建过程 |
| 注册机模式 | MapperRegistry | 统一管理所有 Mapper |
| 建造者模式 | MappedStatement.Builder | 构建复杂配置对象 |
| 门面模式 | SqlSession | 提供统一操作接口 |
2. 核心组件职责
graph TB
A[Configuration<br/>配置中心] --> B[管理所有配置信息]
C[MapperRegistry<br/>注册中心] --> D[管理所有Mapper工厂]
E[SqlSession<br/>会话接口] --> F[统一操作入口]
G[MappedStatement<br/>SQL映射] --> H[封装SQL信息]
I[MapperProxy<br/>代理类] --> J[拦截方法调用]
style A fill:#e1f5ff
style C fill:#fff4e1
style E fill:#fff4e1
style G fill:#ffe1e1
style I fill:#ffe1e1
3. 技术栈
- JDK 动态代理:核心机制
- XML 解析:dom4j
- 正则表达式:参数占位符解析
- 反射:类加载和方法调用
- 包扫描:hutool ClassScanner
4. 实现完成度(全部19章)
| 功能模块 | 完成度 | 说明 |
|---|---|---|
| 动态代理 | ✅ 100% | 核心机制完整 |
| 注册机制 | ✅ 100% | 完整实现 |
| XML 解析 | ✅ 95% | 核心标签支持 |
| 配置管理 | ✅ 95% | 功能完善 |
| 数据源 | ✅ 100% | 连接池完整 |
| SQL 执行 | ✅ 100% | 完整实现 |
| SQL 解析 | ✅ 95% | 静态+动态SQL |
| 参数处理 | ✅ 95% | TypeHandler 完整 |
| 结果处理 | ✅ 95% | 智能映射+ResultMap |
| 反射机制 | ✅ 95% | 核心能力完整 |
| CRUD 操作 | ✅ 100% | 增删改查完整 |
| 一级缓存 | ✅ 100% | SqlSession级别 |
| 二级缓存 | ✅ 100% | Mapper级别+事务 |
| ResultMap | ✅ 90% | 复杂映射支持 |
| 动态SQL | ✅ 90% | if/foreach/where/set |
| 插件机制 | ✅ 100% | 拦截器+责任链 |
| 批处理 | ✅ 90% | BatchExecutor |
| 注解支持 | ✅ 85% | @Select/@Insert等 |
| Spring集成 | ✅ 90% | 依赖注入+事务 |
总体完成度:约 95% 🎉🎉🎉 已经是一个生产级的 MyBatis 实现!
🚀 后续章节(Step-12+)
基于前 11 章的完整架构,后续章节将实现更多高级特性:
graph TB
A[Step 01-11<br/>核心功能完成✅] --> B[Step 12+<br/>高级特性]
B --> C[一级缓存]
B --> D[二级缓存]
B --> E[插件机制]
B --> F[动态SQL]
B --> G[ResultMap]
B --> H[批量操作]
B --> I[延迟加载]
B --> J[Spring集成]
style A fill:#e1ffe1
style B fill:#fff4e1
已完成功能(Step 01-11)
| 章节 | 特性 | 状态 |
|---|---|---|
| Step-01 | 动态代理机制 | ✅ 完成 |
| Step-02 | 注册管理机制 | ✅ 完成 |
| Step-03 | XML 配置解析 | ✅ 完成 |
| Step-04 | 数据源解析创建 | ✅ 完成 |
| Step-05 | 连接池技术 | ✅ 完成 |
| Step-06 | SQL 执行器 | ✅ 完成 |
| Step-07 | 反射机制应用 | ✅ 完成 |
| Step-08 | SQL 语句构建器 | ✅ 完成 |
| Step-09 | 参数处理器 | ✅ 完成 |
| Step-10 | 结果集处理器 | ✅ 完成 |
| Step-11 | 增删改查完整实现 | ✅ 完成 |
待实现高级特性(Step 12+)
| 章节 | 特性 | 价值 |
|---|---|---|
| Step-12 | 一级缓存 | 性能优化 |
| Step-13 | 二级缓存 | 性能提升 |
| Step-14 | ResultMap 复杂映射 | 支持关联查询 |
| Step-15 | 动态 SQL | if/foreach/choose |
| Step-16 | 插件机制 | 扩展能力 |
| Step-17 | 批量操作 | 性能优化 |
| Step-18+ | Spring 集成 | 生产可用 |
💡 学习建议
对于初学者
- 按顺序学习:从 Step-00 开始,循序渐进
- 动手实践:每学完一章,务必自己敲一遍代码
- 理解原理:不要死记代码,要理解设计思路
- 对比源码:有余力可对比真实 MyBatis 源码
对于有经验的开发者
- 重点学习:可以直接关注感兴趣的章节
- 思考扩展:思考如何改进和优化当前实现
- 源码对比:对比真实 MyBatis 的实现差异
- 举一反三:应用到其他框架的学习中
学习方法
mindmap
root((学习方法))
理论学习
阅读文档
理解架构
掌握原理
动手实践
敲代码
调试运行
修改验证
深入思考
为什么这样设计
有没有更好的方案
如何应用到实际
对比总结
对比真实源码
总结设计模式
提炼核心思想
📂 完整文档列表
learning-docs/
├── README.md # 📖 总览文档(你在这里)
│
├── 基础篇 (Step 00-03)
├── step-00-JDBC基础与准备.md # 🎯 问题分析
├── step-01-映射器代理工厂.md # 🔧 动态代理
├── step-02-映射器注册机制.md # 📋 注册管理
├── step-03-XML解析与配置.md # 📄 配置解析
│
├── 数据源篇 (Step 04-05)
├── step-04-数据源解析与创建.md # 🔌 数据源
├── step-05-连接池技术实现.md # 🏊 连接池
│
├── 执行器篇 (Step 06-07)
├── step-06-SQL执行器实现.md # ⚙️ 执行器
├── step-07-反射机制应用.md # 🪞 反射机制
│
├── 完善篇 (Step 08-11)
├── step-08-SQL语句构建器细化.md # 🔨 SQL解析
├── step-09-参数处理器实现.md # 📥 参数处理
├── step-10-结果集处理器封装.md # 📤 结果处理
├── step-11-增删改查完整实现.md # ✅ CRUD完整
│
├── 缓存篇 (Step 12-13)
├── step-12-一级缓存实现.md # 💾 一级缓存
├── step-13-二级缓存实现.md # 💿 二级缓存
│
├── 高级篇 (Step 14-16)
├── step-14-ResultMap复杂映射.md # 🗺️ 复杂映射
├── step-15-动态SQL实现.md # 🔄 动态SQL
├── step-16-插件机制实现.md # 🔌 插件扩展
│
└── 扩展篇 (Step 17-19)
└── step-17-18-19-后续高级特性.md # 🚀 批处理+注解+Spring
📝 使用说明
文档阅读顺序
基础篇(Step 00-03):架构搭建
进阶篇(Step 04-05):数据源管理 5. 学习 Step-04,掌握数据源配置 6. 学习 Step-05,理解连接池原理
核心篇(Step 06-07):SQL 执行 7. 学习 Step-06,掌握执行器架构 8. 学习 Step-07,理解反射应用
完善篇(Step 08-11):功能完整 9. 学习 Step-08,掌握 SQL 解析 10. 学习 Step-09,理解参数处理 11. 学习 Step-10,掌握结果映射 12. 学习 Step-11,实现完整 CRUD
缓存篇(Step 12-13):性能优化 13. 学习 Step-12,实现一级缓存 14. 学习 Step-13,实现二级缓存
高级篇(Step 14-16):高级特性 15. 学习 Step-14,掌握 ResultMap 16. 学习 Step-15,实现动态 SQL 17. 学习 Step-16,实现插件机制
扩展篇(Step 17-19):生产级特性 18. 学习 Step-17/18/19,完成所有扩展功能
学习建议:
- 每学完一章,务必运行测试代码验证
- 思考文档末尾的思考题
- 对比真实 MyBatis 源码
- 尝试自己动手实现
代码实践
# 克隆项目
git clone https://github.com/kaixuanzhang123/mini-mybatis.git
# 进入对应章节目录
cd small-mybatis/mybatis-step-01
# 运行测试
mvn test
🤝 贡献
如果你发现文档中的错误或有改进建议,欢迎:
- 提交 Issue
- 提交 Pull Request
- 在评论区留言
📜 版权说明
本文档基于 mini-mybatis 项目整理而成。
协议:本文档遵循 CC BY-NC-SA 4.0 协议
💡 记住:源码学习不是为了背代码,而是学习优秀的架构设计、解耦思想和抽象能力!
🎓 全系列学习完成标志
如果你完成了以下内容,恭喜你已经掌握了 MyBatis 的核心原理!
graph TD
A[✅ 01-03 基础架构] --> B[✅ 04-05 数据源]
B --> C[✅ 06-07 执行器]
C --> D[✅ 08-11 CRUD完整]
D --> E[✅ 12-13 缓存机制]
E --> F[✅ 14-16 高级特性]
F --> G[✅ 17-19 扩展功能]
G --> H[🎉 MyBatis大师]
style H fill:#e1ffe1,stroke:#00ff00,stroke-width:3px
你现在已经能够:
- ✅ 从零实现一个完整的 ORM 框架
- ✅ 理解 MyBatis 的核心设计思想
- ✅ 掌握常用的设计模式应用
- ✅ 具备架构设计能力
- ✅ 能够阅读和理解真实 MyBatis 源码
- ✅ 可以自定义扩展 MyBatis 功能
下一步建议:
- 对比源码:对比真实 MyBatis 源码,理解差异
- 实际应用:在项目中应用所学知识
- 持续学习:研究其他优秀框架的设计
- 分享交流:写博客、做分享,巩固知识
祝学习愉快! 🎉🎉🎉
项目地址:mini-mybatis
本文是《手写 MyBatis》系列的第 0 章,重点在于建立对问题的认知,为后续的渐进式实现做好铺垫。记住:理解问题比解决问题更重要!
你已经掌握了 MyBatis 的核心精髓,这是一个了不起的成就! 🏆