Java-實現公有字段自動注入(創建人、創建時間、修改人、修改時間)

文章目錄

  • Mybatis-plus實現自動注入
    • 定義 MetaObjectHandler
    • 配置 MyBatis-Plus 使用 MetaObjectHandler
    • 實體類字段注解
    • 使用服務類進行操作測試
  • Jpa啟用審計功能實現自動注入
    • 添加依賴
    • 啟動類啟用審計功能
    • 實現AuditorAware接口
    • 實體類中使用審計注解
  • 總結

自動注入創建人、創建時間、修改人、修改時間需要根據使用的技術棧進行區別處理,本文介紹Jpa和Mybatis-plus兩種方式進行自動注入

Mybatis-plus實現自動注入

在使用 MyBatis-Plus 進行數據庫操作時,我們經常需要自動處理一些字段,比如創建人、創建時間、修改人、修改時間等。MyBatis-Plus 提供了多種方式來自動填充這些字段,主要通過 MetaObjectHandler 接口實現。

定義 MetaObjectHandler

首先,你需要定義一個實現了 MetaObjectHandler 接口的類,并重寫 insertFill 和 updateFill 方法,用于設置默認的創建人和修改人、創建時間和修改時間。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 創建人this.setFieldValByName("createBy", "admin", metaObject);// 創建時間this.setFieldValByName("createTime", new Date(), metaObject);// 修改人this.setFieldValByName("updateBy", "admin", metaObject);// 修改時間this.setFieldValByName("updateTime", new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {// 修改人this.setFieldValByName("updateBy", "admin", metaObject);// 修改時間this.setFieldValByName("updateTime", new Date(), metaObject);}
}

配置 MyBatis-Plus 使用 MetaObjectHandler

確保你的 Spring Boot 應用中已經包含了 MyBatis-Plus 的自動配置,通常在你的 Spring Boot 啟動類或者配置類中添加如下配置:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.yourpackage.mapper") // 確保掃描到你的 Mapper 接口包路徑
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

實體類字段注解

在你的實體類中,使用 @TableField 注解標記需要自動填充的字段。例如:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;@TableName("your_table")
public class YourEntity {@TableIdprivate Long id;private String name;@TableField(fill = FieldFill.INSERT) // 僅在插入時填充private String createBy;@TableField(fill = FieldFill.INSERT) // 僅在插入時填充private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 在插入和更新時填充private String updateBy;@TableField(fill = FieldFill.INSERT_UPDATE) // 在插入和更新時填充private Date updateTime;// getters and setters...
}

使用服務類進行操作測試

現在,當你使用 MyBatis-Plus 的 Service 類進行數據的插入或更新操作時,MyMetaObjectHandler 中的邏輯會自動觸發,填充相應的字段。例如:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.yourpackage.mapper.YourEntityMapper; // 確保這是你的 Mapper 接口全名路徑
import com.yourpackage.entity.YourEntity; // 確保這是你的實體類全名路徑
import org.springframework.transaction.annotation.Transactional;@Service
public class YourEntityService extends ServiceImpl<YourEntityMapper, YourEntity> {@Transactional // 確保操作在事務中執行,以便自動填充字段正確工作。public void createEntity(YourEntity entity) {this.save(entity); }

Jpa啟用審計功能實現自動注入

添加依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

啟動類啟用審計功能

@SpringBootApplication
@EnableJpaAuditing
public class ManageApplication {public static void main(String[] args) {SpringApplication.run(ManageApplication.class, args);}}

實現AuditorAware接口

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {@Overridepublic Optional<String> getCurrentAuditor() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication != null && authentication.isAuthenticated()) {// 獲取當前登錄用戶名String username = authentication.getName();return Optional.of(username);}return Optional.of(authentication.getPrincipal().toString());}
}

實體類中使用審計注解

使用 @CreatedBy、@CreatedDate、@LastModifiedBy 和 @LastModifiedDate 注解來自動記錄和更新創建和修改信息。

public class BaseEntity {@TableId(type = IdType.ASSIGN_ID)String id;@CreatedByString createId;@CreatedDate@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date createDate;@LastModifiedByString modifyId;@LastModifiedDate@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date modifyDate;}

總結

Mybatis-plus經過驗證可以實現自動注入,Jpa審計功能暫時未進行驗證。

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

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

相關文章

金融機構開源軟件風險管理體系建設

開源軟件為金融行業帶來了創新活力的同時&#xff0c;也引入了一系列獨特的風險。金融機構需要構建系統化的風險管理體系&#xff0c;以識別和應對開源軟件在全生命周期中的各種風險點。下面我們將解析開源軟件在金融場景下的主要風險類別&#xff0c;并探討如何建立健全的風險…

圖形渲染中的定點數和浮點數

三種API的NDC區別 NDC全稱&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的區別如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐標系右手左手右手z值范圍[-1,1][0,1][0,1]xy視口范圍[-1,1][-1,1][-1,1] GPU渲染的定點數和浮點數 定點數類型&a…

同花順客戶端公司財報抓取分析

目標客戶端下載地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要難點在登陸,獲取token中的 jgbsessid (每次重新登錄這個字段都會立即失效,且有效期應該是15天的) 抓取jgbsessid 主要通過安裝mitmproxy 使用 mitmdump + 下邊的腳本實現監聽接口…

QT工程建立

打開軟件新建一個工程 選擇chose 工程命名&#xff0c;選擇保存路徑&#xff0c;可以自己選擇&#xff0c;但是不要有中文路徑 默認的直接下一步 任意選一個下一步 點擊完成 之后是這個界面&#xff0c;點擊右下角的綠色三角形編譯一下 實驗內容 添加類 第一個是建立cpp和.h文件…

【NLP 53、投機采樣加速推理】

目錄 一、投機采樣 二、投機采樣改進&#xff1a;美杜莎模型 流程 改進 三、Deepseek的投機采樣 流程 Ⅰ、輸入文本預處理 Ⅱ、引導模型預測 Ⅲ、候選集篩選&#xff08;可選&#xff09; Ⅳ、主模型驗證 Ⅴ、生成輸出與循環 騙你的&#xff0c;其實我在意透了 —— 25.4.4 一、…

ffmpeg時間基與時間戳

時間基、時間戳 時間基&#xff1a;表示時間單位的分數&#xff0c;用來定義視頻或音頻流中時間的精度。其形式是一個分數&#xff0c;分子通常為 1&#xff0c;而分母則表示每秒的單位數。 時間戳&#xff1a;代表在時間軸里占了多少個格子&#xff0c;是特定的時間點。 時間…

激光加工中平面傾斜度的矯正

在激光加工中&#xff0c;加工平面的傾斜度矯正至關重要&#xff0c;直接影響加工精度和材料處理效果。以下是系統的矯正方法和步驟&#xff1a; 5. 驗證與迭代 二次測量&#xff1a;加工后重新檢測平面度&#xff0c;確認殘余誤差。 反饋優化&#xff1a;根據誤差分布修正補償…

算法刷題記錄——LeetCode篇(2.2) [第111~120題](持續更新)

更新時間&#xff1a;2025-04-04 算法題解目錄匯總&#xff1a;算法刷題記錄——題解目錄匯總技術博客總目錄&#xff1a;計算機技術系列博客——目錄頁 優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注&#xff01; 114. 二叉樹展開為鏈表 給你二…

C語言學習筆記-9

九、結構體 構造類型&#xff1a; 不是基本類型的數據結構也不是指針類型&#xff0c; 它是若干個相同或不同類型的數據構成的集合 結構體類型&#xff1a; 結構體是一種構造類型的數據結構&#xff0c;是一種或多種基本類型或構造類型的數據的集合。 1.結構體類型定義 定…

Test——BUG篇

目錄 一軟件測試的生命周期 二BUG 1概念 2描述Bug 3Bug級別 4Bug的生命周期 三與開發人員發生爭執怎么辦 ?編輯1先自省&#xff1a;是否Bug描述不清晰 2站在用戶角度考慮并拋出問題 3Bug定級有理有據 4不僅要提出問題&#xff0c;還要給出解決方案 5Bug評審 5.1…

【Block總結】HWAB,半小波注意力塊|即插即用

論文信息 標題: HALF WAVELET ATTENTION ON M-NET+ FOR LOW-LIGHT IMAGE ENHANCEMENT 地址: arXiv:2203.01296 日期: 2022年3月 創新點 改進的分層架構 M-Net+: 提出了一個專為低光圖像增強設計的改良分層模型 M-Net+。該架構旨在緩解采樣過程中的空間信息損失問題。通過采用…

Spring 中的事務

&#x1f9fe; 一、什么是事務&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事務 一組操作&#xff0c;要么全部成功&#xff0c;要么全部失敗&#xff0c;不能只做一半。 比如你轉賬&#xff1a; A 賬戶扣錢B 賬戶加錢 如果 A 扣了錢但 B 沒收到&#xff0c;那就出問…

Flutter極速接入IM聊天功能并支持鴻蒙

Flutter極速接入IM聊天功能并支持鴻蒙 如果你們也是Flutter項目&#xff0c;想快速接入聊天&#xff0c;包括聊天的UI界面&#xff0c;強烈推薦這一家。因為我們已經完成了集成&#xff0c;使用非常穩定&#xff0c;集成也非常快捷方便。 而且&#xff0c;就在今天&#xff0c…

C# 類庫生成后自動復制到指定目錄

C# 類庫生成后自動復制到指定目錄 在C#中,當你開發了一個類庫項目(通常是.NET Core或.NET Framework項目),你可能會希望在構建(Build)完成后自動將生成的DLL文件復制到指定的目錄。有幾種方法可以實現這個需求,下面是一些常用的方法: 方法1:使用MSBuild的AfterBuild…

13-產品經理-產品多分支平臺管理

禪道16.0版本開始&#xff0c;優化和增強了產品的分支/平臺功能&#xff0c;主要特點如下&#xff1a; 多分支/平臺功能兼容各種大小型項目&#xff0c;項目/迭代可以關聯對應產品的某個分支/平臺。分支/平臺支持靈活管理&#xff0c;可以把分支/平臺理解為時間層面的概念&…

手搓多模態-04 歸一化介紹

在機器學習中&#xff0c;歸一化是一個非常重要的工具&#xff0c;它能幫助我們加速訓練的速度。在我們前面的SiglipVisionTransformer 中&#xff0c;也有用到歸一化層&#xff0c;如下代碼所示&#xff1a; class SiglipVisionTransformer(nn.Module): ##視覺模型的第二層&am…

Qt 入門 1 之第一個程序 Hello World

Qt 入門1之第一個程序 Hello World 直接上操作步驟從頭開始認識&#xff0c;打開Qt Creator&#xff0c;創建一個新項目&#xff0c;并依次執行以下操作 在Qt Creator中&#xff0c;一個Kits 表示一個完整的構建環境&#xff0c;包括編譯器、Qt版本、調試器等。在上圖中可以直…

深入理解MySQL:核心特性、優化與實踐指南

MySQL是一個開源的關系型數據庫管理系統(RDBMS)&#xff0c;由瑞典MySQL AB公司開發&#xff0c;目前屬于Oracle公司。它是目前世界上最流行的開源數據庫之一&#xff0c;廣泛應用于各種規模的Web應用和企業系統中。 目錄 一、核心特點 關系型數據庫&#xff1a; 開源免費&am…

Linux 系統安裝與優化全攻略:打造高效開發環境

一、開篇引言 &#xff08;一&#xff09;Linux 系統的廣泛應用 Linux 憑借其開源、穩定且安全的特性&#xff0c;在服務器、嵌入式設備以及開發環境等領域都有著極為廣泛的應用。 &#xff08;二&#xff09;撰寫本文的目的 為讀者提供一套全面且實用的指南&#xff0c;助…

代碼訓練day22回溯算法p1

1.組合 &#xff08;1&#xff09;模板 void backtracking(參數) {if (終止條件) {存放結果;return;}for (選擇&#xff1a;本層集合中元素&#xff08;樹中節點孩子的數量就是集合的大小&#xff09;) {處理節點;backtracking(路徑&#xff0c;選擇列表); // 遞歸回溯&#…