目录
一 什么是公共字段自动注入
二 使用mp实现公共字段自动注入
1.实现步骤
①导入mp相关依赖
② 在实体类上给相关字段加上 @TableField()注解
③自定义元数据对象处理器
2.实现原理
一 什么是公共字段自动注入
我们平时在执行更新或者是插入数据功能的时候,都需要给一些公共的字段赋值,比如创建时间,更新时间,创建人,更新人等。这些字段在执行插入或者更新功能的时候,都需要注入一遍这些字段,导致重复代码过多。所以为了解决这一问题,我们可以每次在执行更新或者插入功能的时候,都自动调用一个方法,把这些公共的字段自动注入,这样就省下很多时间。比如下面这些字段:
二 使用mp实现公共字段自动注入
因为本项目是基于springBoot整合mybatisPlus的,所以这次介绍的也是mybatisPlus实现公共字段注入。
1.实现步骤
①导入mp相关依赖
<!-- mp--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>3.4.1</version></dependency>
这里有时候加入mp的依赖后,项目会报错,因为mybatis和mybatisPlus依赖会有冲突,我就是一开始报错,后面使用上面这个版本的之后才没有报错。
② 在实体类上给相关字段加上 @TableField()注解
public class Employee implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String name;private String password;private String phone;private String sex;private String idNumber;private Integer status;@TableField(fill = FieldFill.INSERT) //执行插入操作时自动填充 // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //该注解的作用是:让返回给前端的日期格式按照我指定的格式,否则返回的是一个数组private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)//执行插入和更新操作时自动填充//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)//执行插入操作自动填充private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)//执行插入和更新时自动填充private Long updateUser;}
@TableField(fill = FieldFill.INSERT):执行插入操作时自动注入该字段@TableField(fill = FieldFill.INSERT_UPDATE): 执行插入更新操作时注入该字段还有其他的属性,根据业务需求可以自己去查。
③自定义元数据对象处理器
需要再定义一个类,需要实现 MetaObjectHandler,然后实现里面的 insertFill() 和 updateFill() 方法,分别代表在执行插入操作和更新操作时执行对应的方法,而方法内部去实现你需要注入的字段的值,代码如下:
@Component @Slf4j public class MyMetaObjectHandle implements MetaObjectHandler { // 插入操作的时候执行该方法@Overridepublic void insertFill(MetaObject metaObject) {log.info("insert公共字段自动填充...{}",metaObject.getOriginalObject());metaObject.setValue("createTime", LocalDateTime.now());// 给createTime属性自动填充值metaObject.setValue("updateTime",LocalDateTime.now());metaObject.setValue("createUser", BaseContext.getCurrentId());//获取当前管理员idmetaObject.setValue("updateUser",BaseContext.getCurrentId());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("update公共字段自动填充... {}",metaObject.getOriginalObject());metaObject.setValue("updateTime",LocalDateTime.now());metaObject.setValue("updateUser",BaseContext.getCurrentId());} }
metaObject.setValue("createTime", LocalDateTime.now()) : createTime你需要注入的属性名;LocalDateTime.now()注入的属性值这里一定要加上@Component注解把bean交给spring管理。
注意:如果你的项目并不是一开始就基于MybatisPlus创建,而是后面加上去的,在执行上面三个步骤之后,你的my公共字段注入是不生效的,因为你还忘记了mapper成需要实现BaseMapper接口,这是实现mp必须要的。
2.实现原理
这里简单来说,就是使用了aop+反射+注解+枚举。如果你不是使用my来实现的,就需要自己去写这个过程,mp是帮我们封装好了。大致就是,你使用aop的前置处理,在执行插入和更新操作之前做切面处理,至于怎么识别,可以在插入和更新方法上面加上注解标记,然后用反射得到注解类型进行判断,最后用反射实现对象对应属性的注入操作.