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);
}
}
}