使用mybatis-plus实现公共字段自动填充

我们在做springmvc项目对数据做增加或修改数据的过程中,有些字段往往是不需要我们手动添加的,如当前时间信息、修改数据的当前用户信息等。对于这类操作,我们可以使用mybatis-plus提供的公共字段自动填充功能来帮助我们自动实现,每当我们插入或修改数据时,这些字段就会被自动填充成设置好的值,以下是实现方案:

  1. 首先,在要进行自动填充的实体类字段上添加@TableField注解来表明何时填充字段。例如:
@Data
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)    //插入时填充字段
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE) //插入和更新时填充字段
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)	//插入时填充字段
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)		//插入和更新时填充字段
    private Long updateUser;

}
  1. 创建自定义元数据对象处理器类实现MetaObjectHandler接口中的insertFill方法和updateFill方法,当进行增或改操作时会执行这两个方法中的操作。代码如下:
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]..." );

		// 设置createTime属性的值为LocalDateTime.now(),以下同理
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");

        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());

    }
}

这里存在一个问题,我们要获取当前登录用户的id值,但在这两个方法中我们无法获取存储在session中的属性,于是封装了一个基于ThreadLocal的工具类BaseContext ,用于保存当前登录的用户id。该类实现方法如下:

public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置值
     * @param id
     */
    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }


    /**
     * 获取值
     * @return
     */
    public static Long getCurrentId() {
        return threadLocal.get();
    }
}

在登录成功后调用set方法保存id值,之后可以在同一个线程中使用get方法访问该变量。

你可能感兴趣的:(springboot,mybatis,java,spring)