之前在配置好Mybatis Plus的自动填充功能后,我没有完全测试,导致今天我在请求修改的时候,发现修改时间字段并没有自动更新。于是我实验了一下,发现了以下两个情况是导致无法自动填充需要注意
- 不能使用Mybatis注解@Update、@Insert
- 如果待更新的字段内容不为null,也会无法自动填充,只能重写strictFillStrategy方法
我是第二种情况,第一种是我想偷懒,试了一下又换了
解决方法:
1 2 3 4 5 6 7 8
| @Override public MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) { Object obj = fieldVal.get(); if (Objects.nonNull(obj)) { metaObject.setValue(fieldName, obj); } return this; }
|
完整类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
@Component public class MyMetaObjectHandler implements MetaObjectHandler {
@Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "gmtCreate", () -> LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), Long.class); this.strictUpdateFill(metaObject, "gmtModified", () -> LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), Long.class); }
@Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "gmtModified", () -> LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), Long.class); }
@Override public MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) { Object obj = fieldVal.get(); if (Objects.nonNull(obj)) { metaObject.setValue(fieldName, obj); } return this; } }
|
对了还需要注意的是strictUpdateFill()方法和strictInsertFill()方法,两个方法的第二个参数对应的是实体类对象的属性,不是数据库的字段。