再新增一些数据时,需要默认填充一些动态数据,比如创建账号的时间等,为了简介方便,将此类步骤封装起来,封装到线程中,在一次请求中,自动走到线程中去执行添加及更新公共字段
需使用的技术
- MyBatisPlus的公共字段自动填充功能,在实体类中找到需要自动填充的字段,使用注解@TableField 及注解中的属性(fill = FieldFill.INSERT/FieldFill.INSERT_UPDATE)
- MyBatisPlus的一个接口,MetaObjectHandler,实现insertFill和updateFill方法,在其中填写相应的字段填充
问题:
有一些数据需要在servlet作用域中获取,因此需要使用线程来获取其中的数据
需要用到:
1). LoginCheckFilter的doFilter方法***过滤器
2). EmployeeController的update方法***控制层的需要添加或修改的方法
3). MyMetaObjectHandler的updateFill方法***MyMetaObjectHandler的自动填充方法
@Component
public class FieldMetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", Long.valueOf((String) ThreadLocalSet.getId()));
metaObject.setValue("updateUser", Long.valueOf((String) ThreadLocalSet.getId()));
}
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", Long.valueOf((String) ThreadLocalSet.getId()));
}
}
ThreadLocal
A. public void set(T value) : 设置当前线程的线程局部变量的值
B. public T get() : 返回当前线程所对应的线程局部变量的值
C. public void remove() : 删除当前线程所对应的线程局部变量的值
public class ThreadLocalSet{
private static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public static Object getId(){
return threadLocal.get();
}
public static void setId(Object id){
threadLocal.set(id);
}
}
总结
- 先把自动填充功能写完
- 再创建工具类,基于ThreadLocal,获取存储于作用域中的数据
- 在过滤器中调用工具类的方法,设置数据
- 在MyMetaObjectHandler类中调用工具类的方法,获取数据