MyBatis-plus 自动填充功能魔改

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是用来记录当前访问用户信息的
/*
这是注释看不到~~~
魔改就是标题党,笑笑就好~~~
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值