[简化开发] mybatis plus自动填充 INSERT 与 INSERT_UPDATE 坑(记录)
目录
1. 场景: 用了mybatis自动填充后
然后再实体类上添加注解
可是有的业务场景不想要这种, 希望根据注解进行判断到底是否需要填充, 去找相关文章根本没有
MetaObjectHandler
修改方式: ->
1. 场景: 用了mybatis自动填充后
填充时间确实好了很多 但是 发现了一个问题, 根据网上的方式 粘贴下来 后
package com.aisce.axmall.activity.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 存在问题一: 从缓存中 获取的数据 插入数据库中 会自动覆盖掉, 不管加没加自动填充注解
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override//入库 created
public void insertFill(MetaObject metaObject) {
Date date = new Date();
/**
* this.setFieldValByName(arg1,arg2,arg3 )
* arg1: 自动填充的字段名称
* arg2: 自动填充 的值
* arg3: metaObject固定写法
*/
this.setFieldValByName("createTime", date, metaObject);
}
@Override//更新调用 updated
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updatedTime", new Date(), metaObject);
}
}
然后再实体类上添加注解
@TableField(fill = FieldFill.INSERT)@TableField(fill = FieldFill.INSERT_UPDATE)
说就生效了(字段对应上)
然后再把注解删除掉后 也不会影响它自动填充
可是有的业务场景不想要这种, 希望根据注解进行判断到底是否需要填充, 去找相关文章根本没有
只能看人家封装好的源码
MetaObjectHandler
/**
* 填充判断
* <li> 如果是主键,不填充 </li>
* <li> 根据字段名找不到字段,不填充 </li>
* <li> 字段类型与填充值类型不匹配,不填充 </li>
* <li> 字段类型需在TableField注解里配置fill: @TableField(value="test_type", fill = FieldFill.INSERT), 没有配置或者不匹配时不填充 </li>
* v_3.1.0以后的版本(不包括3.1.0),子类的值也可以自动填充,Timestamp的值也可以填入到java.util.Date类型里面
*
* @param fieldName java bean property name
* @param fieldVal java bean property value
* @param metaObject meta object parameter
* @param fieldFill 填充策略枚举
* @return 是否进行填充
* @since 3.0.7
*/
default boolean isFill(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
TableInfo tableInfo = metaObject.hasGetter(Constants.MP_OPTLOCK_ET_ORIGINAL) ?
TableInfoHelper.getTableInfo(metaObject.getValue(Constants.MP_OPTLOCK_ET_ORIGINAL).getClass())
: TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());
if (Objects.nonNull(tableInfo)) {
Optional<TableFieldInfo> first = tableInfo.getFieldList().stream()
//v_3.1.1+ 设置子类的值也可以通过
.filter(e -> e.getProperty().equals(fieldName) && e.getPropertyType().isAssignableFrom(fieldVal.getClass()))
.findFirst();
if (first.isPresent()) {
FieldFill fill = first.get().getFieldFill();
return fill.equals(fieldFill) || FieldFill.INSERT_UPDATE.equals(fill);
}
}
return false;
}
找到这个校验后通用填充
并没有这个校验
setFieldValByName
this.setFieldValByName("createTime", date, metaObject); 这句话意思也是无需注解 也可以生效
修改方式: ->
setUpdateFieldValByName 只更新
setInsertFieldValByName 只添加