首页 > 其他分享 >MP 公共字段填充

MP 公共字段填充

时间:2023-01-16 16:33:06浏览次数:37  
标签:setValue metaObject 填充 public ThreadLocal 线程 MP 公共 id

一、MybatisPlus

1、公共字段填充

​ 统一为公共字段进行处理,在插入或更新时为指定字段赋予指定的值,减少了重复代码。公共字段一般为创建/更新时间,创建/更新人。可以通过LocalDateTime.now()来对创建/更新时间进行赋值,而创建/更新人可以通过 ThreadLocal 来赋值。ThreadLocal 是 JDK 中提供的一个类。

实现步骤:

  1. 实体类属性加入@TableFiled注解,指定自动填充策略
  2. 框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,该类需要实现MetaObjectHandler接口
@Data
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    @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;
}


@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("元数据处理[insert]");
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", new Long("1L"));
        metaObject.setValue("updateUser", new Long("1L"));
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("元数据处理[update]");
        long id = Thread.currentThread().getId();
        log.info("元数据处理的线程id:{}", id);
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", new Long("1L"));
    }
}

如何获取用户id?

MyMetaObjectHandle'类中是不能获得HttpSession对象,因此不能在MyMetaObjectHandler通过HttpSession来获取用户id。可以通过ThreadLocal类来获取用户id

什么是ThreadLocal?

  • ThreadLocal 类用来提供线程内部的局部变量,不同的线程之间的局部变量不会相互干扰
  • 在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量 ThreadLocal 为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
常用方法 作用
public T get() 获取当前线程绑定的局部变量
public void set( T value) 设置当前线程绑定的局部变量

为什么可以使用ThreadLocal?

客户端每次发送请求,对应的服务端都会分配一个新的线程来处理。同一个请求响应链中涉及的方法都属于同一个线程。可以在调用链中使用如下方法来确认此事:

long id = Thread.currendThread().getId;
log.info("线程id:{}",id);

设置公共字段填充中的用户id字段

​ 将设置 id,获取 id 的方法封装为一个工具类

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

    /**
     * 为当前线程设置id
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    /**
     * 获取当前线程中的id
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

​ 通过 ThreadLocal 的 set 方法设置当前线程的线程局部变量的值,在元数据对象处理类中的方法调用 Thread 的 get 方法来获取当前线程所对应的线程局部变量的值。

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("元数据处理[insert]");
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", UserIdContext.getCurrentId());
        metaObject.setValue("updateUser", UserIdContext.getCurrentId());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("元数据处理[update]");
        long id = Thread.currentThread().getId();
        log.info("元数据处理的线程id:{}", id);
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", UserIdContext.getCurrentId());
    }
}

问:户登录成功后我们将用户 id 存入了 HttpSession 中,MyMetaObjectHandler 类中是不能获得 HttpSession 对象,为什么?

标签:setValue,metaObject,填充,public,ThreadLocal,线程,MP,公共,id
From: https://www.cnblogs.com/9fall/p/17055737.html

相关文章

  • minio-docker-compose-secrets.yaml
    docker-compose-secrets.yamlversion:'3.7'services:minio1:image:minio/minio:RELEASE.2020-06-03T22-13-49Zhostname:minio1volumes:-m......
  • minio-docker-compose.yaml
    docker-compose.yamlversion:'3.7'#Settingsandconfigurationsthatarecommonforallcontainersx-minio-common:&minio-commonimage:quay.io/minio/minio......
  • Neural Dynamics on Complex Networks-KDD20
    一、摘要学习复杂网络上的连续时间动态对于理解、预测和控制科学和工程中的复杂系统至关重要。然而,由于高维系统结构中的组合复杂性、它们难以捉摸的连续时间非线性动力学......
  • @ServletCompontScan 和 @ComponentScan
    @ServletComponentScan在SpringBootApplication上使用@ServletComponentScan注解后,servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注......
  • postgres使用pg_dump/psql导入导出
    准备打开windows下的命令窗口:开始->cmd->安装数据库的目录->进入bin目录;导出pg_dump–hlocalhost–Uusername–p5432–ddb_name–f"D:/test.dmp"可选参数U......
  • 如何用ffmpeg对3GP文件进行GOP转码设置
    最近项目中在播放3gp文件时,有时客户端解码识别,后面对3gp文件的GOP值进行修改了,然后可以正常播放。下面转码命令实例贴一下,供大家参考:ffmpeg-i5e02eec746384b2e9cdb5de6791......
  • 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析Import
    每日一句人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看、好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好。注入案例......
  • 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析Import
    每日一句人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看、好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好。注......
  • 【学习日志】Java8的CompletableFuture
    Java8引入的CompletableFuture,对Future做了改进:1.可以传入回调对象,不再像Future那样循环查询执行结果。2.另外可以将多个Future结合到一起并行或串行执行,主要方法如下:......
  • openmp 并行计算
    ​​代码在git​​example.cpp#include<iostream>#include<omp.h>#include<string>intmain(intargc,char*argv[]){std::cout<<"numberofavailableprocessors......