MyBatis-Plus 自動(dòng)填充的實(shí)現(xiàn)示例
在日常開(kāi)發(fā)中,數(shù)據(jù)庫(kù)表通常會(huì)包含一些系統(tǒng)自動(dòng)維護(hù)的字段,例如:創(chuàng)建時(shí)間、更新時(shí)間、操作人等。為了減少手動(dòng)維護(hù)這些字段的重復(fù)代碼,MyBatis-Plus 提供了自動(dòng)填充功能,幫助開(kāi)發(fā)者在插入或更新數(shù)據(jù)時(shí),自動(dòng)為某些字段賦值。
1. MyBatis-Plus 自動(dòng)填充簡(jiǎn)介
MyBatis-Plus 提供的自動(dòng)填充功能,可以在數(shù)據(jù)庫(kù)插入或更新時(shí),自動(dòng)為指定的字段設(shè)置值,而不需要每次手動(dòng)傳遞。例如:
- 在記錄插入時(shí)自動(dòng)填充創(chuàng)建時(shí)間
created_at。 - 在記錄更新時(shí)自動(dòng)填充更新時(shí)間
updated_at。 - 自動(dòng)填充操作用戶 ID 或者一些其他固定值。
MyBatis-Plus 通過(guò) @TableField 注解中的 fill 屬性和 MetaObjectHandler 接口來(lái)實(shí)現(xiàn)自動(dòng)填充。fill 屬性用于指定字段在插入或更新時(shí)是否自動(dòng)填充,而 MetaObjectHandler 是用于實(shí)現(xiàn)自動(dòng)填充邏輯的接口。
2. 自動(dòng)填充的配置步驟
2.1 在實(shí)體類中標(biāo)注需要自動(dòng)填充的字段
MyBatis-Plus 通過(guò) @TableField(fill = ...) 注解來(lái)標(biāo)注需要自動(dòng)填充的字段,并指定該字段的填充策略。常見(jiàn)的填充策略有:
FieldFill.INSERT:在插入時(shí)自動(dòng)填充。FieldFill.UPDATE:在更新時(shí)自動(dòng)填充。FieldFill.INSERT_UPDATE:在插入和更新時(shí)都自動(dòng)填充。
示例:
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
private Integer id;
private String username;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt; // 插入時(shí)自動(dòng)填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt; // 插入和更新時(shí)自動(dòng)填充
}
createdAt:在插入記錄時(shí)自動(dòng)填充當(dāng)前時(shí)間。updatedAt:在插入和更新記錄時(shí)自動(dòng)填充當(dāng)前時(shí)間。
2.2 創(chuàng)建自動(dòng)填充處理器
MyBatis-Plus 提供了 MetaObjectHandler 接口,開(kāi)發(fā)者可以實(shí)現(xiàn)該接口中的 insertFill 和 updateFill 方法來(lái)自定義填充邏輯。
示例:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入時(shí)自動(dòng)填充
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class); // 創(chuàng)建時(shí)間
this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class); // 更新時(shí)間
}
// 更新時(shí)自動(dòng)填充
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class); // 更新時(shí)間
}
}
strictInsertFill:用于在插入操作時(shí)自動(dòng)填充指定字段。strictUpdateFill:用于在更新操作時(shí)自動(dòng)填充指定字段。
在 insertFill 方法中,createdAt 和 updatedAt 字段會(huì)在插入時(shí)自動(dòng)填充當(dāng)前時(shí)間。而在 updateFill 方法中,updatedAt 字段會(huì)在更新時(shí)自動(dòng)填充當(dāng)前時(shí)間。
2.3 完整示例
以下是一個(gè)完整的 MyBatis-Plus 自動(dòng)填充示例,包含實(shí)體類、填充處理器和測(cè)試代碼:
1. User 實(shí)體類
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt; // 創(chuàng)建時(shí)自動(dòng)填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt; // 創(chuàng)建和更新時(shí)自動(dòng)填充
}
2. 自動(dòng)填充處理器
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
}
}
3. UserMapper 接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
4. 測(cè)試代碼
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyTestRunner implements CommandLineRunner {
@Autowired
private UserMapper userMapper;
@Override
public void run(String... args) throws Exception {
// 測(cè)試插入時(shí)自動(dòng)填充
User user = new User();
user.setUsername("John Doe");
userMapper.insert(user);
System.out.println("Inserted user: " + user);
// 測(cè)試更新時(shí)自動(dòng)填充
user.setUsername("Jane Doe");
userMapper.updateById(user);
System.out.println("Updated user: " + user);
}
}
在上面的測(cè)試代碼中:
- 插入新用戶時(shí),
createdAt和updatedAt字段都會(huì)被自動(dòng)填充。 - 更新用戶時(shí),
updatedAt字段會(huì)被自動(dòng)更新。
3. 自動(dòng)填充策略詳解
3.1 自動(dòng)填充策略選項(xiàng)
@TableField 注解的 fill 屬性支持以下自動(dòng)填充策略:
FieldFill.INSERT:僅在插入時(shí)自動(dòng)填充。FieldFill.UPDATE:僅在更新時(shí)自動(dòng)填充。FieldFill.INSERT_UPDATE:在插入和更新時(shí)都自動(dòng)填充。
@TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updatedAt;
3.2 MetaObjectHandler 方法詳解
strictInsertFill:用于插入時(shí)自動(dòng)填充字段,接受 4 個(gè)參數(shù):MetaObject、字段名、填充值和字段類型。
this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);
strictUpdateFill:用于更新時(shí)自動(dòng)填充字段。
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
如果不需要區(qū)分插入和更新,可以直接使用 setFieldValByName 方法:
this.setFieldValByName("updatedAt", LocalDateTime.now(), metaObject);
3.3 手動(dòng)觸發(fā)填充
在某些場(chǎng)景下,可能希望在代碼中手動(dòng)觸發(fā)自動(dòng)填充邏輯,可以使用 fillStrategy 方法。
MetaObject metaObject = SystemMetaObject.forObject(user); this.fillStrategy(metaObject, "updatedAt", LocalDateTime.now());
4. 自動(dòng)填充的注意事項(xiàng)
4.1 數(shù)據(jù)庫(kù)默認(rèn)值沖突
如果數(shù)據(jù)庫(kù)字段設(shè)置了默認(rèn)值,且實(shí)體類同時(shí)使用了自動(dòng)填充,可能會(huì)導(dǎo)致沖突。解決辦法是在數(shù)據(jù)庫(kù)中移除默認(rèn)值,完全依賴 MyBatis-Plus 進(jìn)行自動(dòng)填充。
4.2 MetaObjectHandler 必須注冊(cè)為 Spring Bean
自動(dòng)填充處理器類 MetaObjectHandler 必須由 Spring 容器管理(即使用 @Component 注解),否則自動(dòng)填充不會(huì)生效。
4.3 覆蓋已有值
在插入或更新時(shí),MyBatis-Plus 會(huì)自動(dòng)為標(biāo)注了 fill 的字段賦值,但如果這些字段已經(jīng)有值,則 MyBatis-Plus 默認(rèn)不會(huì)覆蓋已有值
。要覆蓋已有值,可以使用 strictInsertFill 或 strictUpdateFill。
5. 常見(jiàn)使用場(chǎng)景
5.1 創(chuàng)建時(shí)間和更新時(shí)間自動(dòng)填充
在大多數(shù)數(shù)據(jù)庫(kù)表中,都會(huì)有 created_at 和 updated_at 字段,用于記錄數(shù)據(jù)的創(chuàng)建時(shí)間和最后更新時(shí)間。通過(guò)自動(dòng)填充功能,MyBatis-Plus 可以輕松實(shí)現(xiàn)這兩個(gè)字段的自動(dòng)維護(hù)。
5.2 操作人自動(dòng)填充
在操作日志、審計(jì)系統(tǒng)等場(chǎng)景下,通常需要記錄操作人 ID??梢酝ㄟ^(guò)自動(dòng)填充機(jī)制,在插入和更新記錄時(shí),自動(dòng)獲取當(dāng)前用戶 ID 并填充到表中。
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "operatorId", () -> getCurrentUserId(), Long.class);
}
6. 總結(jié)
MyBatis-Plus 的自動(dòng)填充功能能夠極大地簡(jiǎn)化開(kāi)發(fā)工作,通過(guò)簡(jiǎn)單的注解和配置即可實(shí)現(xiàn)插入、更新時(shí)的字段自動(dòng)填充,減少了手動(dòng)維護(hù)重復(fù)字段的代碼量。
@TableField(fill = ...):用于指定字段的自動(dòng)填充策略,支持插入、更新和插入更新。MetaObjectHandler:自定義自動(dòng)填充邏輯的接口,開(kāi)發(fā)者可以通過(guò)實(shí)現(xiàn)insertFill和updateFill方法控制填充行為。
到此這篇關(guān)于MyBatis-Plus 自動(dòng)填充的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus 自動(dòng)填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus自動(dòng)填充字段的詳細(xì)教程
- Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充的項(xiàng)目實(shí)踐
- MyBatis-Plus中自動(dòng)填充功能的用法示例詳解
- mybatis-plus 新增/修改如何實(shí)現(xiàn)自動(dòng)填充指定字段
- 使用Mybatis-plus實(shí)現(xiàn)時(shí)間自動(dòng)填充(代碼直接可用)
- 實(shí)例詳解MyBatis-plus自動(dòng)填充功能
- Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)
- mybatis-plus自動(dòng)填充插入更新時(shí)間有8小時(shí)時(shí)差
相關(guān)文章
java servlet 幾種頁(yè)面跳轉(zhuǎn)的方法
java servlet 幾種頁(yè)面跳轉(zhuǎn)的方法,需要的朋友可以參考一下2013-04-04
mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問(wèn)題
這篇文章主要介紹了mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
淺談關(guān)于Mybatis的mapper-locations配置問(wèn)題
MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下2023-05-05
java實(shí)現(xiàn)將漢語(yǔ)轉(zhuǎn)換為拼音功能
這篇文章主要介紹了java實(shí)現(xiàn)將漢語(yǔ)轉(zhuǎn)換為拼音功能,非常不錯(cuò),具有參考借鑒價(jià)值 ,需要的朋友可以參考下2017-05-05
springboot 2.x整合mybatis實(shí)現(xiàn)增刪查和批量處理方式
這篇文章主要介紹了springboot 2.x整合mybatis實(shí)現(xiàn)增刪查和批量處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring 與 JDK 線程池的簡(jiǎn)單使用示例詳解
這篇文章主要介紹了Spring 與 JDK 線程池的簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
SpringBoot + Mybatis增刪改查實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于SpringBoot + Mybatis增刪改查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
SpringBoot+隨機(jī)鹽值+雙重MD5實(shí)現(xiàn)加密登錄
數(shù)據(jù)加密在很多項(xiàng)目上都可以用到,大部分都會(huì)采用MD5進(jìn)行加密,本文主要介紹了SpringBoot+隨機(jī)鹽值+雙重MD5實(shí)現(xiàn)加密登錄,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
java使用CountDownLatch等待多線程全部執(zhí)行完成
這篇文章主要為大家詳細(xì)介紹了使用CountDownLatch等待多線程全部執(zhí)行完成,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10

