本文基于 SpringBoot
在项目开发过程中,我们的数据库表中,经常不可避免的会出现一些公共字段,比如创建人信息、创建时间、修改人信息、修改时间等等相关信息,我们一般都是拿到当前操作人员 set 相关属性进行写入,或者利用 aop 、反射等相关技术进行处理,当我们使用了 MyBatis-Plus 之后,这一切就变得简单起来了
一、引入 MyBatis-Plus
1、引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!--mybatis plus 相关依赖版本注意保持一致,否则会有惊喜-->
<!--mybatis plus 集成 springboot 核心依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!--mybatis plus 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.0</version>
</dependency>
2、SpringBoot 配置文件
数据库相关连接信息按自己的进行配置
mybatis-plus:
#扫描所有xml
mapper-locations: classpath:mapper/*.xml
#扫描实体类
type-aliases-package: com.wxw.springboot_mybatisplus.MetaObject.entity
#打印日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
二、准备相关实体类代码
1、基础实体类父类
@Data
public class BaseEntity implements Serializable {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private String id;
/**
* 创建人
*/
@TableField(value = "create_user_id", fill = FieldFill.INSERT)
private String createUserId;
/**
* 创建人
*/
@TableField(value = "create_user_code", fill = FieldFill.INSERT)
private String createUserCode;
/**
* 创建时间
*/
@TableField(value = "create_date", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createDate;
/**
* 更新人
*/
@TableField(value = "update_user_id", fill = FieldFill.UPDATE)
private String updateUserId;
/**
* 更新人
*/
@TableField(value = "update_user_code", fill = FieldFill.UPDATE)
private String updateUserCode;
/**
* 更新时间
*/
@TableField(value = "update_date", fill = FieldFill.UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateDate;
/**
* 是否删除
*/
@TableField(value = "delete_flag", fill = FieldFill.INSERT)
@TableLogic
private String deleteFlag;
}
在需要自动填充的字段上增加注解
@TableField(value = “delete_flag”, fill = FieldFill.INSERT)
@TableField(value = “update_date”, fill = FieldFill.UPDATE)
value 是对应的字段名称
fill = FieldFill.INSERT 表示插入的时候进行操作
我们可以看 FieldFill 的源码,有如下几种选项
INSERT 表示插入的时候进行填充
UPDATE 表示修改的时候进行填充
INSERT_UPDATE 表示插入和修改的时候都进行填充
2、自定义公共填充类实现元对象处理器接口
/**
* 自动填充公共字段
*/
@Slf4j
@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {
private static final String ID = "id";
/**
* 创建人员ID
*/
private static final String CREATE_USER_ID = "createUserId";
/**
* 创建人员Code
*/
private static final String CREATE_USER_CODE = "createUserCode";
/**
* 创建时间
*/
private static final String CREATE_DATE = "createDate";
/**
* 更新人ID
*/
private static final String UPDATE_USER_ID = "updateUserId";
/**
* 更新人员code
*/
private static final String UPDATE_USER_CODE = "updateUserCode";
/**
* 更新时间
*/
private static final String UPDATE_DATE = "updateDate";
/**
* 删除标记
*/
private static final String DELETE_FLAG = "deleteFlag";
/**
* 新增
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
setFieldValByName(CREATE_USER_ID, "1", metaObject);
setFieldValByName(CREATE_USER_CODE, "admin", metaObject);
// 创建时间
setFieldValByName(CREATE_DATE, new Date(), metaObject);
// 删除标记
setFieldValByName(DELETE_FLAG, "0", metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// 更新用户
setFieldValByName(UPDATE_USER_ID, "123", metaObject);
setFieldValByName(UPDATE_USER_CODE, "admin", metaObject);
setFieldValByName(UPDATE_DATE, new Date(), metaObject);
}
}
类上增加注解 @Component 表示 此类加入 Spring 的管理,如果不加此注解,也可以通过注入 bean 的形式进行注入
当我们实现元对象处理器接口之后,我们可以重写接口中的两个方法
insertFill 和 updateFill
分别对插入时需要填充的公共字段 和 修改时需要填充的公共字段做处理,我这里只是简单的填充一些测试数据,可以按照自己的实际情况惊醒填充,比如拿到 security 中的用户进行填充或者拿到 session 中的用户进行填充等等,都可以
注意:
1、setFieldValByName 方法中,例如 UPDATE_DATE 等字段,必须使用驼峰转换之后的字段名,比如 update_date , 这里就是 updateDate,否则,在填充的时候不会报错,但是填充的数据就会一直是 null,所以这里的字段名必须要对应
2、需要填充的字段,必须要有 get 和 set 方法,否则也是会填充不进去的,我这里是在基础实体的父类中使用了 lombok 的 @data 注解来实现 get 和 set
3、如果填充的字段,一直都填充的是 null,请检查填充的字段和数据库字段是否没有对应上
三、测试自动填充
1、写两个接口测试插入以及修改
2、使用 postman 调用测试
测试插入
可以看到控制台输出的 sql 有插入我们在公共填充接口中填充的数据
测试修改
关注公众号查看更多资源