Mybatis Plus自动填充公共字段
场景描述
系统开发中常需要将一些公共字段,如:deleted(逻辑删除)、createBy(创建人)、createTime(创建时间)、updateBy(更新人)、updateTime(更新时间)
在新增和更新表记录时,自动填充到表中,此时可以使用mybatisplus的MetadataObjectHandler对象实现此特性。
实现步骤
- 表结构
- 公共实体
@Data
public class BaseEntity implements Serializable {
@TableField(fill = FieldFill.INSERT)
private Long createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic(delval = "id", value = "0")
@TableField("deleted")
private Integer deleted;
}
- 业务实体类
继承了公共实体类
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_sys_user")
public class SysUser extends BaseEntity implements Serializable {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String account;
private String username;
private String password;
private String status;
private Integer type;
private LocalDateTime lastLoginTime;
}
- MybatisPlus自动填充处理器
@Bean
@ConditionalOnClass(MetaObjectHandler.class)
public MetaObjectHandler metaObjectHandler() {
return new MetaObjectHandler() {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "deleted", () -> 0, Integer.class);
IUser user = UserThreadLocal.get();
if (Objects.nonNull(user)) {
this.strictInsertFill(metaObject, "createBy", user::getId, Long.class);
this.strictInsertFill(metaObject, "updateBy", user::getId, Long.class);
}
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
IUser user = UserThreadLocal.get();
if (Objects.nonNull(user)) {
this.strictUpdateFill(metaObject, "updateBy", user::getId, Long.class);
}
}
};
}
- 技术细节
在实体类中,使用
@TableField(fill = FieldFill.INSERT)
private Long createBy;
或
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;
声明在插入或更新时要填充的字段,@TableLogic定义逻辑删除字段,需通过delval属性指定按指定的字段删除
@TableLogic(delval = "id", value = "0")