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 params;


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

    public void setParams(Map params) {
        this.params = params;
    }
}

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

实现MetaObjectHandler 接口


/**
 * 通用参数填充实现类
 * 

* 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值 * * @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 的实现接口中处理的