mybatis plus中update_time字段未自动更新
程序员文章站
2022-06-09 15:01:01
...
mybatis plus对于create_time、update_time这样的数据库字段提供了自动插入功能,不用每次都手动进行更新
使用指南
- 加@TableField注解
- 自定义实现类TimeMetaObjectHandler
@Component
public class TimeMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
long cur = System.currentTimeMillis();
this.strictInsertFill(metaObject, "createdTime", Long.class, cur);
this.strictInsertFill(metaObject, "updatedTime", Long.class, cur);
}
@Override
public void updateFill(MetaObject metaObject) {
long cur = System.currentTimeMillis();
this.setFieldValByName("updatedTime", cur, metaObject);
}
}
也可以参考官方文档
防坑指南
fillStrategy()方法和strictUpdateFill()方法的填充策略是
如果属性有值则不覆盖, 如果填充值为null则不填充
所以当selectById从数据库取出旧数据,然后修改自己想修改的字段后调用updateById,会发现update_time字段不会更新
这是因为selectById可以取出update_time的旧值,更新时填充策略会判断属性已有值,不进行自动填充
,因此update_time不会自动更新。
而且官方目前没有直接提供强制更新的方法。
查看fillStrategy方法源码,可以看到只有属性没有被填充值,才会执行set方法。
/**
* 填充策略,默认有值不覆盖,如果提供的值为null也不填充
*
* @param metaObject metaObject meta object parameter
* @param fieldName java bean property name
* @param fieldVal java bean property value of Supplier
* @return this
* @since 3.3.0
*/
default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {
if (getFieldValByName(fieldName, metaObject) == null) {
setFieldValByName(fieldName, fieldVal, metaObject);
}
return this;
}
简单的处理办法
直接调用setFieldValByName方法,跳过null判断,强制更新updateTime为当前时间
@Override
public void updateFill(MetaObject metaObject) {
long cur = System.currentTimeMillis();
this.setFieldValByName("updatedTime", cur, metaObject);
}