ThreadLocal线程工具类 以及 MybatisPlus自动填充

108 阅读1分钟

ThreadLocal自定义线程工具类,最最简单的使用

  • 基于ThreadLocal封装工具类,用于在线程内部的多个方法间传递数据,eg:登录的用户ID
    
  • 该工具类保证了唯一性之一:ThreadLocal唯一
    
  • 另外一个唯一性:使用同一个线程,需要其他代码本身(Filter、Controller、Service、mapper等方法调用)来实现
    

- 注意:一个请求就是一个线程


  
@Configuration//配置类加载进Spring容器
public class ThreadLocalUtil {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

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

    /**
     * 获取值
     * @return  返回用户的登录ID
     */
    public static Long getCurrentId() {
        return threadLocal.get();
    }


    /**
     * 删除值  
     */
      注意:该方法无法传入参数
    public static void remove() {
       threadLocal.remove();
    };
}

mybatisplus 自动填充功能实现

eg:实体类需要实现自动填充的字段,什么字段需要自动填充,就在该字段上方加入注解: @TableField(fill = FieldFill.INSERT)或者 @TableField(fill = FieldFill.INSERT_UPDATE)

image.png
@Component   
public class MydateHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        /*
        第一个参数是实体类中的创建时间属性,第二个是修改记录时间属性
       -- 自动将用户id填充进线程工具类中
         */
        metaObject.setValue("createTime",LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        Long employeeId = ThreadLocalUtil.getCurrentId();
        metaObject.setValue("createUser",用户ID);
        metaObject.setValue("updateUser",用户ID);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        /*
        实体类中修改时间的属性
         */
        metaObject.setValue("updateTime",LocalDateTime.now());
        Long employeeId = ThreadLocalUtil.getCurrentId();
        metaObject.setValue("updateUser", 用户ID);
    }
}