MyBatis-Plus中公共字段的统一处理

数据库中一些表的公共字段,例如修改时间、修改人、创建时间、创建人,我们一般都是这样来处理的:

employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
employee.setCreateUser(UserHolder.get());
employee.setUpdateUser(UserHolder.get()); // UserHolder是自己封装的工具类,用来获取当前系统用户

在对每个表记录进行修改时,这四行代码都要重复出现,甚是繁琐,因此MyBatis-Plus中提供了对这些公共字段处理的简化手段。
大概就是两个步骤:

  1. 在实体类的属性上,使用@TableField中的fill属性设定此字段的填充策略
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;

@TableField中的fill属性值是一个枚举类,代表此字段的填充策略,这个枚举类有四个值:

  • FieldFill.DEFAULT,默认策略,即不填充
  • FieldFill.INSERT,插入时进行填充
  • FielFill.UPDATE,更新时进行填充
  • FieldFill.INSERT_UPDATE,在插入和更新时进行填充
  1. 实现MetaObjectHandler接口,自定义填充逻辑
//自定义元数据对象处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入操作时自动填充的逻辑
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
Long id = UserHolder.get();
if (id != null) {
metaObject.setValue("createUser", id);
metaObject.setValue("updateUser", id);
}
}
//更新操作时自动填充的逻辑
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("updateTime", LocalDateTime.now());
Long id = UserHolder.get();
if (id != null) {
metaObject.setValue("updateUser", id);
}
}
}

这个MetaObjectHandler接口有两个抽象方法,分别代表在INSERTUPDATE时的填充逻辑。
接下来,在业务逻辑中,就不需要对这些公共字段做处理了,只要处理核心的业务字段就可以了。

posted @   秋天Code  阅读(69)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示