Mybatis Plus 公共字段自动填充功能

这篇具有很好参考价值的文章主要介绍了Mybatis Plus 公共字段自动填充功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 

1、问题引入

2、 基本功能实现

3、功能完善

3.1 ThreadLocal

3.1.1 介绍

3.1.2 常用方法

3.2 思路分析

3.3 代码实现


1、问题引入

在我们的项目开发中,我们会发现有一些数据库表字段是每个表都有的,例如 : 创建时间,创建人 ,更新时间,更新人。

而我们目前的针对这些字段我们的目前的处理方式就是 增加或者修改的时候一个一个的去赋值。

Mybatis Plus 公共字段自动填充功能

如果都按照上面的方法进行操作的话,那我们就需要在每个业务方法中进行操作,这样会不会显得我们的代码过于冗余、繁琐。

这个时候我们就可以使用Mybatis Plus提供的公共字段自动填充功能。

2、 基本功能实现

Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。

在上述的问题分析中,我们提到有四个公共字段,需要在新增/更新中进行赋值操作, 具体情况如下:

字段名

赋值时机

说明

createTime

插入(INSERT)

当前时间

updateTime

插入(INSERT) , 更新(UPDATE)

当前时间

createUser

插入(INSERT)

当前登录用户ID

updateUser

插入(INSERT) , 更新(UPDATE)

当前登录用户ID

接下来我们就开始编写代码。

首先第一步就是在实体类的属性上加入 @TableField 注解,指定自动填充的策略。

Mybatis Plus 公共字段自动填充功能

注 :

fill : 字段自动填充策略

Mybatis Plus 公共字段自动填充功能

添加好注解后,我们就需要按照框架要求编写元数据对象处理器这样的一个类,在此类中统一为公共字段赋值,注意!此类需要实现MetaObjectHandler接口。

Mybatis Plus 公共字段自动填充功能

创建好类,我们就可以开始编写操作代码了。

Mybatis Plus 公共字段自动填充功能

3、功能完善

细心的朋友已经发现,我们上面只填充了时间,并没有填充创建人和更新人,现在我们就来完善一下。

本来我想的是,我登录的时候是将用户id存入了HttpSession中,现在我从HttpSession中获取不就行了?

但是 ,MyMetaObjectHandler类中是不能直接获得HttpSession对象的,所以我们需要通过其他方式来获取登录用户id。

这里我们使用JAVA 给我们提供的一个类,ThreadLocal

在了解 ThreadLocal 之前我们先了解当我们在增加/修改员工信息时, 我目前项目业务的执行流程是什么样子的,如下图:

Mybatis Plus 公共字段自动填充功能

客户端发送的每次http请求,对应的在服务端都会分配一个新的线程来处理,在处理过程中涉及到下面类中的方法都属于相同的一个线程:

  • LoginCheckFilter (登录过滤器) 的doFilter方法
  • Controller的方法
  • MyMetaObjectHandler的insertFill/updateFill方法

我们可以在上述类的方法中加入如下代码(获取当前线程ID,并输出):

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

执行功能进行验证,通过观察控制台输出可以发现,一次请求对应的线程id是相同的。

3.1 ThreadLocal

3.1.1 介绍

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

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

3.1.2 常用方法

public void set(T value)

设置当前线程的线程局部变量的值

public T get()

返回当前线程所对应的线程局部变量的值

public void remove()

删除当前线程所对应的线程局部变量的值

3.2 思路分析

  1. 我们可以先在LoginCheckFilter(登录过滤器) doFilter方法中获取当前登录用户id。并调用ThreadLocalset方法来设置当前线程的线程局部变量的值(用户id)。
  2. MyMetaObjectHandlerinsertFill/updateFill方法中调用ThreadLocalget方法来获得当前线程所对应的线程局部变量的值(用户id)。
  3. 如果在后续的操作中, 我们需要在Controller / Service中要使用当前登录用户的ID, 可以直接从ThreadLocal直接获取。

3.3 代码实现

首先为了使用方便,我们可以编写一个基于ThreadLocal封装的工具类,主要get 和 set 方法。

/**
 * @description: 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 * @author: Jie
 * @date: 2022/8/12 14:18
 **/
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * @description: 设置值
     * @author: Jie
     * @date: 2022/8/12 14:18
     * @param: [id] 线程id
     **/
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
    /**
     * @description: 获取值
     * @author: Jie
     * @date: 2022/8/12 14:18
     **/
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

然后在LoginCheckFilter(登录过滤器)的doFilter方法中调用BaseContext来设置当前登录用户的id。

Mybatis Plus 公共字段自动填充功能

接下来我们就可以 在MyMetaObjectHandler的方法中调用BaseContext获取登录用户的id。

Mybatis Plus 公共字段自动填充功能文章来源地址https://www.toymoban.com/news/detail-446290.html

到了这里,关于Mybatis Plus 公共字段自动填充功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis-plus 自动填充创建时间/更新时间

    方式一:数据库级别 创建时间create_time字段设置类型为timestamp,默认值为CURRENT_TIMESTAMP; 更新时间update_time字段设置类型为timestamp,默认值为CURRENT_TIMESTAMP,勾选 根据当前时间戳更新 。 实体类createTime字段设置数据类型为Date; 实体类updateTime字段设置数据类型为Date。 注意:

    2024年02月14日
    浏览(103)
  • 【mybatis-plus实体类复杂对象字段json自动相互转换,以及自定义字段类型解析器】

    引言: mybatis-plus集合对象字段json如何自动进行相互的转换? 怎样在使用mybatis-plus操作数据表的时候自动对实体类属性进行自动解析? 我们平时在做开发的时候,会遇到一个字段保存json串的情况。一般情况下mybatis-plus在做插入/更新之前将对象手动转换成json串,查询要用的时

    2023年04月13日
    浏览(100)
  • Mybatis-Plus不能更新对象字段为空值问题解决

    问题描述: 在使用Mybatis-Plus调用updateById方法进行数据更新默认情况下是不能更新空值字段的,而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况,该如何解决呢? 原因分析: Mybatis-Plus中字段的更新策略是通过FieldStrategy属性控制的。在实体字段上,如果不通

    2024年02月12日
    浏览(49)
  • Mybtisplus对时间字段进行自动填充

            这里我主要对字段createTime和updateTime进行自动填充,你们可以修改为自己对应的字段即可。         在需要填充的字段上加入 @TableField(fill = FieldFill.INSERT)或者 @TableField(fill = FieldFill.UPDATE),当执行SQL语句时就会拦截语句随后对SQL语句添加了@TableField的时间字段进行时

    2024年01月25日
    浏览(45)
  • mybatisplus在新增或者修改时设置字段自动填充

    1、需要实现元对象字段填充控制器抽象类,如下代码 fieldName要注意对应的生成的实体字段,不是数据库对应字段,否则无效 2、在生成的实体字段,@TableField增加fill填充,并写入填充的时机是新增还是修改 在此过程中可能会出现的错: 修改或者插入的时候报类型无效,jav

    2024年01月17日
    浏览(54)
  • MyBatis Plus 数据库字段加密处理

    当项目开发到一半,可能突然客户会要求对数据库里面比如手机号、身份证号的字段进行加密; 在保证开发最快、影响范围最小的情况下,我们需要选择一种介于数据库和代码之间的工具来帮我们实现自动加解密; 这里我们选用AES对称加密算法,因为它是可逆算法。 AES加密

    2024年02月07日
    浏览(61)
  • Mybatis-plus更新字段为null

    更新时,把某些字段的值更新为null,但是目前mybatis-plus的update/updateById会忽略实体类中为null的字段,导致这些字段没有更新还是原来的值。 网上比较常用的有两种: 缺点:当在其它接口更新别的字段时,本来没有想更新这个字段,但是也会把这个字段更新为null。 缺点:需

    2024年02月06日
    浏览(65)
  • Mybatis-plus怎么更新Null字段?

    本文介绍【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法。 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法,快速将接收道德参数或者查询结果中原本不为null的字段更新为null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现

    2024年02月13日
    浏览(51)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(39)
  • mybatis-plus更新字段为null值

    mybatis-plus相信大家都不陌生所以不在介绍 首先我们先看一下mybatis-plus的官网上的介绍  官网推荐的有三种方式可以实现 第一种:调整全局策略, mybatis-plus默认的全局策略为NOT_NULL非空默认策略,其实就是当更新是某个字段为空,则不对该字段进行更新,这也是我们常用的策略所此种

    2024年02月14日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包