mybatis-plus 中可通过抽象基类统一定义 createtime 和 updatetime 字段并配合 metaobjecthandler 实现自动填充,需确保字段私有、提供 getter/setter、数据库类型匹配且使用 mp 内置方法触发。

在 MyBatis-Plus 中,抽象类本身不能直接参与自动填充逻辑,但你可以通过让实体类继承一个公共抽象基类,并在该基类中定义 @TableField 注解的创建时间、更新时间字段,再配合全局配置或注解驱动的自动填充机制,实现统一的时间填充。
1. 定义带自动填充字段的抽象基类
创建一个抽象类(如 BaseEntity),把通用字段(如 createTime、updateTime)声明在里面,并用 @TableField 标明填充策略:
public abstract class BaseEntity implements Serializable {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
// getter / setter 省略
}
注意:字段必须是 private 且提供 public 的 getter/setter,否则 MP 反射赋值会失败。
2. 实体类继承并开启自动填充支持
你的具体实体类(如 User)继承该抽象类即可复用字段和填充规则:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
@TableName("sys_user")
public class User extends BaseEntity {
private Long id;
private String username;
// 其他字段...
}
确保该实体类被 MP 扫描到(比如加了 @MapperScan 或使用 @Mapper),且数据库表对应字段存在(如 create_time、update_time)。
3. 配置自动填充处理器(关键步骤)
MP 不会自动填充,需手动实现 MetaObjectHandler 并注册为 Spring Bean:
- 创建实现类,重写
insertFill和updateFill方法 - 使用
metaObject.setValue()给对应字段赋值(字段名要与实体中一致) - 确保该 Bean 被 Spring 容器管理(加
@Component)
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
这里用 strictInsertFill/strictUpdateFill 更安全,它会检查字段是否存在、类型是否匹配,避免空指针或类型转换异常。
4. 注意事项与常见问题
- 数据库字段类型需与 Java 类型匹配(如 MySQL 的
DATETIME对应LocalDateTime) - 若字段名为下划线命名(如
create_time),实体中仍用驼峰(createTime),MP 默认开启驼峰转换,无需额外配置 - 如果子类重写了父类字段的 getter/setter 或用了 Lombok 的
@Data,确保 Lombok 版本兼容(建议 1.18.20+),且未意外屏蔽父类字段 - 自动填充只在调用 MP 的
insert()、updateById()等内置方法时生效;原生 SQL 或自定义 XML 不触发
不复杂但容易忽略的是:抽象类只是结构复用,真正起作用的是 MetaObjectHandler + 字段上的 @TableField(fill = ...) 组合。只要这两者对齐,继承关系就能自然生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










