数据库公共字段自动填充

使用Mybatis Plus提供的公共字段自动填充功能

Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。在上述的问题分析中,我们提到有四个公共字段,需要在新增/更新中进行赋值操作 实现步骤:

1、在实体类的属性上加入@TableField注解,指定自动填充的策略。

  1. 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口。

1). 实体类的属性上加入@TableField注解,指定自动填充的策略。

在员工Employee实体类的公共字段属性上, 加上注解, 指定填充策略。

  1. . 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口。

在数据库很多表中由于很多字段是公共的,比如创建时间,创建人id等,可以用一个元数据处理器(上面这个类)进行公共字段的填充。

但是,这个类是获取不到当前登录用户的id的,因为它获取不到cookie,需要别的类传递给它id!

所以,该怎么解决这个id问题呢?

通过演示可知,在进行添加员工或更新员工操作时,过滤器、Controller类以及这个类使用的是同一个线程!

因此,有一个好的方法,使用ThreadLocal类(它是一个线程局部变量,每一个线程是一个作用范围)

通过ThreadLocal获取线程ID:

具体方法:

public void set(T value)//设置当前线程的线程局部变量的值

public T get()//返回当前线程所对应的线程局部变量的值

ThreadLocal:

在学习ThreadLocal之前,我们需要先确认一个事情,就是客户端发送的每次http请求,对应的在服务端都会分配一个新的线程来处理。在处理过程中涉及到下面类中的方法都属于相同的一个线程:

1、LoginCheckFilter的doFilter方法

2、EmployeeController的update方法

  1. MyMetaObjectHandler的updateFill方法

什么是ThreadLocal?

ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

我们可以在LoginCheckFilter(这个类是登陆过滤器)的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在yMetaObjectHandler的updateFill方法中调用ThreadLocall的get方法来获得当前线程所对应的线程局部变量的值(用户id)。

1、编写BaseContext工具类,基于ThreadLocal封装的工具类

在工具类中有两个静态方法,在其他类中可以使用。

在过滤器类中,当登录成功时,嵌入以下代码,获取当前登录id

2.在LoginCheckFilter的doFilter2方法中调用BaseContext:来设置当前登录用户的id

3、在MyMetaObjectHandleri的方法中调用BaseContext获取登录用户的id

然后在其他类中,调用BaseContext.getCurrentId()方法,即可成功完成不同的类之间的id的传递!

这样就解决了一些类不能获取到当前用户id的问题。

这样也解决了在不同的类之间传递参数的问题(前提是得经过同一个线程)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值