概括
项目中的实体类有若干公共属性,例如id、创建时间、修改时间等,基于mybatis-plus3.5.7设计基类,以实现所有实体类的修改时间、修改人id、修改人ip等字段随着实体的修改自动更新。
项目链接为:https://gitee.com/wang-yi-zp/zp-smart-enterprise-framework.git,后续会持续更新其他功能
详细步骤
依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mp.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>${springdoc-version}</version>
</dependency>
<mp.version>3.5.7</mp.version>
<springdoc-version>1.6.7</springdoc-version>
抽取基类
在实体类中,你需要使用 @TableField
注解来标记哪些字段需要自动填充,并指定填充的策略.
- INSERT:插入时填充字段
- UPDATE:更新时填充字段
- INSERT_UPDATE:插入和更新时填充字段
/**
* 实体类基类
*
* @author ZP
*/
@Data
public abstract class BaseEntity {
@Schema(description = "id")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Integer id;
@Schema(description = "是否已删除")
@TableField("deleted")
@TableLogic
private Boolean deleted;
@Schema(description = "创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@Schema(description = "更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@Schema(description = "创建用户id")
@TableField(fill = FieldFill.INSERT)
private String createUserId;
@Schema(description = "更新用户id")
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUserId;
@Schema(description = "创建用户ip")
@TableField(fill = FieldFill.INSERT)
private String createUserIp;
@Schema(description = "更新用户ip")
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUserIp;
}
mybatis-plus配置
创建GlobalMetaObjectHandler实现MetaObjectHandler,insertFill方法中实现实体创建后的操作,updateFill中实现实体更新后的操作,字段更新逻辑根据需要删减,注意一定要加@Component注解,交给spring容器管理
/**
* GlobalMetaObjectHandler
*
* @author ZP
*/
@Slf4j
@Component
public class GlobalMetaObjectHandler implements MetaObjectHandler {
private static final String CREATE_TIME_COL = "createTime";
private static final String UPDATE_TIME_COL = "updateTime";
private static final String CREATE_USER_ID = "createUserId";
private static final String UPDATE_USER_ID = "updateUserId";
private static final String CREATE_USER_IP = "createUserIp";
private static final String UPDATE_USER_IP = "updateUserIp";
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, CREATE_TIME_COL, LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, CREATE_USER_ID, String.class, SysUserUtil.getLoginUserId());
this.strictInsertFill(metaObject, CREATE_USER_IP, String.class, SysUserUtil.getLoginUserIp());
updateAll(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
updateAll(metaObject);
}
private void updateAll(MetaObject metaObject) {
this.strictUpdateFill(metaObject, UPDATE_TIME_COL, LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, UPDATE_USER_ID, String.class, SysUserUtil.getLoginUserId());
this.strictUpdateFill(metaObject, UPDATE_USER_IP, String.class, SysUserUtil.getLoginUserIp());
}
}
使用
具体的实体类继承BaseEntity,实体类新建或者更新的时候,创建时间、更新时间、创建用户id、更新用户id、创建用户ip、更新用户ip就会自动刷新