欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot基于MyBatisPlus實(shí)現(xiàn)公共字段自動(dòng)填充

 更新時(shí)間:2025年08月21日 08:47:25   作者:future romance  
本文介紹了一種在MyBatisPlus中實(shí)現(xiàn)公共字段自動(dòng)填充的方法,包括創(chuàng)建MetaObjectHandler實(shí)現(xiàn)類和在實(shí)體類中添加注解,具有一定的參考價(jià)值,感興趣的可以了解一下

問(wèn)題背景

在增加或修改記錄時(shí),常常需要對(duì)一些公共字段進(jìn)行設(shè)置,如創(chuàng)建時(shí)間(createTime)、創(chuàng)建人(createUser)、修改時(shí)間(updateTime)、修改人(updateUser),這些信息一般不來(lái)自于網(wǎng)頁(yè)請(qǐng)求。實(shí)際項(xiàng)目中可能有很多種Entity(實(shí)體類),對(duì)每一個(gè)Entity對(duì)應(yīng)的業(yè)務(wù)代碼中都要寫這些針對(duì)公共字段的操作,造成了代碼的大量重復(fù)。

因此,可以創(chuàng)建一個(gè)用于公共字段自動(dòng)填充的類,使得公共字段實(shí)現(xiàn)自動(dòng)填充。

實(shí)現(xiàn)方式

主要分為兩大部分:

  • 1. MetaObjectHandler實(shí)現(xiàn)類創(chuàng)建
  • 2. 實(shí)體類中公共字段添加注解

1. MetaObjectHandler實(shí)現(xiàn)類創(chuàng)建

首先,建立一個(gè)MetaObjectHandler接口的實(shí)現(xiàn)類(MetaObjectHandler是MyBatisPlus提供的接口)

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

之后,重寫相關(guān)方法 (insertFill(MetaObject metaObject) 和 updateFill(MetaObject metaObject) )

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

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", threadLocal.get());  // 動(dòng)態(tài)填充 填充當(dāng)前登錄的用戶的 ID
        metaObject.setValue("updateUser", threadLocal.get());  // 動(dòng)態(tài)填充 填充當(dāng)前登錄的用戶的 ID
    }


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

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

注意:在對(duì)createUser和updateUser進(jìn)行設(shè)置時(shí)(通常是設(shè)置id),無(wú)法拿到session,因此不能通過(guò)session的方式獲取id。這里使用的是ThreadLocal。

需要知道的是,頁(yè)面向服務(wù)器發(fā)送的每一個(gè)請(qǐng)求,在服務(wù)器端都會(huì)有一個(gè)獨(dú)立的線程根據(jù)該請(qǐng)求進(jìn)行一系列操作。例如,頁(yè)面發(fā)來(lái)一個(gè)修改用戶的請(qǐng)求,到了服務(wù)器端,攔截器的preHandle方法、controller層的update方法,以及公共字段填充類的updateFill方法都是由同一個(gè)線程執(zhí)行的

因此,可以在攔截器執(zhí)行preHandle方法時(shí),將session中的id數(shù)據(jù)保存到ThreadLocal對(duì)象中,在進(jìn)行公共字段填充時(shí),再將id從ThreadLocal對(duì)象中取出即可。

我將ThreadLocal配置成了一個(gè)Bean來(lái)管理(也可以用一個(gè)工具類來(lái)封裝ThreadLocal,定義一個(gè)類變量)

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"));
        ...
        對(duì)session進(jìn)行判斷的代碼
        ...
    }
}

之后,在MetaObjectHandler實(shí)現(xiàn)類中也對(duì)ThreadLocal的Bean進(jìn)行注入

2. 實(shí)體類中公共字段添加注解

    @TableField(fill = FieldFill.INSERT)     // 插入時(shí)填充字段
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)    // 插入和更新時(shí)填充字段
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)    // 插入時(shí)填充字段
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)    // 插入和更新時(shí)填充字段
    private Long updateUser;

如此,便實(shí)現(xiàn)了公共字段的自動(dòng)填充

到此這篇關(guān)于SpringBoot基于MyBatisPlus實(shí)現(xiàn)公共字段自動(dòng)填充的文章就介紹到這了,更多相關(guān)SpringBoot MyBatisPlus公共字段自動(dòng)填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis insert標(biāo)簽及常用屬性詳解

    MyBatis insert標(biāo)簽及常用屬性詳解

    這篇文章主要介紹了MyBatis insert標(biāo)簽,insert 標(biāo)簽中沒(méi)有 resultType 屬性,只有查詢操作才需要對(duì)返回結(jié)果類型進(jìn)行相應(yīng)的指定,需要的朋友可以參考下
    2023-10-10
  • SpringBoot中使用多線程的方法示例

    SpringBoot中使用多線程的方法示例

    這篇文章主要介紹了SpringBoot中使用多線程的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java稀疏數(shù)組詳細(xì)圖文教程

    Java稀疏數(shù)組詳細(xì)圖文教程

    當(dāng)一個(gè)數(shù)組中的大部分元素為相同的值,可使用稀疏數(shù)組來(lái)保存該數(shù)組,可以將稀疏數(shù)組看做是普通數(shù)組的壓縮,這篇文章主要給大家介紹了關(guān)于Java稀疏數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • 解決IDEA報(bào)錯(cuò)Failed?to?start?bean‘documentationPluginsBootstrapper‘問(wèn)題

    解決IDEA報(bào)錯(cuò)Failed?to?start?bean‘documentationPluginsBootstra

    這篇文章主要介紹了解決IDEA報(bào)錯(cuò)Failed?to?start?bean‘documentationPluginsBootstrapper‘問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java學(xué)習(xí)筆記之eclipse+tomcat 配置

    java學(xué)習(xí)筆記之eclipse+tomcat 配置

    俗話說(shuō):工欲善其事必先利其器,既然要學(xué)習(xí)java,首先把java的開發(fā)環(huán)境搗鼓一下吧,這里我們來(lái)談?wù)別clipse+tomcat的配置方法。
    2014-11-11
  • springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法

    springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法

    這篇文章主要介紹了springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法,使用Spring Boot的事件機(jī)制來(lái)監(jiān)聽(tīng)和處理事件有多種優(yōu)勢(shì),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2024-07-07
  • 最新評(píng)論