MP官方给出的自动填充插入和更新时间的方法
https://baomidou.com/pages/4c6bcf/
@TableFIled
第一,在字段上使用注解@TableFIled
@TableField(value = "create_time",fill = FieldFill.INSERT) //插入时字段填充
private LocalDateTime createTime;
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) //插入和修改时字段填充
private LocalDateTime updateTime;
自定义实现类
第二,自定义类继承MetaObjectHandler
@Component //别忘记加入spring容器
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());
}
}
问题来了
插入数据时,插入时间和更新时间都发生了变化。
但是,在使用更新数据时,使用 this.strictUpdateFill(metaObject, “updateTime”, LocalDateTime.class, LocalDateTime.now()),数据库updata_time字段无法更新成功。
原因
官方文档给出注意事项:
MetaObjectHandler提供的默认方法的策略均为: 如果属性有值则不覆盖, 如果填充值为null则不填充。也就是说,MP的自动填充功能的前提是填充字段要求为null。
这确实是个大坑,而且是官方给的大坑,很烦。
解决办法
1、换方法,使用 this.setFieldValByName(“updateTime”, LocalDateTime.now(), metaObject);(最简单,使用老方法)
2、修改前设置数据库字段为null(麻烦)
3、自己重写源代码方法(有一定经验的小伙伴可以尝试)