SpringBoot基于MyBatisPlus实现公共字段自动填充

 更新时间:2025年08月21日 08:47:25   作者:future romance  
本文介绍了一种在MyBatisPlus中实现公共字段自动填充的方法,包括创建MetaObjectHandler实现类和在实体类中添加注解,具有一定的参考价值,感兴趣的可以了解一下

问题背景

在增加或修改记录时,常常需要对一些公共字段进行设置,如创建时间(createTime)、创建人(createUser)、修改时间(updateTime)、修改人(updateUser),这些信息一般不来自于网页请求。实际项目中可能有很多种Entity(实体类),对每一个Entity对应的业务代码中都要写这些针对公共字段的操作,造成了代码的大量重复。

因此,可以创建一个用于公共字段自动填充的类,使得公共字段实现自动填充。

实现方式

主要分为两大部分:

  • 1. MetaObjectHandler实现类创建
  • 2. 实体类中公共字段添加注解

1. MetaObjectHandler实现类创建

首先,建立一个MetaObjectHandler接口的实现类(MetaObjectHandler是MyBatisPlus提供的接口)

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

之后,重写相关方法 (insertFill(MetaObject metaObject) 和 updateFill(MetaObject metaObject) )

@Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        log.info("线程id:{}", Thread.currentThread().getId());

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", threadLocal.get());  // 动态填充 填充当前登录的用户的 ID
        metaObject.setValue("updateUser", threadLocal.get());  // 动态填充 填充当前登录的用户的 ID
    }


    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        log.info("线程id:{}", Thread.currentThread().getId());

        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", threadLocal.get());
    }

注意:在对createUser和updateUser进行设置时(通常是设置id),无法拿到session,因此不能通过session的方式获取id。这里使用的是ThreadLocal

需要知道的是,页面向服务器发送的每一个请求,在服务器端都会有一个独立的线程根据该请求进行一系列操作。例如,页面发来一个修改用户的请求,到了服务器端,拦截器的preHandle方法、controller层的update方法,以及公共字段填充类的updateFill方法都是由同一个线程执行的

因此,可以在拦截器执行preHandle方法时,将session中的id数据保存到ThreadLocal对象中,在进行公共字段填充时,再将id从ThreadLocal对象中取出即可。

我将ThreadLocal配置成了一个Bean来管理(也可以用一个工具类来封装ThreadLocal,定义一个类变量)

ThreadLocal的Bean配置:

@Configuration
public class ThreadLocalConfig {
    @Bean
    public ThreadLocal<Long> threadLocal(){
        ThreadLocal<Long> threadLocal = new ThreadLocal<>();
        return threadLocal;
    }
}

拦截器注入ThreadLocal,并将id存入ThreadLocal:

public class MyInterceptor implements HandlerInterceptor {

    @Autowired
    ThreadLocal<Long> threadLocal;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("线程id:{}", Thread.currentThread().getId());
        threadLocal.set((Long) request.getSession().getAttribute("employeeId"));
        ...
        对session进行判断的代码
        ...
    }
}

之后,在MetaObjectHandler实现类中也对ThreadLocal的Bean进行注入

2. 实体类中公共字段添加注解

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

如此,便实现了公共字段的自动填充

到此这篇关于SpringBoot基于MyBatisPlus实现公共字段自动填充的文章就介绍到这了,更多相关SpringBoot MyBatisPlus公共字段自动填充内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Java实现裁剪和压缩PPT中的图片

    使用Java实现裁剪和压缩PPT中的图片

    在工作中,PPT演示文稿广泛应用于报告、课程内容展示以及项目计划,然而,当 PPT 文件中包含大量图片时,文件大小常常大幅增加,导致加载缓慢、分享困难等问题,因此在这篇文章中,我们将详细介绍如何使用Java实现裁剪和压缩PPT中的图片,需要的朋友可以参考下
    2026-03-03
  • springmvc请求参数的绑定的项目实践

    springmvc请求参数的绑定的项目实践

    本文主要介绍了springmvc请求参数的绑定的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 单例Bean注入多例Bean属性失效问题的四种解决方案

    单例Bean注入多例Bean属性失效问题的四种解决方案

    在实际的开发过程中,我们有可能会遇到这样一个场景:多例对象 A 需要作为属性注入给单例对象 B,但是我们每次获取 B 的时候,发现注入的 A 每次都是同一个,并不是多例的,所以本文给大家介绍了如何解决单例Bean注入多例Bean属性失效问题,需要的朋友可以参考下
    2024-05-05
  • 使用GraalVM如何将SpringBoot项目打包成exe

    使用GraalVM如何将SpringBoot项目打包成exe

    本文介绍了如何使用GraalVM和Maven将Spring Boot项目打包成可执行文件的步骤,并详细解释了在打包过程中遇到的常见错误及其解决方法
    2024-12-12
  • 详解Java中的敏感信息处理

    详解Java中的敏感信息处理

    平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助
    2025-01-01
  • Spring Boot 实现https ssl免密登录(X.509 pki登录)

    Spring Boot 实现https ssl免密登录(X.509 pki登录)

    这篇文章主要介绍了Spring Boot 实现https ssl免密登录(X.509 pki登录),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解Java如何优雅的实现异常捕获

    详解Java如何优雅的实现异常捕获

    在一个优秀的项目中一定少不了对程序流程良好的异常捕获与日志打印,所以本文主要为大家介绍了如何优雅的实现异常捕获与日志打印输出,有需要的可以参考下
    2023-09-09
  • 详解SpringBoot中@PostMapping注解的用法

    详解SpringBoot中@PostMapping注解的用法

    在SpringBoot中,我们经常需要编写RESTful Web服务,以便于客户端与服务器之间的通信,@PostMapping注解可以让我们更方便地编写POST请求处理方法,在本文中,我们将介绍@PostMapping注解的作用、原理,以及如何在SpringBoot应用程序中使用它
    2023-06-06
  • SpringBoot项目打jar包与war包的详细步骤

    SpringBoot项目打jar包与war包的详细步骤

    SpringBoot和我们之前学习的web应用程序不一样,其本质上是一个 Java应用程序,那么又如何部署呢?这篇文章主要给大家介绍了关于SpringBoot项目打jar包与war包的详细步骤,需要的朋友可以参考下
    2023-02-02
  • Java垃圾回收算法及GC触发条件解读

    Java垃圾回收算法及GC触发条件解读

    Java垃圾回收机制自动管理内存,减轻开发负担但存在性能开销与延迟问题,主流算法包括标记清除、复制、分代回收等,通过分代策略提升效率,触发条件涉及新生代与老年代,优化需调参、对象复用及减少临时对象,未来趋势为低延迟、大内存支持及智能化GC技术
    2025-07-07

最新评论