MyBatis-plus 自动填充功能魔改
适用场景
有时候简单增删改查每次都要手动修改更新创建人、时间等字段简直过分,而mybatis-puls自带的填充策略又不太适合,也没找到可以配置填充策略的地方,干脆照着源码简单重写了一下。哪位大佬找到mybatis-puls配置填充策略的地方请@我一下
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.handlers.StrictFill;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.dycjr.dy.qrcode.service.UserContextHolder;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
/**
* @Describe: Mybatis自动填充配置
* @Author: ink
* @Date: 9:58 2021/3/17
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
this.strictInsertFill(metaObject, "creator", () -> UserContextHolder.getUserId(), String.class);
this.strictInsertFill(metaObject, "updator", () -> UserContextHolder.getUserId(), String.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill2(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
this.strictUpdateFill2(metaObject, "updator", () -> UserContextHolder.getUserId(), String.class);
}
// 注:修改默认填充策略——如果属性有值则不覆盖,如果填充值为null则不填充
// 修改后填充策略:
// insert方法采用默认填充策略;
// update方法采用自定义填充策略——强制进行填充,主要解决更新人更新时间有时前端会传递原始值从而导致无法填充
public <T, E extends T> MetaObjectHandler strictUpdateFill2(MetaObject metaObject, String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {
return strictFill2(false, findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldVal, fieldType)));
}
public MetaObjectHandler strictFill2(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {
if ((insertFill && tableInfo.isWithInsertFill()) || (!insertFill && tableInfo.isWithUpdateFill())) {
strictFills.forEach(i -> {
final String fieldName = i.getFieldName();
final Class<?> fieldType = i.getFieldType();
tableInfo.getFieldList().stream()
.filter(j -> j.getProperty().equals(fieldName) && fieldType.equals(j.getPropertyType()) &&
((insertFill && j.isWithInsertFill()) || (!insertFill && j.isWithUpdateFill()))).findFirst()
.ifPresent(j -> strictFillStrategy2(metaObject, fieldName, i.getFieldVal()));
});
}
return this;
}
public MetaObjectHandler strictFillStrategy2(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {
Object obj = fieldVal.get();
if (Objects.nonNull(obj)) {
metaObject.setValue(fieldName, obj);
}
return this;
}
}
东西都在注释里了,实体类对应属性记得加上注解就好了
UserContextHolder是用来记录当前访问用户信息的
/*
这是注释看不到~~~
魔改就是标题党,笑笑就好~~~
*/