目錄
- 一、什么是 MyBatis-Plus 自動填充? 🤔
- 二、自動填充的原理 ??
- 三、實際例子:創建時間和更新時間字段自動填充 ?
- 四、注意事項 ??
- 五、總結 🎉
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解 MyBatis-Plus 邏輯刪除請看: MyBatis-Plus 邏輯刪除:讓數據“消失”卻不真正刪除的秘密!
其他優質專欄: 【🎇SpringBoot】【🎉多線程】【🎨Redis】【?設計模式專欄(已完結)】…等
如果喜歡作者的講解方式,可以點贊收藏加關注,你的支持就是我的動力
?更多文章請看個人主頁: 碼熔burning
一、什么是 MyBatis-Plus 自動填充? 🤔
MyBatis-Plus 自動填充是指在執行 insert
或 update
操作時,自動為某些字段設置值,而無需手動在代碼中進行賦值。 這對于一些通用字段(如創建時間、更新時間、創建人、修改人等)非常有用,可以減少重復代碼,提高開發效率,并保證數據的一致性。 🚀
二、自動填充的原理 ??
MyBatis-Plus 通過攔截器機制,在執行 SQL 語句之前,根據配置的規則,自動為指定的字段設置值。
自動填充的實現步驟 📝
- 定義實體類字段: 在實體類中定義需要自動填充的字段,并使用 MyBatis-Plus 提供的注解進行標記。
- 編寫填充處理器: 創建一個類,實現 MyBatis-Plus 提供的
MetaObjectHandler
接口,并在該類中編寫填充邏輯。 - 配置 MyBatis-Plus: 在 MyBatis-Plus 的配置中,注冊填充處理器。
三、實際例子:創建時間和更新時間字段自動填充 ?
假設我們有一個 User
實體類,其中包含 createTime
和 updateTime
兩個字段,分別表示創建時間和更新時間。
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)
:表示該字段在執行insert
和update
操作時進行填充。LocalDateTime
:這里使用LocalDateTime
作為時間類型,也可以使用Date
或Instant
等。
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
操作時,會調用該方法。 我們在這里為createTime
和updateTime
字段設置當前時間。updateFill
方法:在執行update
操作時,會調用該方法。 我們在這里為updateTime
字段設置當前時間。strictInsertFill
和strictUpdateFill
方法:是 MyBatis-Plus 3.3.0 版本之后推薦使用的填充方法,更加安全和嚴格。 它們會檢查字段是否存在,類型是否匹配,以及是否已經有值,避免覆蓋已有值。@Component
:將該類注冊為 Spring Bean,以便 MyBatis-Plus 可以自動發現它。
3. 配置 MyBatis-Plus
在 Spring Boot 的配置文件(例如 application.yml
或 application.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
對象,并設置了name
、age
和email
字段。createTime
和updateTime
字段沒有手動設置。 - 執行
userMapper.insert(user)
后,MyBatis-Plus 會自動調用MyMetaObjectHandler
的insertFill
方法,為createTime
和updateTime
字段設置當前時間。 - 在
testUpdate
方法中,我們先查詢出一個User
對象,然后修改了name
字段。updateTime
字段沒有手動設置。 - 執行
userMapper.updateById(user)
后,MyBatis-Plus 會自動調用MyMetaObjectHandler
的updateFill
方法,為updateTime
字段設置當前時間。
四、注意事項 ??
- 確保你的填充處理器類被 Spring 管理(例如通過
@Component
注解)。 - 使用
strictInsertFill
和strictUpdateFill
方法可以避免覆蓋已有值。 - 如果你的字段類型不是
LocalDateTime
,需要根據實際類型進行調整。 - 如果你的字段名不是
createTime
和updateTime
,需要在填充處理器中修改字段名。 - 如果你的數據庫字段類型是
TIMESTAMP
,建議使用LocalDateTime
或Instant
作為 Java 類型,并配置相應的類型處理器。 - 如果你的數據庫字段類型是
DATE
,建議使用LocalDate
作為 Java 類型。
五、總結 🎉
MyBatis-Plus 的自動填充功能可以極大地簡化開發,提高效率,并保證數據的一致性。 通過定義實體類字段、編寫填充處理器和配置 MyBatis-Plus,可以輕松實現創建時間和更新時間字段的自動填充。 希望篇文章能夠幫助你理解和使用 MyBatis-Plus 的自動填充功能。 🥳