MyBatis用了哪些设计模式?
📌 MyBatis用了哪些设计模式?
1️⃣ 问题背景
MyBatis作为Java生态中非常经典的ORM框架,其核心设计思想并不是“重型封装”,而是强调灵活性 + 可扩展性 + 半自动映射。
在源码层面,MyBatis大量使用设计模式来解耦复杂流程,使得SQL执行、参数绑定、结果映射、插件扩展等模块可以独立演进。
理解MyBatis的设计模式,不仅是面试重点,更是理解其架构设计的关键入口。
2️⃣ 核心原理
MyBatis的执行流程可以简单拆解为:
在这个链路中,每一个阶段都对应不同的设计模式进行解耦。
- 解析阶段:模板方法 + 工厂模式
- 执行阶段:代理模式 + 策略模式
- 扩展机制:插件模式(责任链)
- 对象创建:工厂模式
- 映射转换:适配器模式
3️⃣ 数据结构分析
MyBatis源码中涉及大量核心对象结构:
| 对象 | 作用 |
|---|---|
| Configuration | 全局配置中心 |
| SqlSession | 执行入口 |
| Executor | SQL执行器 |
| MappedStatement | SQL映射对象 |
| ResultSetHandler | 结果集处理器 |
这些对象之间通过设计模式进行组合,而不是强耦合调用。
4️⃣ 算法分析(设计模式拆解)
📌 1. 工厂模式(Factory Pattern)
MyBatis中大量对象通过工厂创建,例如:
- SqlSessionFactory
- ObjectFactory
- MapperProxyFactory
作用:统一对象创建逻辑,屏蔽复杂初始化过程。
📌 2. 代理模式(Proxy Pattern)
Mapper接口没有实现类,但却可以直接调用SQL。
执行流程:
📌 3. 策略模式(Strategy Pattern)
Executor执行器有多种实现:
- SimpleExecutor
- ReuseExecutor
- BatchExecutor
不同场景选择不同执行策略。
📌 4. 模板方法模式(Template Method)
BaseExecutor定义执行流程骨架:
子类只需实现核心逻辑。
📌 5. 装饰器模式(Decorator Pattern)
MyBatis的缓存体系使用装饰器层层包装:
- 一级缓存
- 二级缓存
- 装饰缓存(LoggingCache / SynchronizedCache)
📌 6. 责任链模式(Chain of Responsibility)
插件机制(Interceptor)就是典型责任链:
插件可以插入任意节点进行拦截处理。
5️⃣ 执行流程
6️⃣ 实际案例
以最常见的UserMapper为例:
- UserMapper接口没有实现类
- 运行时由MapperProxy动态生成
- 调用方法时触发invoke
整个过程完全依赖代理模式实现解耦。
7️⃣ 优缺点分析
| 优点 | 缺点 |
|---|---|
| 高度解耦 | 学习成本较高 |
| 扩展性强 | 源码复杂 |
| 插件机制灵活 | 性能开销略增 |
8️⃣ 面试常见问题
MyBatis为什么不用实现类?
因为使用了JDK动态代理模式生成Mapper接口代理对象。
MyBatis插件原理是什么?
基于责任链模式,在Executor/StatementHandler等节点进行拦截。
Executor有哪几种实现?
SimpleExecutor、ReuseExecutor、BatchExecutor。
MyBatis如何实现解耦?
通过工厂模式 + 策略模式 + 模板方法组合实现分层解耦。
9️⃣ 总结
核心结论:MyBatis通过多种设计模式组合实现高度灵活的ORM框架。
关键模式:
- 代理模式(Mapper接口)
- 工厂模式(对象创建)
- 策略模式(Executor)
- 模板方法(执行流程)
- 装饰器模式(缓存体系)
- 责任链模式(插件机制)
本质:用设计模式实现SQL执行链路的全面解耦。
相关文章
-
Kafka消息堆积如何处理?
Kafka消息堆积如何处理?
NEW个对象 2026-06-13
-
从数据结构到算法:RBAC权限系统的完整实现解析
RBAC(Role-Based Access Control,基于角色的访问控制)是企业级权限系统的主流设计模型。 它通过“用户—角色—权限”的映射关系,将复杂的权限管理问题抽象为结构化的数据模型与可计算的访问控制算法。
NEW个对象 2026-06-08
-
AI Agent + Git 仓库自动研发流程
如果把技术文档交给 AI 智能体,然后自动生成代码并提交到代码仓库,那么本质上就是一套 AI Agent + Git 自动化研发流程。
NEW个对象 2026-06-12