一. 使用场景
MetaObjectHandler是元对象字段填充控制器抽象类,实现公共字段自动写入。
比如通常,我们在建表时,会设置几个公共字段:创建人(creator)、更新人(uptater)、创建时间(create_time)、更新时间(update_time)。
每次将实体对象新增入库时,都要设置创建人和创建时间;每次更新实体对象时,都要设置更新人和更新时间;如果这是都放在业务代码中,很是繁琐,那么可不可以统一配置,自动帮我们添加这些属性呢?答案就是使用MetaObjectHandler。
二. 使用姿势
官方说明:https://mp.baomidou.com/guide/auto-fill-metainfo.html
注意:不同版本api略有不同,但是步骤是一样的,接口也是一样的,本文是3.1.0 。
步骤如下:
1.实现MetaObjectHandler接口
MetaObjectHandler接口有两个接口方法,需要我们自己去实现它:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("creator", bucUserBo.getEmpId(), metaObject);
this.setFieldValByName("create_time", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updater", "", metaObject);
this.setFieldValByName("update_time", new Date(), metaObject);
}
}
思路就是实现两个接口方法,一个更新,一个插入,然后对一些公共属性进行赋值操作;
对于更新人和创建人这两个属性,一般从Threadlocal中取值。
2. 实体类上添加注解
除了上面实现两个接口方法,还需要在对应实体的属性上添加注解,这样mybatisplus才会取进行赋值处理。
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 创建者工号
*/
@TableField(value = "creator",fill = FieldFill.INSERT)
private String creator;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 更新者工号
*/
@TableField(value = "updater",fill = FieldFill.INSERT_UPDATE)
private String updater;
其中,FieldFill枚举有4个属性,
DEFAULT :默认不处理
INSERT : 插入操作时进行填充字段
UPDATE :更新操作时填充字段
INSERT_UPDATE :插入和更新操作时填充字段