一、 公共字段自动填充
二 、 ThreadLocal
什么是threadlocal:
threadlocal 并不是一个线程,而是线程的局部变量,当多个类公用一个线程时,可以使用threadlocal进行参数传递(set/get。。Method)。threadlocal为每一个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取 到对应的值,线程外则不能访问。
实体类添加@TableField注解,标注该字段新增、插入时自动填充(填充条件)
ThreadLocal存取自动填充字段对应主键值得工具类
package com.wa.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();
}
}
华丽的分割线
华丽的分割线
package com.wa.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) {
System.out.println("公共字段自动填充【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) {
System.out.println("公共字段自动填充【update】");
log.info(metaObject.toString());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
}