基于mybatis-plus3.5.7的公共实体类抽取

89 阅读2分钟

概括

项目中的实体类有若干公共属性,例如id、创建时间、修改时间等,基于mybatis-plus3.5.7设计基类,以实现所有实体类的修改时间、修改人id、修改人ip等字段随着实体的修改自动更新。

项目链接为:gitee.com/wang-yi-zp/…,后续会持续更新其他功能

详细步骤

依赖

 <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就会自动刷新

参考资料

自动填充字段 | MyBatis-Plus (baomidou.com)