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);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了