千家信息网

如何理解Spring Boot集成Mybatis Plus自动填充字段

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"如何理解Spring Boot集成Mybatis Plus自动填充字段",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解Spr
千家信息网最后更新 2026年11月02日如何理解Spring Boot集成Mybatis Plus自动填充字段

这篇文章主要讲解了"如何理解Spring Boot集成Mybatis Plus自动填充字段",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解Spring Boot集成Mybatis Plus自动填充字段"吧!

一般在表设计的时候,都会在表中添加一些系统字段,比如 create_time、update_time等。

加入依赖

下面就通过 MyBatis Plus 来完成字段自动填充,首先加入 MyBatis Plus 依赖:

     com.baomidou     mybatis-plus-boot-starter     3.4.1 

创建实体类,添加填充注解

创建一个实体类,然后在需要自动填充的属性上加注解 @TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.INSERT_UPDATE) 等注解。

@Data @TableName("user") public class UserEntity extends BaseEntity {     private static final long serialVersionUID = 1L;     /**      * 主键      */     @TableId(value = "id", type = IdType.ASSIGN_ID)     private Long id;     /**      * 姓名      */     @TableField("name")     private String name;     /**      * 年龄      */     @TableField("age")     private Integer age;     /**      * 邮件      */     @TableField("email")     private String email;     /**      * 创建时间      */     @TableField(value = "create_time", fill = FieldFill.INSERT)     public Date createTime;     /**      * 修改时间      */     @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE)     public Date modifyTime; }

其中 fill 属性为字段自动填充策略,可选的参数如下所示:

public enum FieldFill {     /**      * 默认不处理      */     DEFAULT,     /**      * 插入填充字段      */     INSERT,     /**      * 更新填充字段      */     UPDATE,     /**      * 插入和更新填充字段      */     INSERT_UPDATE }

就直接创建一个 Mapper,来便于测试:

@Mapper public interface UserMapper extends BaseMapper { }

实现元对象处理器接口

MyBatis Plus 版本不同,实现方式可能会有些许不同,在 3.4.1 版本是实现 MetaObjectHandler 接口,低版本可能是继承 MetaObjectHandler 抽象类,来实现对应的方法。

下面为实现插入和更新数据的字段填充逻辑,在插入对象时,对创建时间 createTime 和修改时间 modifyTime 字段自动填充为当前时间,在更新对象时,将修改时间 modifyTime 修改为最新时间。

@Component public class CommonMetaObjectHandler implements MetaObjectHandler {     /**      * 创建时间      */     private static final String FIELD_SYS_CREATE_TIME = "createTime";     /**      * 修改时间      */     private static final String FIELD_SYS_MODIFIED_TIME = "modifyTime";      /**      * 插入元对象字段填充(用于插入时对公共字段的填充)      *      * @param metaObject 元对象      */     @Override     public void insertFill(MetaObject metaObject) {         Date currentDate = new Date();         // 插入创建时间         if (metaObject.hasSetter(FIELD_SYS_CREATE_TIME)) {             this.strictInsertFill(metaObject, FIELD_SYS_CREATE_TIME, Date.class, currentDate);         }         // 同时设置修改时间为当前插入时间         if (metaObject.hasSetter(FIELD_SYS_MODIFIED_TIME)) {             this.strictUpdateFill(metaObject, FIELD_SYS_MODIFIED_TIME, Date.class, currentDate);         }     }      /**      * 更新元对象字段填充(用于更新时对公共字段的填充)      *      * @param metaObject 元对象      */     @Override     public void updateFill(MetaObject metaObject) {         this.setFieldValByName(FIELD_SYS_MODIFIED_TIME, new Date(), metaObject);     } }

其中,默认填充策略为默认有值不覆盖,如果提供的值为 null 也不填充。如果默认填充策略不满足,可以重写 strictFillStrategy 方法以满足自己的需求。

测试字段自动填充

编写测试类来检验是否在插入和更新操作时,是否会自动填充响应的字段。

@Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class AutoFillTest {     @Resource     private UserMapper userMapper;     @Test     public void test() throws InterruptedException {         UserEntity user = new UserEntity();         user.setName("wupx");         user.setAge(18);         user.setEmail("wupx@qq.com");         userMapper.insert(user);         Long id = user.getId();         UserEntity beforeUser = userMapper.selectById(id);         log.info("before user:{}", beforeUser);         Assert.assertNotNull(beforeUser.getCreateTime());         Assert.assertNotNull(beforeUser.getModifyTime());         beforeUser.setAge(19);         Thread.sleep(1000L);         userMapper.updateById(beforeUser);         log.info("query user:{}", userMapper.selectById(id));         // 清除测试数据         userMapper.deleteById(id);     } }

启动测试类,通过日志可以看出来:

before user:UserEntity(id=1346071927831134210, name=wupx, age=18, email=wupx@qq.com, createTime=Mon Jan 04 20:32:11 CST 2021, modifyTime=Mon Jan 04 20:32:11 CST 2021) query user:UserEntity(id=1346071927831134210, name=wupx, age=19, email=wupx@qq.com, createTime=Mon Jan 04 20:32:11 CST 2021, modifyTime=Mon Jan 04 20:32:13 CST 2021)

第一次插入对象的时候,创建时间和修改时间都自动填充了,当修改对象的时候,修改时间也相应的进行了更新。

另外可以将公共字段封装到公共类中,比如 BaseEntity:

@Data public class BaseEntity {     /**      * 主键      */     @TableId(value = "id", type = IdType.ASSIGN_UUID)     private Long id;     /**      * 创建时间      */     @TableField(value = "create_time", fill = FieldFill.INSERT)     private Date createTime;     /**      * 修改时间      */     @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE)     private Date modifyTime; }

经过测试,也是可以完成公共字段的自动填充,大家也可以在项目中这样搞下,可以减少每次插入或者更新时的 set 操作。

感谢各位的阅读,以上就是"如何理解Spring Boot集成Mybatis Plus自动填充字段"的内容了,经过本文的学习后,相信大家对如何理解Spring Boot集成Mybatis Plus自动填充字段这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

字段 时间 对象 更新 测试 时候 注解 版本 学习 不同 内容 实体 属性 接口 数据 方法 策略 处理 参数 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东特亿宝互联网科技有限公司 互联网为科技 互联网科技与金融科技 狮子座互联网科技 智网互联网科技 易通互联网络科技有限公司 友谊互联网络科技 团飞科技与伯堂互联网服务平台 互联网经济与金融科技 成都铂石互联网科技做什么的 崇明区互联网教育科技售后服务 洛阳昕诺飞互联网科技有限公司 西安小鹰速贷互联网科技有限公司 互联网行业科技股 高科技互联网发展前景如何 锡山区互联网智能科技产品供应 九思连强互联网电子科技有限公司 江苏互联网智能科技产品出厂价 版纳互联网科技选哪家 兰石爱特工业互联网科技分公司 咖啡 互联网与科技 衡水科技产业互联网平台 西藏七维空间互联网科技有限公司 阿里互联网科技企业 互联网企业科技类企业如何做账 半导体行业属于互联网高科技类吗 现代互联网科技公司 前海云享互联网科技 山东亿川互联网科技有限责任公司
0