MyBatis-Plus的MetaObjectHandler

发布时间:2026/7/10 8:19:18
MyBatis-Plus的MetaObjectHandler MetaObjectHandler 是 MyBatis-Plus 框架提供的一个元对象处理器接口它的核心作用就是实现数据库表字段的自动填充。简单来说它用来解决项目中“每次插入或更新时都要手动设置创建时间、更新时间、创建人、修改人”这类重复性劳动的问题。它的核心用途业务场景在实际开发中数据库表几乎都会包含以下公用字段create_time创建时间update_time更新时间create_user创建人IDupdate_user修改人ID如果每次新增/修改都在业务代码里 setCreateTime(new Date())代码会非常冗余。MetaObjectHandler 允许你在执行 INSERT 或 UPDATE 操作时由框架自动为这些字段赋值业务代码无需再关注。它的工作原理它利用 MyBatis-Plus 的拦截器机制在执行 SQL 之前拦截请求通过反射获取实体类字段根据字段上的注解策略如 INSERT、UPDATE自动填入指定的值。如何使用三步走第一步写一个处理器类继承 MetaObjectHandlerjavaComponent // 交给Spring管理public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时填充INSERT Override public void insertFill(MetaObject metaObject) { // 自动填充创建时间如果字段名为 createTime this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); // 自动填充更新时间 this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); // 自动填充创建人假设从上下文中获取当前用户ID this.strictInsertFill(metaObject, createUser, Long.class, getCurrentUserId()); } // 更新时填充UPDATE Override public void updateFill(MetaObject metaObject) { // 自动填充更新时间每次更新都变 this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); // 自动填充修改人 this.strictUpdateFill(metaObject, updateUser, Long.class, getCurrentUserId()); } private Long getCurrentUserId() { // 这里可以从 ThreadLocal 或 SecurityContext 中取当前登录用户ID return 1L; }}第二步在实体类字段上添加 TableField 注解标记哪些字段需要自动填充以及在什么时机填充。javapublic class YourEntity {// 插入时填充TableField(fill FieldFill.INSERT)private LocalDateTime createTime;// 更新时填充插入时也会填因为 INSERT_UPDATE 包含插入 TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; TableField(fill FieldFill.INSERT) private Long createUser; TableField(fill FieldFill.UPDATE) private Long updateUser;}第三步业务代码中正常调用 Mapper业务层直接 yourMapper.insert(entity) 或 updateById(entity)完全不需要 set 这些公共字段框架会自动填充进去。注意事项避坑指南strict 方法 vs fill 方法推荐使用 strictInsertFill 和 strictUpdateFill严格模式。它会严格执行填充策略如果实体类字段上有值默认不会覆盖除非你用 fillStrategy。字段命名要匹配metaObject 中的字段名如 “createTime”必须和实体类中的属性名完全一致驼峰命名。不要搞混了 updateTime 的逻辑插入时也要给 updateTime 赋值通常是 FieldFill.INSERT_UPDATE否则插入时该字段可能为 null 导致报错。和逻辑删除的配合如果使用了 TableLogic 逻辑删除更新时记得不要误把 deleted 字段也填充了值。总结MetaObjectHandler 就是 MyBatis-Plus 内置的“懒人神器”让你从此告别重复写 setCreateTime() 和 setUpdateTime()专注于核心业务逻辑。如果你正打算规范数据库审计字段用这个就对了。