MyBatis-Plus 自動填充:優雅實現創建/更新時間自動更新!

在這里插入圖片描述

目錄

    • 一、什么是 MyBatis-Plus 自動填充? 🤔
    • 二、自動填充的原理 ??
    • 三、實際例子:創建時間和更新時間字段自動填充 ?
    • 四、注意事項 ??
    • 五、總結 🎉

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!

🌟了解 MyBatis-Plus 邏輯刪除請看: MyBatis-Plus 邏輯刪除:讓數據“消失”卻不真正刪除的秘密!

其他優質專欄: 【🎇SpringBoot】【🎉多線程】【🎨Redis】【?設計模式專欄(已完結)】…等

如果喜歡作者的講解方式,可以點贊收藏加關注,你的支持就是我的動力
?更多文章請看個人主頁: 碼熔burning

一、什么是 MyBatis-Plus 自動填充? 🤔

MyBatis-Plus 自動填充是指在執行 insertupdate 操作時,自動為某些字段設置值,而無需手動在代碼中進行賦值。 這對于一些通用字段(如創建時間、更新時間、創建人、修改人等)非常有用,可以減少重復代碼,提高開發效率,并保證數據的一致性。 🚀

二、自動填充的原理 ??

MyBatis-Plus 通過攔截器機制,在執行 SQL 語句之前,根據配置的規則,自動為指定的字段設置值。

自動填充的實現步驟 📝

  1. 定義實體類字段: 在實體類中定義需要自動填充的字段,并使用 MyBatis-Plus 提供的注解進行標記。
  2. 編寫填充處理器: 創建一個類,實現 MyBatis-Plus 提供的 MetaObjectHandler 接口,并在該類中編寫填充邏輯。
  3. 配置 MyBatis-Plus: 在 MyBatis-Plus 的配置中,注冊填充處理器。

三、實際例子:創建時間和更新時間字段自動填充 ?

假設我們有一個 User 實體類,其中包含 createTimeupdateTime 兩個字段,分別表示創建時間和更新時間。

1. 定義實體類字段

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.time.LocalDateTime;@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
public class User extends Model<User> {private static final long serialVersionUID = 1L;@TableIdprivate Long id;private String name;private Integer age;private String email;@TableField(fill = FieldFill.INSERT) // 插入時填充字段private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新時填充字段private LocalDateTime updateTime;@Overrideprotected Serializable pkVal() {return this.id;}}

解釋:

  • @TableField(fill = FieldFill.INSERT):表示該字段在執行 insert 操作時進行填充。
  • @TableField(fill = FieldFill.INSERT_UPDATE):表示該字段在執行 insertupdate 操作時進行填充。
  • LocalDateTime:這里使用 LocalDateTime 作為時間類型,也可以使用 DateInstant 等。

2. 編寫填充處理器

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Slf4j
@Component // 不要忘記加Component注解
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)}
}

解釋:

  • MyMetaObjectHandler 類實現了 MetaObjectHandler 接口。
  • insertFill 方法:在執行 insert 操作時,會調用該方法。 我們在這里為 createTimeupdateTime 字段設置當前時間。
  • updateFill 方法:在執行 update 操作時,會調用該方法。 我們在這里為 updateTime 字段設置當前時間。
  • strictInsertFillstrictUpdateFill 方法:是 MyBatis-Plus 3.3.0 版本之后推薦使用的填充方法,更加安全和嚴格。 它們會檢查字段是否存在,類型是否匹配,以及是否已經有值,避免覆蓋已有值。
  • @Component:將該類注冊為 Spring Bean,以便 MyBatis-Plus 可以自動發現它。

3. 配置 MyBatis-Plus

在 Spring Boot 的配置文件(例如 application.ymlapplication.properties)中,不需要顯式配置 MyBatis-Plus 的自動填充功能。 只要你的填充處理器類被 Spring 管理(例如通過 @Component 注解),MyBatis-Plus 就會自動識別并使用它。 🎉

使用示例 🚀

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testInsert() {User user = new User();user.setName("testUser");user.setAge(25);user.setEmail("test@example.com");int result = userMapper.insert(user);System.out.println("影響行數:" + result);System.out.println("插入后的用戶ID:" + user.getId());System.out.println("插入后的用戶創建時間:" + user.getCreateTime());System.out.println("插入后的用戶更新時間:" + user.getUpdateTime());}@Testpublic void testUpdate() {User user = userMapper.selectById(1L); // 假設ID為1的用戶存在user.setName("updatedUser");int result = userMapper.updateById(user);System.out.println("影響行數:" + result);System.out.println("更新后的用戶更新時間:" + user.getUpdateTime());}
}

解釋:

  • testInsert 方法中,我們創建了一個 User 對象,并設置了 nameageemail 字段。 createTimeupdateTime 字段沒有手動設置。
  • 執行 userMapper.insert(user) 后,MyBatis-Plus 會自動調用 MyMetaObjectHandlerinsertFill 方法,為 createTimeupdateTime 字段設置當前時間。
  • testUpdate 方法中,我們先查詢出一個 User 對象,然后修改了 name 字段。 updateTime 字段沒有手動設置。
  • 執行 userMapper.updateById(user) 后,MyBatis-Plus 會自動調用 MyMetaObjectHandlerupdateFill 方法,為 updateTime 字段設置當前時間。

四、注意事項 ??

  • 確保你的填充處理器類被 Spring 管理(例如通過 @Component 注解)。
  • 使用 strictInsertFillstrictUpdateFill 方法可以避免覆蓋已有值。
  • 如果你的字段類型不是 LocalDateTime,需要根據實際類型進行調整。
  • 如果你的字段名不是 createTimeupdateTime,需要在填充處理器中修改字段名。
  • 如果你的數據庫字段類型是 TIMESTAMP,建議使用 LocalDateTimeInstant 作為 Java 類型,并配置相應的類型處理器。
  • 如果你的數據庫字段類型是 DATE,建議使用 LocalDate 作為 Java 類型。

五、總結 🎉

MyBatis-Plus 的自動填充功能可以極大地簡化開發,提高效率,并保證數據的一致性。 通過定義實體類字段、編寫填充處理器和配置 MyBatis-Plus,可以輕松實現創建時間和更新時間字段的自動填充。 希望篇文章能夠幫助你理解和使用 MyBatis-Plus 的自動填充功能。 🥳

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

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

相關文章

arduino R4 SD卡讀寫測試

使用買來的 st7789LCD 顯示器背面就帶著一個 tf 卡槽&#xff0c;可以直接連接 tf 卡。使用 Sdfat 庫就可以實現對 sd 卡的讀寫操作。這里嘗試測試 sd 卡的讀寫功能。 LCD 顯示器的初始化 //定義LCD的對象 Adafruit_ST7789 tft Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);tf…

【武漢·4月11日】Parasoft聯合光庭信息研討會|邀您共探AI賦能新機遇

Parasoft聯合光庭信息Workshop邀您共探AI賦能新機遇 AI浪潮已至&#xff0c;你準備好了嗎&#xff1f; 在智能網聯汽車飛速發展的今天&#xff0c;AI技術正以前所未有的速度重塑行業生態。如何把握AI機遇&#xff0c;賦能企業創新&#xff1f; 4月11日&#xff0c;自動化軟件…

VLLM專題(三十九)—自動前綴緩存(二)

前綴緩存(Prefix Caching)是一種在LLM推理中廣泛使用的優化技術,旨在避免冗余的提示詞(prompt)計算。其核心思想很簡單——我們緩存已處理請求的鍵值緩存(kv-cache)塊,并在新請求的前綴與之前請求相同時重用這些塊。由于前綴緩存幾乎是一種“免費的午餐”,并且不會改變…

自動駕駛系統的車輛動力學建模:自行車模型與汽車模型的對比分析

在自動駕駛系統的車輛動力學建模中&#xff0c;自行車模型&#xff08;Bicycle Model&#xff09;和更復雜的汽車模型&#xff08;如雙軌模型或多體動力學模型&#xff09;各有其適用場景和優缺點。以下是兩者的詳細對比及選擇原因解析&#xff1a; 1. 模型定義與核心差異 特性…

C語言入門教程100講(6)類型修飾符

文章目錄 1. 什么是類型修飾符&#xff1f;2. 常見的類型修飾符3. 類型修飾符的使用3.1 short 和 long3.2 signed 和 unsigned 4. 類型修飾符的組合5. 示例代碼代碼解析&#xff1a;輸出結果&#xff1a; 6. 常見問題問題 1&#xff1a;short 和 long 的具體大小是多少&#xf…

Linux-Ubuntu 系統學習筆記 | 從入門到實戰

&#x1f4d8; Linux-Ubuntu 系統學習筆記 | 從入門到實戰 &#x1f4dc; 目錄 環境安裝基本操作Linux操作系統介紹文件系統常用命令用戶權限管理編輯器vimGCC編譯器動態庫與靜態庫Makefile 1. 環境安裝 &#x1f31f; 下載鏡像 推薦使用清華大學開源鏡像站下載Ubuntu鏡像&a…

防火墻帶寬管理

拓撲 配置 [fw]interface GigabitEthernet 0/0/0 [fw-GigabitEthernet0/0/0]service-manage all permit [fw]interface GigabitEthernet 1/0/0 [fw-GigabitEthernet1/0/0]ip address 12.0.0.1 24 [fw]interface GigabitEthernet 1/0/1 [fw-GigabitEthernet1/0/1]ip ad…

一人系統 之 為什么要做一人系統?

一人系統 之 賺錢認知篇&#xff08;下&#xff09; 本文 2119個字&#xff0c;大概閱讀時間 16分鐘。 在上一篇文章中&#xff0c;主要講了以下三個內容&#xff1a; 什么是好的工作&#xff1f;時薪高&#xff0c;并且有能力提升&#xff0c;而且最終可以獨立創業的工作&…

基于springboot的電影院管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 互聯網技術的成熟和普及&#xff0c;勢必會給人們的生活方式帶來不同程度的改變。越來越多的經營模式中都少不了線上運營&#xff0c;互聯網正強力推動著社會和經濟發展。國人對民族文化的自信和不同文化的包容&#xff0c;再加上電影行業的發展&#xff0c;如此繁榮吸引…

Java安全-類的動態加載

類的加載過程 先在方法區找class信息&#xff0c;有的話直接調用&#xff0c;沒有的話則使用類加載器加載到方法區(靜態成員放在靜態區&#xff0c;非靜態成功放在非靜態區)&#xff0c;靜態代碼塊在類加載時自動執行代碼&#xff0c;非靜態的不執行;先父類后子類&#xff0c;…

ROS多機通信功能包——Multibotnet

引言 這是之前看到一位大佬做的集群通信中間件&#xff0c;突發奇想&#xff0c;自己也來做一個&#xff0c;實現更多的功能、更清楚的架構和性能更加高效的ROS多機通信的功能包 鏈接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

C++:背包問題習題

1. 貨幣系統 1371. 貨幣系統 - AcWing題庫 給定 V 種貨幣&#xff08;單位&#xff1a;元&#xff09;&#xff0c;每種貨幣使用的次數不限。 不同種類的貨幣&#xff0c;面值可能是相同的。 現在&#xff0c;要你用這 V 種貨幣湊出 N 元錢&#xff0c;請問共有多少種不同的…

IT工具 | node.js 進程管理工具 PM2 大升級!支持 Bun.js

P(rocess)M(anager)2 是一個 node.js 下的進程管理器&#xff0c;內置負載均衡&#xff0c;支持應用自動重啟&#xff0c;常用于生產環境運行 node.js 應用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2發布最新版本v6.0.5&#xff0c;這…

2025年01月02日浙江鼎永前端面試

目錄 webpack 和 vite 區別react fiber 架構vue diff 算法react diff 算法hooks 源碼垂直水平布局項目介紹單點登錄大文件上傳微前端 1. webpack 和 vite 區別 Webpack 和 Vite 是兩種不同的前端構建工具&#xff0c;它們在設計理念、性能表現和使用場景上存在顯著差異。以下…

1.企業級AD活動目錄核心解析:架構、組件與集成實踐

在當今數字化時代&#xff0c;企業級網絡環境日益復雜&#xff0c;高效、安全的資源管理和用戶認證成為企業 IT 運營的關鍵。AD&#xff08;Active Directory&#xff09;活動目錄作為微軟 Windows 系列服務器中的重要目錄服務&#xff0c;為企業級網絡管理提供了強大的解決方案…

【數據分享】2014-2024年我國各城市逐年空氣質量指數(AQI)數據

空氣質量指數&#xff08;AQI&#xff09;是一個衡量空氣污染程度的綜合指標&#xff0c;它并不直接表示具體污染物的濃度值&#xff0c;而是基于多種污染物的濃度進行的綜合評價&#xff0c;具體基于六種主要污染物的濃度&#xff1a;PM2.5、PM10、SO?、NO?、O?和CO。AQI是…

【C++】深入理解list迭代器的設計與實現

深入理解list迭代器的設計與實現 引言1、鏈表基礎結構2、鏈表迭代器的封裝2.1 初步封裝迭代器類2.2 引入const迭代器2.2.1 參考STL源代碼2.2.2 完善迭代器 3、迭代器實現機制結語 引言 在STL容器中&#xff0c;list作為經典的雙向鏈表容器&#xff0c;其迭代器設計體現了C模板編…

C語言基礎系列【27】typedef

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…