MyBatis-Plus 框架设计模式全景解析
MyBatis-Plus 框架设计模式全景解析
基于 MyBatis-Plus 3.5.5 生产实践,从源码到落地场景,一次性梳理 12 种核心设计模式
1 前言
为什么同样是 CRUD,MyBatis-Plus 能做到 “不写一条 SQL” ?
答案就在于 设计模式 的巧妙组合。本文结合 3.5.5 版本源码与社区案例,带你从 创建型 → 结构型 → 行为型 逐层拆解。
2 创建型模式(Creational)
| 模式 | 源码坐标 | 作用 | 一句话总结 |
|---|---|---|---|
| Builder | SqlSessionFactoryBuilder.build() | 将 XML → Configuration → SqlSessionFactory 的复杂装配步骤化 | 把 10 个参数封装成链式调用 |
| 工厂方法 | MapperProxyFactory.newInstance() | 为每个 Mapper 接口生成 JDK 动态代理 | 只写接口,不写实现 |
| 单例 | ErrorContext(ThreadLocal) | 线程级错误上下文,避免并发问题 | 一个线程一个实例 |
3 结构型模式(Structural)
| 模式 | 源码坐标 | 作用 | 一句话总结 |
|---|---|---|---|
| 代理 | MapperProxy.invoke() | 把接口方法调用转换成 JDBC 执行 | 零实现类 |
| 装饰器 | CachingExecutor 包装 SimpleExecutor | 二级缓存能力可插拔 | 套娃式增强 |
| 适配器 | Log → Slf4jImpl | 统一日志门面,兼容各种日志框架 | 换实现不碰业务代码 |
| 门面 | MybatisPlusAutoConfiguration | 对外 “一键启动”,对内屏蔽复杂装配 | Spring Boot 用户无感知初始化 |
4 行为型模式(Behavioral)
| 模式 | 源码坐标 | 作用 | 一句话总结 |
|---|---|---|---|
| 模板方法 | BaseExecutor.query() 固定算法骨架 | 子类只实现 doQuery | 复用缓存、事务、异常处理 |
| 策略 | PaginationInnerInterceptor 按 DB 方言生 SQL | MySQL/Limit、Oracle/ROWNUM 自由切换 | 运行时策略注入 |
| 责任链 | MybatisPlusInterceptor 持 List<InnerInterceptor> | 分页→乐观锁→多租户顺序执行 | 插件可插拔 |
| 迭代器 | PropertyTokenizer 解析 user.address.city | 惰性访问嵌套属性 | 降低反射开销 |
5 MyBatis-Plus 专属“组合拳”示意
用 一条链式分页代码 把 4 种模式串起来:
// 1. Builder 构造分页参数
Page<User> page = Page.<User>builder().current(1).size(10).build();// 2. 责任链:MybatisPlusInterceptor 顺序执行插件
// 3. 策略:根据 DB 类型选择分页方言
// 4. 模板方法:BaseMapper.selectPage 固定流程
IPage<User> result = userMapper.selectPage(page,Wrappers.<User>lambdaQuery().gt(User::getAge, 18));
6 如何在业务中顺势扩展
| 需求 | 套用模式 | 扩展点示例 |
|---|---|---|
| 全局审计字段 | 模板方法 | 继承 MetaObjectHandler 统一填充 |
| 多租户 SQL | 策略 | 自定义 TenantLineInnerInterceptor |
| 敏感字段脱敏 | 装饰器 | 包装 ResultSetHandler |
7 结语
掌握这些模式后,你可以:
- 读源码不再迷路——看到类名就猜职责;
- 二次开发有章法——知道在哪切入最安全;
- 面试回答成体系——从“会用”到“懂设计”。
MyBatis-Plus 并不是魔法,而是 设计模式的艺术化落地。当你理解它,就能在团队里快速打造 “私有通用方法库”,同时保持与官方升级同步。
