spring boot加mybatis puls實現,在新增/修改時,對某些字段進行處理,使用的@TableField()或者AOP @Before

1.先說場景,在對mysql數據庫表數據插入或者更新時都得記錄時間和用戶id

傳統實現有點繁瑣,這里還可以封裝一下公共方法。

2.解決方法:

? ? 2.1:使用aop切面編程(記錄一下,有時間再攻克)。

? ? ? ? 2.1.1:成功實現進行補充,感謝網友頂力相助(進步·于辰)

? ? ? ? ?2.1.2:在啟動器上加? ?@EnableAspectJAutoProxy

? ? ? ? ?2.1.3:切入主要代碼

@Aspect
@Component
@Slf4j
public class EntityAttrAspect {@Before("execution(* com.zuodou..*.save*(..))"+" ||execution(* com.zuodou..*.update*(..))")public void before(JoinPoint joinPoint) throws Exception {log.info("切入");String userId = BaseUtlis.getCurrentUser().getId();// 管理員idObject[] args = joinPoint.getArgs();for (Object arg : args) {if (arg != null) {Class<?> clazz = arg.getClass();// 獲取實體所有屬性,進而獲取主鍵屬性。一般情況下,主鍵屬性是第一個Class<?> entityClass = clazz; // 使用clazz獲取實體類的類型Field[] entityFieldArr = entityClass.getDeclaredFields();Field idField = entityFieldArr[0];// 主鍵屬性idField.setAccessible(true);//設置為可以訪問Object id = idField.get(arg); // 使用arg獲取實體對象的主鍵值if (id == null) {// 無主鍵,插入if (StringUtils.isNotBlank(userId)){entityAttrIoc(arg, "createBy", userId);// 創建人}entityAttrIoc(arg, "createTime", new Date());// 創建時間} else {// 有主鍵,更新if (StringUtils.isNotBlank(userId)){entityAttrIoc(arg, "updateBy", userId);// 修改人}entityAttrIoc(arg, "updateTime", new Date());// 更新時間}}}}// entityAttrIoc方法的定義可以是類似于下面這樣的形式:private void entityAttrIoc(Object entity, String attributeName, Object value) throws Exception {Field field = entity.getClass().getDeclaredField(attributeName);field.setAccessible(true);field.set(entity, value);}}

? ? 注:

@Before("execution(* com.zuodou..*.save*(..))"+ " ||execution(* com.zuodou..*.update*(..))" )

切入點的表達式,不懂了可以先去了解表達式配置

我只需要判斷新增還是修改,

Field idField = entityFieldArr[0];// 主鍵屬性
idField.setAccessible(true);//設置為可以訪問

我主鍵是由? file? 和? static? 修飾的? 所以得加setAccessible

? ? 2.2:使用@TableField()注解。

3.我使用的@TableField? 注解實現,因為沒有很多的業務處理,單純的記錄一下,以下是具體實現

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 在插入時自動填充 create_time 和 update_time 字段this.strictInsertFill(metaObject, "createTime", Date.class, new Date());this.strictInsertFill(metaObject, "createBy", String.class, BaseUtlis.getCurrentUser().getId());}@Overridepublic void updateFill(MetaObject metaObject) {// 在更新時自動填充 update_time 字段this.strictUpdateFill(metaObject, "updateTime",Date.class, new Date());this.strictInsertFill(metaObject, "updateBy", String.class, BaseUtlis.getCurrentUser().getId());}
}

注: 字段需要跟實體類對應起來,我項目架構是使用了駝峰命名使用下劃線后字母大寫。BaseUtlis.getCurrentUser().getId(),這個是我封裝的一個獲取當前登錄用戶的方法。

參數解析:

this.strictUpdateFill(metaObject, "updateTime",Date.class, new Date());

metaObject:對象

updateTime:實體類目標字段

Date.class:數據類型

new Date():具體值

4.yml配置

mybatis-plus:global-config:db-config:meta-object-handler: com.zuodou.mymeta.MyMetaObjectHandler

5.在對應實體類的字段上加

@TableField(fill = FieldFill.UPDATE)

或者

@TableField(fill = FieldFill.INSERT)

6.補充缺陷

直接在controllerdi調用根據id修改方法? ?或者 update 批量根據id修改,?會不觸發自動填充

解決使用update,條件傳入id或者在service調用,而updateBatchById就需要手動傳了。

至于為什么在service調用updateById就能觸發

在 MyBatis Plus 中,通常通過繼承 ServiceImpl 類來實現 Service 層的操作。這個類提供了一些默認的 CRUD(增刪改查)方法,并且默認情況下會使用 MyBatis Plus 的內置功能,比如自動填充。
當你在自己的 Service 類中繼承了 ServiceImpl 并且指定了泛型類型,比如 YourService extends ServiceImpl&lt;YourMapper, YourEntity&gt;,這樣就將 YourService 和 YourEntity 關聯起來了。
MyBatis Plus 的 ServiceImpl 已經預先實現了一些常見的操作方法,其中包括了自動填充的支持。在這個類中,如果你調用了 updateById 方法,它內部會調用 MyBatis Plus 的自動填充邏輯,以便在更新數據時觸發自動填充。
當然,前提是你需要做以下幾件事情:

1.確保你的實體類中的字段有正確地標注了自動填充的注解,比如使用了 @TableField 注解并設置了相應的 fill 屬性。
2.確保你已經正確配置了 MetaObjectHandler,并且這個配置被正確地注冊到了 Spring 容器中。這樣 MyBatis Plus 才能正確地使用自動填充功能。

因此,當你在自定義的 Service 類中繼承了 ServiceImpl,就相當于在你的 Service 類中內置了 MyBatis Plus 提供的默認實現,包括自動填充的支持。這樣,在調用 updateById 等方法時,會自動觸發 MyBatis Plus 的自動填充邏輯。

(侵權聯系刪除)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讀書筆記:彼得·德魯克《認識管理》第30章 管理溝通

一、章節內容概述 我們知道&#xff0c;組織中的溝通是感知&#xff0c;也是期望&#xff0c;會產生要求&#xff0c;并且與信息不同&#xff0c;二者是對立的卻相互依賴。 我們知道&#xff0c;下行溝通沒有效果&#xff0c;只有上行溝通才能達到目的&#xff0c;并且 我們還…

軟件工程第十二周

軟件作坊、軟件危機、軟件過程控制、重型控制、敏捷、DevOps 這些術語概括了軟件開發歷史和實踐中的幾個重要概念和階段。讓我們逐一解析它們&#xff1a; 軟件作坊&#xff08;Software Craftsmanship&#xff09;&#xff1a;這是軟件開發的早期模式&#xff0c;強調個人技能…

【面試題】for...in 和 for...of 的區別

給大家推薦一個實用面試題庫 1、前端面試題庫 &#xff08;面試必備&#xff09; 推薦&#xff1a;★★★★★ 地址&#xff1a;web前端面試題庫 JavaScript 是一門強大而靈活的編程語言&#xff0c;提供了多種迭代對象的方式。兩個常見的迭代方式是 for...in 和…

Boost獲取當前時間并格式化為字符串

格式化為字符串 時間轉字符串有兩種方法 #include <boost/date_time/posix_time/posix_time.hpp> #include <iostream>std::string getCurrentTime() {boost::posix_time::ptime currentTime boost::posix_time::microsec_clock::local_time(); std::string …

centos 安裝k8s教程(一鍵安裝k8s)

第一步 準備幾臺機器 第二步 K8s Manager 服務器中添加docker支持 安裝教程請查看這個博客 docker 安裝詳細教程 點我 第三步安裝 KuboardSpray 教程在這里 第四步 下載k8s資源包 第五步 安裝k8s 點擊安裝后 顯示如下&#xff1a;等待完成

arduino入門一:點亮第一個led

void setup() { pinMode(12, OUTPUT);//12引腳設置為輸出模式 } void loop() { digitalWrite(12, HIGH);//設置12引腳為高電平 delay(1000);//延遲1000毫秒&#xff08;1秒&#xff09; digitalWrite(12, LOW);//設置12引腳為低電平 delay(1000); }

電腦桌面便簽工具選擇哪一款?

隨著互聯網時代的不斷發展&#xff0c;電腦成為日常工作及辦公中必不可少的工具&#xff0c;通過電腦這款工具&#xff0c;大家可以更好的進行工作、學習等方面的交流&#xff1b;電腦桌面便簽由于可以為大家整合一些工作及學習方面的備忘事項及筆記等&#xff0c;因而深受大家…

獲取驗證碼在倒計時未完成前清除驗證碼

場景&#xff1a; 在點擊獲取驗證碼后&#xff0c;驗證碼開始倒計時&#xff0c;在點擊登錄后&#xff0c;出現彈窗不跳轉頁面。因此在出現彈窗后&#xff0c;即使倒計時沒有結束&#xff0c;也要將倒計時的文字變為重新獲取驗證碼。 template代碼 <div class"form-b…

【Vue】Node.js的下載安裝與配置

目錄 一.下載安裝 官網&#xff1a; 二.環境變量的配置 三.設置全局路徑和緩存路徑 四.配置淘寶鏡像 五.查看配置 六.使用npm安裝cnpm ? 一.下載安裝 官網&#xff1a; https://nodejs.org/en/download 下載完之后&#xff0c;安裝的時候一直點next即可&#xff0c…

FlinkCDC實現主數據與各業務系統數據的一致性(瀚高、TIDB)

文章末尾附有flinkcdc對應瀚高數據庫flink-cdc-connector代碼下載地址 1、業務需求 目前項目有主數據系統和N個業務系統,為保障“一數一源”,各業務系統表涉及到主數據系統的字段都需用主數據系統表中的字段進行實時覆蓋,這里以某個業務系統的一張表舉例說明:業務系統表Ta…

BQL是什么如何使用?

BQL是什么如何使用&#xff1f; BQL來源于Business Query Language &#xff0c;是一種業務查詢語言。是北京碩迪制信科技有限公司根據以往統計分析案例研發的一種語言。特點是通過可視化界面對業務語言進行查詢、聚合、排序等操作&#xff0c;通過BQL引擎轉換為數據庫可執行的…

CSGO游戲搬磚市場下跌分析,是跑還是入?

CSGO市場下跌分析&#xff0c;是跑還是入&#xff1f; 以下所有都是阿陽本人最近幾年觀察市場和踩坑的一點經驗&#xff0c;由于篇幅不長所以肯定會很淺薄&#xff0c;大伙下嘴輕點 。 首先現在真的是CSGO市場最低點嗎&#xff1f;后續還會跌嗎&#xff1f;我們究竟是該繼續觀…

Course1-Week1:機器學習簡介

Course1-Week1&#xff1a;機器學習簡介 文章目錄 Course1-Week1&#xff1a;機器學習簡介1. 課程簡介1.1 課程大綱1.2 Optional Lab的使用 (Jupyter Notebooks)1.3 歡迎參加《機器學習》課程 2. 機器學習簡介2.1 機器學習定義2.2 有監督學習2.3 無監督學習 3. 線性回歸模型3.1…

golang學習筆記——使用映射

文章目錄 使用映射聲明和初始化映射添加項訪問項刪除項映射中的循環 使用映射 Go 中的映射是一個哈希表&#xff0c;是鍵值對的集合。 映射中所有的鍵都必須具有相同的類型&#xff0c;它們的值也是如此。 不過&#xff0c;可對鍵和值使用不同的類型。 例如&#xff0c;鍵可以…

Apach Ozone部署

前言 最近由于工作需要&#xff0c;要部署一套ozone。我自己對hadoop這套體系不是很熟悉&#xff0c;所以過程磕磕碰碰&#xff0c;好不容易勉強搭起來&#xff0c;所以記錄一下部署方式 準備 三臺主機&#xff0c;主機均已安裝jdk、hdfs&#xff0c;相關的安裝配置就不另外寫…

python二叉樹鏈樹_樹的鏈式存儲結構

二叉鏈樹是一種樹狀數據結構&#xff0c;其中每個節點最多有兩個子節點&#xff0c;分別稱為左子節點和右子節點。每個節點包含一個數據元素和指向其左右子節點的指針。二叉鏈樹可以是空樹&#xff0c;也可以是具有以下特點的非空樹&#xff1a; 1. 每個節點最多有兩個子節點。…

netstat

netstat 命令用于顯示網絡狀態 參數說明&#xff1a; -a或--all 顯示所有連線中的Socket&#xff0c;默認不顯示LISTEN相關 -n 拒絕顯示別名&#xff0c;能顯示數字的全部轉化成數字 -e或--extend 顯示網絡擴展信息(User&#xff0c;Inode) -p或--programs 顯示正在使用So…

計算機組成原理 the one day

1.計算機系統硬件軟件 cpu運算器控制器 1個字&#xff08;word&#xff09;16bit&#xff1b; difference 1個字節&#xff08;Byte&#xff09;bit&#xff1b; 2.cpu主頻&#xff08;時鐘頻率&#xff09;1/cpu時鐘周期 CPI執行一條指令所需的時間周期數。 執行一條程序的…

JavaEE 多線程01

為什么引入多線程? 首先進程已經能很好的完成多任務這個情景下的并發編程了,那為什么又引入多線程呢? 這是因為在一些情景下,我么需要大量的創建和銷毀進程來完成一些任務,此時多進程對系統的開銷就會很大了. 假設有這樣一個場景,服務器同時接收到很多個服務請求,這個時候服務…

Python基礎教程: sorted 函數

嗨嘍&#xff0c;大家好呀~這里是愛看美女的茜茜吶 sorted 可以對所有可迭代的對象進行排序操作&#xff0c; sorted 方法返回的是一個新的 list&#xff0c;而不是在原來的基礎上進行的操作。 從新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩機密、教程…