描述
在规范的数据库表中,每个表结构都具有共同的字段,比如:新建ID、新建名称、新建时间、修改ID、修改名称、修改时间等字段。在mybatis-plus中实现有填充策略,其作用就是自动帮助将参数封装到实体中,在保存或者修改数据时,自动映射到实体字段,最终写入到数据库中。
公共实体类
/**
* 基础实体,提供pojo继承的父类Bean
*
* @author: 苦瓜不苦
* @date: 2022/1/4 20:34
*/
@Data
public class ParentModel implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 修改时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 修改ID
*/
@TableField(value = "update_id", fill = FieldFill.INSERT_UPDATE)
private Long updateId;
/**
* 修改名称
*/
@TableField(value = "update_name", fill = FieldFill.INSERT_UPDATE)
private String updateName;
/**
* 新建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 新建ID
*/
@TableField(value = "create_id", fill = FieldFill.INSERT)
private Long createId;
/**
* 新建名称
*/
@TableField(value = "create_name", fill = FieldFill.INSERT)
private String createName;
}
实现MetaObjectHandler接口
/**
* 自动填充策略
*
* @author: 苦瓜不苦
* @date: 2022/1/5 20:17
**/
@Configuration
public class MetaObjectHandlerConfig implements MetaObjectHandler {
private static final String create_id = "createId";
private static final String create_name = "createName";
private static final String create_time = "createTime";
private static final String update_id = "updateId";
private static final String update_name = "updateName";
private static final String update_time = "updateTime";
/**
* 新增填充策略
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
insertAndUpdate(metaObject, Arrays.asList(create_id, create_name, create_time, update_id, update_name, update_time));
}
/**
* 修改填充策略
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
insertAndUpdate(metaObject, Arrays.asList(update_id, update_name, update_time));
}
private void insertAndUpdate(MetaObject metaObject, List<String> fillNameList) {
// 从隔离线程中获取用户信息
UserInfo userInfo = UserInfoUtil.get();
if (ObjectUtil.isNull(userInfo)) {
userInfo = new UserInfo();
}
for (String name : fillNameList) {
Object object = null;
switch (name) {
case create_id:
case update_id:
object = userInfo.getId();
break;
case create_name:
case update_name:
object = userInfo.getUsername();
break;
case create_time:
case update_time:
object = LocalDateTime.now();
break;
default:
break;
}
// 判断是否存在该字段
boolean bool = metaObject.hasSetter(name);
if (bool) {
// 判断字段是否为null
Object value = getFieldValByName(name, metaObject);
if (value == null) {
setFieldValByName(name, object, metaObject);
}
}
}
}
}