瑞吉外卖项目-07公共字段自动填充

随着业务功能的增加,我们的代码量也越来越多,逐渐我们发现在不同的业务中存在着很多重复的代码,例如,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段,这导致我们写起来异常繁琐,

因此,我们想到了一个解决办法,那就是将这些重复的字段统一处理,以达到简化开发的目的;

首先,我们需要在实体类中需要被统一管理的字段上上面加上 @TableField注解,并在内部添加fill属性,INSERT为在执行新增操作时执行,@TableField(fill = FieldFill.INSERT加在create time字段上,即在调用maybatis-plus的save方法时,便会自动为create time字段赋值,即达到了自动填充的效果,同理,加上UPDATE即在调用update方法时也会执行自动填充,此步骤完成后,并不能成功执行,我们还需要进行下一步配置

 我们还需要再创建一个类(类名随意),需要实现MetaObjectHandler接口,重写其中的insert fill方法和update fill方法,顾名思义,即这两个方法会自动在执行insert和update语句时自动执行,我们只需在方法中写上我们需要进行的操作,便可成功使用,调用metaObject的setvalue方法,这个方法里面需要传入两个参数,第一个是需要操作的公告字段,第二个是要给这个字段填充的内容,

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@Slf4j
public class MymetaObject implements MetaObjectHandler {

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


    }

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",Basecontext.getCurrentid());

    }
}

 下面我们详细讲一下Basecontext.getCurrentid()方法,因为我们无法直接使用Httpservletrequest,因此无法获取session,那么此时我们要如何获取用户id呢,我们选择使用ThreadLocal为我们提供的方法来实现,

什么是ThreadLocal?

ThreadLocal并不是一个Thread,而是Thread的局部变量
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本
所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
ThreadLocal常用方法:

public void set(T value) 设置当前线程的线程局部变量的值
public T get() 返回当前线程所对应的线程局部变量的值
 

我们可以在LoginCheckFilter的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在MyMetaObjectHandler的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。
首先在common包下添加BaseContext类
作用:基于ThreadLocal封装工具类,用于保护和获取当前用户id

 然后在LoginCheckFilter类中调用其中的方法

 此时便可以获取用户id,再进入MyMetaObjectHandler类中将这个存入的id取出,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值