公共字段自动填充:
前面我们已经完成了后台系统员工管理功能的开发,在新增员工时需要设置创建时间,创建人,修改时间,修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表都有这些字段,就可以使用mybatis plus提供的公共字段自动填充功能。
代码实现
Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。
实现步骤:
1、在实体类的属性上加入@TableField注解,指定自动填充的策略
2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口
先完成步骤一:对实体类的属性添加:
@TableField(fill = FieldFill.INSERT @TableField(fill = FieldFill.INSERT_UPDATE)
package com.cyx.reggie.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@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、编写BaseContext工具类,基于ThreadLocal封装的工具类
2、在LoginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id
3、在MyMeta0bjectHandler的方法中调用BaseContext获取登录用户的id
1:
package com.cyx.reggie.common;
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(long id) {
threadLocal.set(id);
}
public static long getCurrentId() {
return threadLocal.get();
}
}
2:
添加这两行代码,登陆状态下获取用户id
3.公共字段填充
创建一个类:
package com.cyx.reggie.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]......");
log.info(metaObject.toString());
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) {
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
}
然后这里面用到的ThreadLocal,我会再写一篇文章详解ThreadLocal和线程,以及如何使用和公共字段的基础解释,写完我会在这里放链接。