[简化开发] mybatis plus自动填充 INSERT 与 INSERT_UPDATE 坑(记录)

发布于:2023-01-04 ⋅ 阅读:(577) ⋅ 点赞:(0)

目录

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 只添加
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到