设置字段默认值Java_小书MybatisPlus第9篇-常用字段默认值自动填充

本文介绍了如何在Mybatis Plus中设置字段默认值,包括在插入和更新时自动填充createTime和updateTime,详细讲解了@TableField注解的使用,以及自定义填充处理器MyMetaObjectHandler的实现,通过测试验证了自动填充功能的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下:

一、填充字段处理

需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时候修改updateTime为修改数据的时间。不需要人为的手动赋值。

在数据库表层面需要先添加2个日期类型的字段create_tme和update_time

01ef203cf38fde729271a252d8b71e4f.png

使用@TableField注解标记实体类中的哪些字段需要填充:

@Data

public class User {

private Long id;

private String name;

private Integer age;

private String email;

@TableField(fill = FieldFill.INSERT)

private Date createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)

private Date updateTime;

}

FieldFill是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值:

DEFAULT:默认不处理

INSERT:插入时自动填充字段

UPDATE:更新时自动填充字段

INSERT_UPDATE:插入和更新时自动填充字段

二、自定义填充默认数值

编写公共字段填充处理器类,该类继承了MetaObjectHandler类,重写 insertFill和updateFill方法,我们在这两个方法中获取需要填充的字段以及默认填充的值。

填充处理器MyMetaObjectHandler在Spring Boot中需要声明@Component或@Bean注入

strictInsertFill和strictUpdateFill方法第二个参数写的是实体类里的属性名,不是对应数据库字段名。

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.strictInsertFill(metaObject, "createTime", Date.class, new Date());

this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());

}

@Override

public void updateFill(MetaObject metaObject) {

this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());

}

}

如果是3.3.0后面的版本,比如3.3.1.8,也可以改用下面更简单的写法(3.3.0不要用该方法,有bug)

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.fillStrategy(metaObject, "createTime", new Date());

this.fillStrategy(metaObject, "updateTime", new Date());

}

@Override

public void updateFill(MetaObject metaObject) {

this.fillStrategy(metaObject, "updateTime", new Date());

}

}

在一些比较旧的版本,为填充字段设置值的API如下,3.3.0之后已经不建议使用

this.setFieldValByName("createTime",new Date(),metaObject);

this.setFieldValByName("updateTime",new Date(),metaObject);

三、开始测试

插入一条数据,注意我们没有为createTime和updateTime赋值

@Test

public void testInsert() {

User user = new User();

user.setName("字母哥");

user.setAge(18);

userMapper.insert(user);

}

但是运行的结果是:createTime和updateTime被自动赋值

0c2f89da16be7e84b1efc41fea72ed2e.png

根据Id更新一条数据,注意我们没有为updateTime赋值

@Test

public void testUpdate() {

User user = new User();

user.setId(1287387821681790977L);

user.setName("字母哥&curry");

user.setAge(18);

userMapper.updateById(user);

}

但是运行的结果是:updateTime在执行数据记录修改操作时被自动赋值

5fbda2891acbcf0dccf72348f1001ac8.png

欢迎关注我的博客,里面有很多精品合集

本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值