本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下:
需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时候修改updateTime为修改数据的时间。不需要人为的手动赋值。
@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是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值:
编写公共字段填充处理器类,该类继承了MetaObjectHandler类,重写 insertFill和updateFill方法,我们在这两个方法中获取需要填充的字段以及默认填充的值。
@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);
@Test
public void testInsert() {
User user = new User();
user.setName("字母哥");
user.setAge(18);
userMapper.insert(user);
}
但是运行的结果是:createTime和updateTime被自动赋值
@Test
public void testUpdate() {
User user = new User();
user.setId(1287387821681790977L);
user.setName("字母哥&curry");
user.setAge(18);
userMapper.updateById(user);
}
但是运行的结果是:updateTime在执行数据记录修改操作时被自动赋值
喜欢 (0)or分享 (0)