手写 MyBatis 学习文档

15 阅读14分钟

手写 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-03XML 配置解析✅ 完成
Step-04数据源解析创建✅ 完成
Step-05连接池技术✅ 完成
Step-06SQL 执行器✅ 完成
Step-07反射机制应用✅ 完成
Step-08SQL 语句构建器✅ 完成
Step-09参数处理器✅ 完成
Step-10结果集处理器✅ 完成
Step-11增删改查完整实现✅ 完成

待实现高级特性(Step 12+)

章节特性价值
Step-12一级缓存性能优化
Step-13二级缓存性能提升
Step-14ResultMap 复杂映射支持关联查询
Step-15动态 SQLif/foreach/choose
Step-16插件机制扩展能力
Step-17批量操作性能优化
Step-18+Spring 集成生产可用

💡 学习建议

对于初学者

  1. 按顺序学习:从 Step-00 开始,循序渐进
  2. 动手实践:每学完一章,务必自己敲一遍代码
  3. 理解原理:不要死记代码,要理解设计思路
  4. 对比源码:有余力可对比真实 MyBatis 源码

对于有经验的开发者

  1. 重点学习:可以直接关注感兴趣的章节
  2. 思考扩展:思考如何改进和优化当前实现
  3. 源码对比:对比真实 MyBatis 的实现差异
  4. 举一反三:应用到其他框架的学习中

学习方法

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):架构搭建

  1. 阅读 Step-00,建立问题意识
  2. 学习 Step-01,理解动态代理
  3. 学习 Step-02,掌握注册管理
  4. 学习 Step-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 功能

下一步建议:

  1. 对比源码:对比真实 MyBatis 源码,理解差异
  2. 实际应用:在项目中应用所学知识
  3. 持续学习:研究其他优秀框架的设计
  4. 分享交流:写博客、做分享,巩固知识

祝学习愉快! 🎉🎉🎉

项目地址:mini-mybatis

本文是《手写 MyBatis》系列的第 0 章,重点在于建立对问题的认知,为后续的渐进式实现做好铺垫。记住:理解问题比解决问题更重要!

你已经掌握了 MyBatis 的核心精髓,这是一个了不起的成就! 🏆