MyBatis-plus 自动填充MetaObjectHandler

MyBatis-plus 自动填充MetaObjectHandler

背景
在项目中经常遇到一些数据需要自动填充,填充方法都是同一种规则,例如创建时间等。

1 自动填充方法配置
1.1 实体类添加注解
注解:

 #新增注解
 @TableField(fill = FieldFill.INSERT)
 #更新注解
 @TableField(fill = FieldFill.INSERT_UPDATE)

实体类代码


@Data
public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 搜索值
     */
    @TableField(exist = false)
    private String searchValue;

    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新者
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 备注
     */
    @TableField(exist = false)
    private String remark;

    /**
     * 请求参数
     */
    @TableField(exist = false)
    private Map<String, Object> params;


    public Map<String, Object> getParams() {
        if (params == null) {
            params = new HashMap<>();
        }
        return params;
    }

    public void setParams(Map<String, Object> params) {
        this.params = params;
    }
}

1.2 在handler包下实现元对象处理器接口

实现MetaObjectHandler 接口


/**
 * 通用参数填充实现类
 * <p>
 * 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值
 *
 * @author lhh
 */
@Configuration
public class DateMetaObjectHandler implements MetaObjectHandler {
    /**
     * 是否开启了插入填充
     */
    @Override
    public boolean openInsertFill() {
        return true;
    }

    /**
     * 是否开启了更新填充
     */
    @Override
    public boolean openUpdateFill() {
        return true;
    }

    /**
     * 新增
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
            BaseEntity baseDO = (BaseEntity) metaObject.getOriginalObject();
            Date current = new Date();
            // 创建时间为空,则以当前时间为插入时间
            if (Objects.isNull(baseDO.getCreateTime())) {
                baseDO.setCreateTime(current);
            }
            Long userId = SecurityUtils.getUserId();
            // 当前登录用户不为空,创建人为空,则当前登录用户为创建人
            if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreateBy())) {
                baseDO.setCreateBy(userId.toString());
            }
        }
    }

    /**
     * 更新
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新时间为空,则以当前时间为更新时间
        Object modifyTime = getFieldValByName("updateTime", metaObject);
        if (Objects.isNull(modifyTime)) {
            setFieldValByName("updateTime", new Date(), metaObject);
        }
        // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
        Object modifier = getFieldValByName("updateBy", metaObject);
        String userName = SecurityUtils.getUsername();
        if (Objects.nonNull(userName) && Objects.isNull(modifier)) {
            setFieldValByName("updateBy", userName, metaObject);
        }
    }
}

配置好后公共字段就自动填充上去了 公共字段在 MetaObjectHandler 的实现接口中处理的

posted @   菜鸟辉哥  阅读(1392)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示