Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段
作者:要开心吖ZSH
在我们使用Mybatis-Plus时,一些简单的CRUD,你会发现好多表,许多字段是重复的,如果我们每次更新或者新增,都要手动赋值,那么会出现许多不必要的重复操作,所以本文介绍了Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段,需要的朋友可以参考下
1.描述
在我们使用Mybatis-Plus时,一些简单的CRUD。你会发现好多表,许多字段是重复的,比如:createTime、updateTime、createBy、updateBy等字段。如果我们每次更新或者新增,都要手动赋值,那么会出现许多不必要的重复操作。那Mybatis-Plus有没有一种方案,可以减少这种重复操作呢?当然是有的,那就是MetaObjectHandler(元对象处理)。
主要功能
- 自动填充:可以在插入(insert)或更新(update)数据库记录时,自动填充指定的字段值。这对于记录的创建时间和最后更新时间非常有用。
- 灵活配置:可以通过注解或者全局配置的方式,指定哪些字段需要自动填充,以及在什么情况下进行填充(如仅在插入时,或是在插入和更新时都进行填充)。
- 集成简单:只需要实现 MetaObjectHandler 接口,并重写相应的方法即可。同时,在 Spring Boot 应用中,只需将其实现类标记为 @Component,就可以自动生效
2.编码
2.1 定义实体类
首先定义一个实体类,并使用 @TableField 注解来指定哪些字段需要自动填充。例如:
package com.chinaunicom.medical.ihm.core.model;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.util.Date;
public class BaseModel extends IdModel {
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Integer getDeleted() {
return deleted;
}
public void setDeleted(Integer deleted) {
this.deleted = deleted;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
}2.2 实现 MetaObjectHandler
创建一个类实现 MetaObjectHandler 接口,并覆盖 insertFill 和 updateFill 方法。在这个方法中,根据字段的属性来决定是否填充以及填充什么样的值。例如:
package com.chinaunicom.medical.ihm.core.model;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.chinaunicom.medical.ihm.core.context.SysContextHolder;
import org.apache.ibatis.reflection.MetaObject;
import java.time.LocalDateTime;
import java.util.Optional;
@Component
public class DateMetaObjectHandler implements MetaObjectHandler {
private String createTimeField = "createTime";
private String updateTimeField = "updateTime";
private String createByField = "createBy";
private String updateByField = "updateBy";
private String versionField = "version";
private String deletedField = "deleted";
private String appIdField = "appId";
private String tenantIdField = "tenantId";
private String instanceIdField = "instanceId";
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, createTimeField, LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, updateTimeField, LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, versionField, Integer.class, 0);
this.strictInsertFill(metaObject, deletedField, Integer.class, 0);
this.strictInsertFill(metaObject, createByField, String.class, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)));
this.strictInsertFill(metaObject, updateByField, String.class, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)));
// this.strictInsertFill(metaObject, appIdField, Long.class, SysContextHolder.getApp());
// this.strictInsertFill(metaObject, tenantIdField, Long.class, SysContextHolder.getTenant());
// this.strictInsertFill(metaObject, instanceIdField, Long.class, SysContextHolder.getApplication());
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName(updateTimeField, LocalDateTime.now(), metaObject);
setFieldValByName(updateByField, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)), metaObject);
}
}2.3 配置 MyBatis-Plus
确保你的项目中已经正确配置了 MyBatis-Plus。通常情况下,如果你是使用 Spring Boot,则只需要添加 MyBatis-Plus 的依赖,并在 application.properties 或 application.yml 中做基本配置即可。
3.总结
- 当你实现了
MetaObjectHandler并希望它能生效时,确保该类已经被 Spring 容器管理(即加上@Component注解)。 - 如果你的项目中有多个
MetaObjectHandler实现,它们会按照 Spring Bean 的加载顺序依次执行。 - 在使用
strictInsertFill和strictUpdateFill方法时,确保传递的类型与实体类中字段的类型相匹配,否则可能会抛出异常。 - 通过这种方式,MyBatis-Plus 能够极大地简化开发过程中的数据操作,减少手动设置字段值的工作量,提高开发效率。
到此这篇关于Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段的文章就介绍到这了,更多相关Mybatis-Plus自动填充对象字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
