SpringBoot基于MyBatisPlus實(shí)現(xiàn)公共字段自動(dòng)填充
問(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í)體類(lèi)),對(duì)每一個(gè)Entity對(duì)應(yīng)的業(yè)務(wù)代碼中都要寫(xiě)這些針對(duì)公共字段的操作,造成了代碼的大量重復(fù)。
因此,可以創(chuàng)建一個(gè)用于公共字段自動(dòng)填充的類(lèi),使得公共字段實(shí)現(xiàn)自動(dòng)填充。
實(shí)現(xiàn)方式
主要分為兩大部分:
- 1. MetaObjectHandler實(shí)現(xiàn)類(lèi)創(chuàng)建
- 2. 實(shí)體類(lèi)中公共字段添加注解
1. MetaObjectHandler實(shí)現(xiàn)類(lèi)創(chuàng)建
首先,建立一個(gè)MetaObjectHandler接口的實(shí)現(xiàn)類(lèi)(MetaObjectHandler是MyBatisPlus提供的接口)
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
之后,重寫(xiě)相關(guān)方法 (insertFill(MetaObject metaObject) 和 updateFill(MetaObject metaObject) )
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自動(dòng)填充[insert]...");
log.info("線(xiàn)程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)前登錄的用戶(hù)的 ID
metaObject.setValue("updateUser", threadLocal.get()); // 動(dòng)態(tài)填充 填充當(dāng)前登錄的用戶(hù)的 ID
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自動(dòng)填充[update]...");
log.info("線(xiàn)程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ú)立的線(xiàn)程根據(jù)該請(qǐng)求進(jìn)行一系列操作。例如,頁(yè)面發(fā)來(lái)一個(gè)修改用戶(hù)的請(qǐng)求,到了服務(wù)器端,攔截器的preHandle方法、controller層的update方法,以及公共字段填充類(lèi)的updateFill方法都是由同一個(gè)線(xiàn)程執(zhí)行的。

因此,可以在攔截器執(zhí)行preHandle方法時(shí),將session中的id數(shù)據(jù)保存到ThreadLocal對(duì)象中,在進(jìn)行公共字段填充時(shí),再將id從ThreadLocal對(duì)象中取出即可。
我將ThreadLocal配置成了一個(gè)Bean來(lái)管理(也可以用一個(gè)工具類(lèi)來(lái)封裝ThreadLocal,定義一個(gè)類(lèi)變量)
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("線(xiàn)程id:{}", Thread.currentThread().getId());
threadLocal.set((Long) request.getSession().getAttribute("employeeId"));
...
對(duì)session進(jìn)行判斷的代碼
...
}
}
之后,在MetaObjectHandler實(shí)現(xiàn)類(lèi)中也對(duì)ThreadLocal的Bean進(jìn)行注入
2. 實(shí)體類(lèi)中公共字段添加注解
@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)文章希望大家以后多多支持腳本之家!
- SpringBoot Mybatis Plus公共字段自動(dòng)填充功能
- Mybatis plus的自動(dòng)填充與樂(lè)觀鎖的實(shí)例詳解(springboot)
- SpringBoot實(shí)現(xiàn)字段自動(dòng)填充的兩種方式
- Springboot實(shí)現(xiàn)公共字段填充的示例詳解
- SpringBoot ThreadLocal實(shí)現(xiàn)公共字段自動(dòng)填充案例講解
- SpringBoot項(xiàng)目中公共字段填充的實(shí)現(xiàn)
- SpringBoot自定義注解如何解決公共字段填充問(wèn)題
- SpringBoot實(shí)現(xiàn)公共字段自動(dòng)填充的方法步驟
相關(guān)文章
SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化并解析
這篇文章主要介紹了SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
解決IDEA報(bào)錯(cuò)Failed?to?start?bean‘documentationPluginsBootstra
java學(xué)習(xí)筆記之eclipse+tomcat 配置
springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法

