使用Mybatis Plus自动填充功能无效的坑

之前在配置好Mybatis Plus的自动填充功能后,我没有完全测试,导致今天我在请求修改的时候,发现修改时间字段并没有自动更新。于是我实验了一下,发现了以下两个情况是导致无法自动填充需要注意

  1. 不能使用Mybatis注解@Update、@Insert
  2. 如果待更新的字段内容不为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
/**
* MP自动填充处理器
* @author oldman
*/
@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()方法,两个方法的第二个参数对应的是实体类对象的属性,不是数据库的字段。