在构造器中写save或update的时候需要大部分需要创建时间、创建人、修改时间、修改人等字段填充,每次插入或修改数据时都需要设置填充这些字段,会增加开发者的工作量,很容易出现遗漏或填写错误的情况。Mybatis-Plus公共字段自动填充是一种自动化的数据填充方式,可以自动填充一些公共字段,提高开发效率,减少出错的可能性。
示例代码说说明如下:
1、注解填充字段 @TableField,实体类的增加注解
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Entity基类
*
*/
@Data
public class Entity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 创建者
*/
@TableField(value = "create_by", fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(value = "update_by", fill = FieldFill.UPDATE)
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
2、自定义实现类 MyMetaObjectHandler
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 自定义sql字段填充器,自动填充创建修改相关字段
*/
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
private static final String CREATE_BY = "createBy";
private static final String INSERT_TIME = "createTime";
private static final String UPDATE_BY = "updateBy";
private static final String UPDATE_TIME = "updateTime";
@Override
public void insertFill(MetaObject metaObject) {
// 创建createTime与管理员
this.insertDate(INSERT_TIME, metaObject);
this.insertUserName(CREATE_BY, metaObject);
// 创建updateTime
this.insertDate(UPDATE_TIME, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
// 更新或创建updateTime
this.updateDate(UPDATE_TIME, metaObject);
this.updateUserName(UPDATE_BY, metaObject);
}
// 创建时间字段
private void insertDate(String filedName, MetaObject metaObject) {
// 创建createTime
if (this.isValue(filedName, metaObject)) {
this.strictInsertFill(metaObject, filedName, Date.class, new Date());
this.strictInsertFill(metaObject, filedName, Date::new, Date.class);
}
}
// 更新时间字段
private void updateDate(String filedName, MetaObject metaObject) {
if (this.isValue(filedName, metaObject)) {
Object fieldValByName = getFieldValByName(filedName, metaObject);
if (fieldValByName != null) {
this.setFieldValByName(filedName, new Date(), metaObject);
}
this.strictUpdateFill(metaObject, filedName, Date.class, new Date());
this.strictUpdateFill(metaObject, filedName, Date::new, Date.class);
}
}
// 创建管理员
public void insertUserName(String filedName, MetaObject metaObject) {
// 字段存在,值为空
if (this.isValue(filedName, metaObject)
&& !ObjectUtils.isEmpty(getUserName())) {
this.strictInsertFill(metaObject, filedName, String.class, getUserName());
this.strictInsertFill(metaObject, filedName, this::getUserName, String.class);
}
}
// 更新管理员
public void updateUserName(String filedName, MetaObject metaObject) {
if (this.isValue(filedName, metaObject)
&& !ObjectUtils.isEmpty(getUserName())) {
Object fieldValByName = getFieldValByName(filedName, metaObject);
if (fieldValByName != null) {
this.setFieldValByName(filedName, getUserName(), metaObject);
}
this.strictUpdateFill(metaObject, filedName, String.class, getUserName());
this.strictUpdateFill(metaObject, filedName, this::getUserName, String.class);
}
}
// 值是否存在
private boolean isValue(String filedName, MetaObject metaObject) {
// 值是否存在
boolean value = metaObject.hasGetter(filedName);
// 字段存在,值为空
if (value
&& ObjectUtils.isEmpty(metaObject.getValue(filedName))) {
return true;
}
return false;
}
// 获取管理员
public String getUserName() {
String userName = null;
try {
Subject subject = SecurityUtils.getSubject();
if (!ObjectUtils.isEmpty(subject)) {
userName = "管理员名称";
}
} catch (Exception e) {
}
return userName;
}
}
3、字段填充策略 FieldFill 说明
public enum FieldFill {
DEFAULT, // 默认不处理
INSERT, // 播入填充字段
UPDATE, // 更新填充字段
INSERT_UPDATE; // 插入和更新填充字段
private FieldFill() {
}
}