mybatisplus实现公共字段自动填充功能
1.1 日常开发中的公共字段
在日常的开发过程中, DAO
层的数据库实体类(Entity
)中经常会有一些公共字段如 create_by
(创建人), create_time
(创建时间) 等字段,与业务基本无关且属于记录本身的属性字段。
这些字段通常会容易被大家忽视,每个 Entity 都去处理一遍比较麻烦耗时;如果忽略又会造成记录本身属性不完整,直到用到的时候才后悔莫及。
1.2 Mybatis Plus 中的解决方案
所以 Mybatis Plus
中的 MetaObjectHandler
就是针对这一问题的良好解决方案。
MetaObjectHandler
中主要提供了两个方法:
public interface MetaObjectHandler {
/**
* 插入元对象字段填充(用于插入时对公共字段的填充)
*
* @param metaObject 元对象
*/
void insertFill(MetaObject metaObject);
/**
* 更新元对象字段填充(用于更新时对公共字段的填充)
*
* @param metaObject 元对象
*/
void updateFill(MetaObject metaObject);
}
1.3 用法
一般来说,这些公共字段我们都会封装在一个 Super Entity
类中,所以在这个类中,我们把所有更新和插入时需要做改动的字段都加上 @TableField
注解,并且设置 fill
属性。
@Data
public class BaseEntity {
private static final long serialVersionUID = 1L;
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@TableField(typeHandler = BooleanTypeHandler.class)
private Boolean isDeleted;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private String createdBy;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}
FieldFill
是一个枚举类,其中定义了四种处理方法:
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
1.3.2 实现 MetaObjectHandler 接口
定义一个类实现 MetaObjectHandler
中的 insertFill
和 updateFill
抽象方法:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// getFieldValByName 方法是父接口中的默认方法,用字段名字通过反射获取待插入对象中指定名字字段的值
Object createTime = getFieldValByName("createTime", metaObject);
if (Objects.isNull(createTime)) {
//同理, setFieldValByName 方法也是父接口中的默认方法,用字段名字通过反射设置待插入对象中指定名字字段的值
//插入时, createTime 字段默认为当前时间
setFieldValByName("createTime", new Date(), metaObject);
}
Object updateTime = getFieldValByName("updateTime", metaObject);
if (Objects.isNull(updateTime)) {
setFieldValByName("updateTime", new Date(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
//更新时设置 updateTime 字段为当前时间
setFieldValByName("updateTime", new Date(), metaObject);
}
}
原文地址:https://blog.csdn.net/weixin_38687619/article/details/140573272
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!