在搭建的后端应用中,我们使用了 mybatis-plus 框架作为扩展,减少 sql 的书写,提升开发效率,其中有个功能很好用,就是自动填充。在项目中,我们的后台表一般会具有一些标准字段,作为强制建表规范,比如:
- create_by 创建者
- creation_date 创建时间
- last_updated_by 最后更新者
- last_update_date 最后更新时间
这些字段我们会放到 Entity类中,作为其他 Entity的超类,这样就不用重复定义了,但是有个问题,在每次修改数据时,都需要给这几个字段赋值,这显然就有点繁琐了,如果能系统自动读取相关值并填充就能省略很多代码,mybatis plus 的自动填充正是一个这样的功能。
创建这个Entity基类
java
package com.hjycommunity.common.core.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
* Entity 基类
**/
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 搜索值
* @TableField(exist = false)注解加载bean属性上,表示当前属性不是数据库的字段,
* 但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错
*/
@TableField(exist = false)
private String searchValue;
/**
* 创建者
* fill 在需要被填充的字段上使用注解,声明什么时候要被填充
* FieldFill.INSERT 只在插入时填充
* FieldFill.INSERT_UPDATE 插入和更新时都填充
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 更新者 */
@TableField(fill = FieldFill.INSERT)
private String updateBy;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
private Date updateTime;
/** 备注 */
private String remark;
/** 请求参数 */
@TableField(exist = false)
private Map<String, Object> params;
//get/set ......
}
自定义填充控制器
- 前面我们说到mybatis plus的自动填充功能,除了要在字段上添加相关注解以外,自定义类还需要实现MetaObjectHandler接口,重写接口方法,实现公共字段自动写入。
- 创建自定义填充控制器,包结构:
com.xxx.common.handler
java
/**
* 自定义填充控制器
* @author spikeCong
* @date 2023/2/28
**/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//insert时要填充的字段
@Override
public void insertFill(MetaObject metaObject) {
//根据属性名称设置要填充的值
this.strictInsertFill(metaObject,"createBy",String.class,"admin");
this.strictInsertFill(metaObject,"updateBy",String.class,"admin");
this.strictInsertFill(metaObject,"createTime", Date.class,new Date());
this.strictInsertFill(metaObject,"updateTime", Date.class,new Date());
}
//update操作时要填充的字段
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject,"updateBy",String.class,"admin");
this.strictUpdateFill(metaObject,"updateTime", Date.class,new Date());
}
}