MyBatis-Plus实现字段的自动填充
前言
在日常开发中,特别是一些业务系统项目,共同发现一个规律,那就是对于诸多业务表中都包含有相同的字段,比如id主键、uuid、create_time、creator_code、update_code、update_time等。而这些字段也是对于有些表而言是必要存在的。 为了避免业务开发时重复编写赋值代码,就可以利用MyBatis-Plus实现字段的自动填充,当然还有一种思路是自己编写AOP,这里就不进行追述,
实现思路
1、利用Mybatis-plus 的@TableField(fill = FieldFill.INSERT) 启到识别作用 2、实现填充器,具体实现insertFill()跟 updateFile() 接口即可
代码实现
pom
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
库表设计
CREATE TABLE `data_fuse` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 主键, `creator_code` varchar(50) DEFAULT NULL COMMENT 创建人, `create_time` timestamp NULL DEFAULT NULL COMMENT 创建时间, `update_code` varchar(50) DEFAULT NULL COMMENT 修改人, `update_time` timestamp NULL DEFAULT NULL COMMENT 更新时间, PRIMARY KEY (`id`) USING BTREE, ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
映射成实体类 ,核心技术注解: @TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT_UPDATE)
FieldFill是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值: DEFAULT:默认不处理 INSERT:插入时自动填充字段 UPDATE:更新时自动填充字 INSERT_UPDATE:插入和更新时自动填充字段
@ApiModelProperty(value = "创建人") @TableField(value = "creator_code", fill = FieldFill.INSERT) private String creatorCode; @ApiModelProperty(value = "创建时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "修改人") @TableField(value = "update_code", fill = FieldFill.INSERT_UPDATE) private String updateCode; @ApiModelProperty(value = "修改时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;
MetaObjectHandler 实现
@Slf4j @Component @Primary public class FillMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.debug("start insert fill ...."); this.setFieldValByName("createTime", LocalDateTime.now(), metaObject); this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject); User user = UserUtils.getUser(); if (ObjectUtils.isNotEmpty(user)) { String userCode = user.getUserCode(); this.setFieldValByName("creatorCode", userCode, metaObject); this.setFieldValByName("updateCode", userCode, metaObject); } } @Override public void updateFill(MetaObject metaObject) { log.debug("start update fill ...." ); this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject); User user = UserUtils.getUser(); if (ObjectUtils.isNotEmpty(user)) { String userCode = user.getUserCode(); this.setFieldValByName("updateCode", userCode, metaObject); } } }