MyBatis-Plus 源码分析-自动填充机制深度解析:从原理到实战
文章目录
- 一、概述
- 二、项目结构总览
- 三、核心组件详解
- 3.1 MetaObjectHandler 接口设计
- 3.2 FieldFill 枚举:字段填充策略
- 3.3 元数据驱动的严格匹配
- 3.4 MybatisParameterHandler:填充触发时机
- 四、填充策略对比:fillStrategy vs strictFillStrategy
- 4.1 fillStrategy(宽松填充)
- 4.2 strictFillStrategy(严格填充)
- 4.3 选择建议
- 五、严格填充模式深度解析
- 5.1 StrictFill 类设计
- 5.2 strictInsertFill 与 strictUpdateFill
- 5.3 严格填充的验证机制
- 六、实战案例
- 6.1 案例一:时间戳自动填充(插入/更新)
- 6.2 案例二:用户信息自动填充(操作人)
- 6.3 案例三:自定义注解驱动的批量填充
- 6.4 案例四:租户信息填充
- 6.5 案例五:状态字段填充
- 6.6 案例六:基础自动填充(业务字段与序列号)
- 6.6 案例七:复杂填充逻辑(按用户权限动态填充)
- 七、填充顺序与优先级控制
- 八、性能考量
- 九、故障排查指南
- 9.1 字段未被填充
- 9.2 字段被错误覆盖
- 9.3 严格填充未生效
- 9.4 注解解析失败
- 十、总结
- 附录:优先级与覆盖规则速查
一、概述
在日常业务开发中,我们经常需要在插入或更新数据时自动填充一些公共字段,比如创建时间、更新时间、创建人、修改人、租户ID等。如果每个业务方法都手动设置这些字段,不仅代码冗余,还容易遗漏。
MyBatis-Plus 提供了一套完整的自动填充机制,通过MetaObjectHandler接口与@TableField注解的配合,实现了"声明即填充"的能力。开发者只需在实体字段上标注填充策略,并实现一个全局处理器,即可在插入/更新操作时自动完成字段赋值,无需侵入业务代码。
本文基于 MyBatis-Plus 3.5.16 源码,从核心组件、架构设计、严格填充模式、自定义实践等多个维度,系统性地解析自动填充机制。
二、项目结构总览
自动填充功能涉及的核心代码分布在以下模块中:
| 模块 | 核心文件 | 作用 |
|---|---|---|
| 核心接口层 | MetaObjectHandler.java | 定义填充入口与策略方法 |
| 注解层 | FieldFill.java、TableField.java | 字段填充策略枚举与注解声明 |
