参考链接:https://mp.baomidou.com/guide/auto-fill-metainfo.html
重点:更新失败的原因是需要填充的字段为null 导致字段被忽略
解决思路:重写strictFillStrategy方法
背景:pom.xml 中引入的版本如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<dependencys>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependencys>
自动填充实体类的 创建时间、更新时间
/**
* 版本号(用于乐观锁, 默认为 1)
*/
@ApiModelProperty(name = "version" , value = "版本号(用于乐观锁, 默认为 1)")
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
整体配置类:
package com.znzc.project.handler;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Objects;
import java.util.function.Supplier;
@Slf4j
@Component
public class ZnzcMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
Date date = new Date();
this.strictInsertFill(metaObject, "createTime", Date.class, date);
this.strictInsertFill(metaObject, "updateTime", Date.class, date);
this.strictInsertFill(metaObject, "version", Integer.class, 1);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
// 源码是默认有值不覆盖,如果提供的值为null也不填充,updateTime 一般都是有值的,所以重写
@Override
public MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<Object> fieldVal) {
if ("updateTime".equals(fieldName)) {
if (Objects.nonNull(fieldVal)) {
metaObject.setValue(fieldName, fieldVal);
}
} else if (getFieldValByName(fieldName, metaObject) == null) {
setFieldValByName(fieldName, fieldVal.get(), metaObject);
}
return this;
}
}
源码: