首页 > 其他分享 >后端开发中的实体实现公共字段自动填充

后端开发中的实体实现公共字段自动填充

时间:2024-02-12 15:00:13浏览次数:34  
标签:setValue metaObject 填充 实体 BaseContext ThreadLocal 线程 公共 LocalDateTime

1、利用MyMateObjectHandler继承MataObjectHandler重写insertFill和updateFill方法,使用自定义的规则对相应的字段进行填充

package cn.pickle.reggle.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;

/**
 * 公共字段自动填充
 * @author Pickle
 * @version V1.0
 * @date 2022/10/13 9:03
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 执行插入操作时执行
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {

        metaObject.setValue("createTime", LocalDateTime.now());

        metaObject.setValue("updateTime", LocalDateTime.now());

        metaObject.setValue("createUser",BaseContext.getCurrentId());

        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }

    /**
     * 执行更新操作时执行
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {

        metaObject.setValue("createTime", LocalDateTime.now());

        metaObject.setValue("updateTime", LocalDateTime.now());

        metaObject.setValue("createUser",BaseContext.getCurrentId());

        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}

2、在需要自动填充的实体字段上加入@TableField注解

 @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;

3、对修改对象进行填写和修改的时候,当前修改人的id存在session中,但是在MyMateObjectHandler中获取不到Session对象这就需要使用ThreadLocal来实现线程独立变量的保存,使得可以在持久化层也可以获取到当前操作人的id。

所以可以在LoginCheckFilter中将Session中的当前登陆用户的Id保存到TreadLocal中,再从MyMetaObjectHandler中需要的时候取出来,并且填入实体对象中。
这里设计一个ThreadLocal工具

package cn.pickle.reggle.common;

/**
 * 基于ThreadLocal封装工具类,用于获取和保存当前登陆的ID
 * 保存的值作用域是一个线程之内
 * 之所以使用BaseContext是因为要获取当前登录用户的id只能在session中获取,但是数据库持久化的时候是无法获取
 * session的,所以使用一个BaseContext将session中的用户的id传递到持久化层中,主要起到传递数据的作用
 * @author Pickle
 * @version V1.0
 * @date 2022/10/13 9:49
 */
/*
而 ThreadLocal 的生命周期是与线程的生命周期相关联的。每个线程拥有自己独立的 ThreadLocal 实例,这些实例存储在线程的 ThreadLocalMap 中。
当线程结束时,ThreadLocalMap 中的 ThreadLocal 实例会被垃圾回收,但 ThreadLocal 实例本身不会被立即回收,直到没有任何对它的引用时才会被回收。
因此,尽管在一个HTTP请求的处理过程中可能涉及多个线程(例如线程池中的多个线程处理不同阶段的任务),但 ThreadLocal 实例通常是在线程开始时创建,
在线程结束时被垃圾回收。因此,ThreadLocal 的生命周期通常比一个HTTP请求的生命周期更长。
 */
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();
    }

}

先在LoginCheckFilter中添加id信息

 BaseContext.setCurrentId((Long)request.getSession().getAttribute("employee"));

在MyMetaObjectHandler中这样使用

标签:setValue,metaObject,填充,实体,BaseContext,ThreadLocal,线程,公共,LocalDateTime
From: https://www.cnblogs.com/poteitoutou/p/18013916

相关文章

  • Java后端项目实现无限级树 - 案例:部门树 - Department实体类
    privateList<Department>getDeptTree(){   //1.一次性查询出所有数据,放到内存中,可以使用map - 做缓存用   //2.从所有数据中找出第一层级/顶级部门:这就是我们需要返回的数据   //3.遍历所有部门只要不是第一层级的,找自己的上级,并将自己放入上级的childre......
  • 43、excel快速填充序列号,删除行时序号自动跟上
    平时填充序号的做法:首先在第1、2行输入1、2,然后用手往下拖动,填充后面的行,缺点:当我删除一行时,后面的序号不会自动按顺序填充上 解决方法:1、在excel上选中A6单元格,然后左上角输入A6:A110,按【回车】键2、直接输入【=ROW()-1】,再按【ctrl+回车】键盘就可以了缺点:由于公......
  • EXCEL自动填充
    办公软件让我们的工作更方便快捷,如何灵活运用办公软件可是一门大学问。大家都知道在鼠标指到单元格右下角,指针变成十字的时候下拉单元格就能实现自动填充,可当该列需要填充几千个单元格的时候,下拉就变得不方便了,下面就来分享一个可以快速批量填充的方法方法/步骤先来看一下下面这个......
  • 【动态规划】最长公共子串
    目录题目应用1:最长公共子串题目解题思路边界条件状态转移代码实现应用2:Leetcode718.最长重复子数组题目解题思路代码实现解题思路方法一:动态规划初始条件状态转移复杂度方法二:滑动窗口复杂度代码实现题目应用1:最长公共子串题目给定两个字符串text1和text2,返回这两个......
  • iView中Select无法自动填充值
      如下所示,使用的iView组件,在Select标签中有两个Option,其中一个是全部选项,当点击全部的时候,就会选中所有的工厂,再次点击全部的时候,可以取消选择所有工厂,同时不影响单个点击工厂。<Select:disabled="isUpdate==true"transfermultiplefilterableclearablev-model="queryD......
  • HanLP — 命名实体识别
    目录8.命名实体识别8.1概述8.2基于隐马尔可夫模型序列标注的命名实体识别8.3基于感知机序列标注的命名实体识别8.4基于条件随机场序列标注的命名实体识别8.5命名实体识别标准化评测8.6自定义领域命名实体识别8.命名实体识别8.1概述命名实体文本中有一些描......
  • 算法题-最近公共祖先
    目录小米Git题目描述思路pyjava小米Git原题链接题目描述Git是一个常用的分布式代码管理工具,Git通过树的形式记录文件的更改历史(例如示例图),树上的每个节点表示一个版本分支,工程师经常需要找到两个分支的最近的分割点。给定一个用邻接矩阵matrix表示的树,请你找到版本v......
  • 实体类对象与Vo视图对象转换举例
    实体类对象:packagecom.yupi.ojSystem.model.entity;importcom.baomidou.mybatisplus.annotation.*;importjava.io.Serializable;importjava.util.Date;importlombok.Data;/***题目*@TableNamequestion*/@TableName(value="question")@Datapubl......
  • 【学习笔记】最近公共祖先
    最近公共祖先简称LCA(LowestCommonAncestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。——OIWiki我们首先想到的肯定就是暴力往上爬,直到它们相遇。但是这个算法在数据量很大的时候就会超时。因此我们有了倍增优化的LCA。倍增是什么呢?顾名思义,......
  • WPS JS 宏根据单元格内容填充颜色
    WPSJS宏根据单元格内容填充颜色直接上代码/***Macro1Macro*宏由Steven录制,时间:2024/01/30*/functionSetCellColorsBYMacro(){ //获取表格的行数和列数varrowCount=48;varcolAll=['A','B','C','D','E',&......