mybatis plus中update_time字段未自动更新
参考:
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); }