MyBatis-Plus 自動賦值實體字段最佳實踐指南
MyBatis-Plus(簡稱 MP)是 MyBatis 的增強工具包,提供了很多便利的功能,其中 自動賦值實體字段 是開發(fā)中非常常見的需求。本文將深入探討 MyBatis-Plus 的自動賦值機制,并通過詳細的 Java 代碼和表格進行對比和解釋,幫助大家更好地掌握這個功能。
1. MyBatis-Plus 自動賦值概述
MyBatis-Plus 提供了一種便捷的方式來自動填充實體對象中的字段,尤其是在處理一些常見的數(shù)據(jù)庫操作時(如創(chuàng)建時間、更新時間等)。在進行數(shù)據(jù)插入、更新操作時,常常需要對某些字段進行自動填充,減少手動賦值的工作量,提升開發(fā)效率。
1.1 適用場景
- 時間戳自動填充:如
createTime,updateTime等字段通常需要在插入或更新時自動填充為當前時間。 - 用戶信息填充:如
createBy,updateBy等字段通常需要在操作時自動填充當前操作用戶。 - 邏輯刪除標識:如
isDeleted字段,插入時自動填充0,更新時填充1表示刪除。
1.2 自動填充的原理
MyBatis-Plus 的自動賦值字段主要通過 @TableField 注解與填充策略來實現(xiàn)。它通過配置特定的填充規(guī)則,使得在執(zhí)行插入、更新操作時,某些字段能夠自動填充。
1.3 填充策略
MyBatis-Plus 提供了四種常見的填充策略:
FieldFill.INSERT:在插入時填充FieldFill.UPDATE:在更新時填充FieldFill.INSERT_UPDATE:在插入和更新時都填充FieldFill.DEFAULT:不指定填充策略,使用默認填充規(guī)則
2. 關鍵注解與配置
MyBatis-Plus 提供了兩個關鍵注解用于自動賦值字段的配置:@TableField 和 @TableId。
2.1@TableField注解
@TableField 注解用于標識實體類中的字段,配合 fill 屬性來定義自動填充的行為。通過 fill 屬性,我們可以為字段指定填充策略。
示例:
@TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
createTime字段在插入時自動填充。updateTime字段在插入和更新時自動填充。
2.2@TableId注解
@TableId 注解用于指定實體類中的主鍵字段。在某些情況下,我們也可能需要對主鍵字段進行自動賦值。通常來說,MyBatis-Plus 會自動處理主鍵生成策略(如自增、UUID 等)。
示例:
@TableId(type = IdType.AUTO) private Long id;
該配置表示主鍵 id 使用數(shù)據(jù)庫自增。
2.3 配置填充策略
為了實現(xiàn)自動賦值,我們需要配置填充策略。填充策略可以在 Mapper 層通過實現(xiàn) MetaObjectHandler 接口來指定。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 插入時填充 createTime
this.strictInsertFill(metaObject, "createBy", String.class, "admin"); // 插入時填充 createBy
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // 更新時填充 updateTime
this.strictUpdateFill(metaObject, "updateBy", String.class, "admin"); // 更新時填充 updateBy
}
}MetaObjectHandler 是 MyBatis-Plus 提供的接口,用于處理自動填充的邏輯。通過實現(xiàn)該接口,我們可以在插入和更新時自定義字段的自動填充行為。
3. 使用實例與代碼解析
3.1 實體類示例
假設我們有一個 User 實體類,包含 id, username, createTime, updateTime 等字段,并希望在進行插入和更新時自動填充時間戳。
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}3.2 Mapper 示例
在 Mapper 接口中,我們可以直接使用 MyBatis-Plus 提供的 updateById, insert 等方法。
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 自定義的數(shù)據(jù)庫操作方法
}
3.3 自動賦值操作示例
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
// 自動填充的字段會被 MyBatis-Plus 處理
userMapper.insert(user);
}
public void updateUser(User user) {
// 自動填充的字段會被 MyBatis-Plus 處理
userMapper.updateById(user);
}
}在上述示例中,createTime 和 updateTime 會在插入和更新時自動填充。
4. 表格對比:不同填充策略行為
| 字段類型 | FieldFill.INSERT | FieldFill.UPDATE | FieldFill.INSERT_UPDATE | FieldFill.DEFAULT |
|---|---|---|---|---|
createTime | 僅在插入時填充 | 不會填充 | 會在插入和更新時填充 | 根據(jù)默認策略,通常是 INSERT |
updateTime | 不會填充 | 僅在更新時填充 | 會在插入和更新時填充 | 根據(jù)默認策略,通常是 INSERT |
通過表格,我們可以看到不同填充策略的行為區(qū)別。開發(fā)者可以根據(jù)業(yè)務需求來選擇合適的填充策略。
5. 總結與最佳實踐
5.1 自動賦值的優(yōu)勢
- 減少重復代碼:自動填充時間戳和用戶信息等常見字段,避免手動賦值。
- 提高代碼可讀性:通過注解和配置清晰表達字段填充邏輯,簡化代碼。
- 保證數(shù)據(jù)一致性:自動填充保證了字段值的一致性,減少人為錯誤。
5.2 常見問題與解決方案
- 填充不生效:請確保已正確配置
MetaObjectHandler,并且@TableField(fill = FieldFill.xxx)注解已加在正確的字段上。 - 更新時覆蓋:修改配置類MyMetaObjectHandler
- strictUpdateFill(): 保留更新實體對象的原有值,只在字段為空時才會進行填充。
- setFieldValByName(): 會強制覆蓋實體對象字段的原有值,不論字段是否為空。
- 主鍵策略問題:在使用
@TableId注解時,需要明確指定主鍵生成策略(如IdType.AUTO)。
5.3 最佳實踐
- 使用
MetaObjectHandler配置全局的字段填充策略。 - 避免在業(yè)務層手動設置常規(guī)字段(如時間戳、用戶信息),通過自動填充來保證一致性。
- 盡量避免過多的手動填充,自動賦值機制能有效減少錯誤和重復代碼。
通過本文的學習,相信你對 MyBatis-Plus 自動賦值實體字段的使用有了更深入的理解。合理利用 MyBatis-Plus 提供的自動填充功能,可以大大提高開發(fā)效率并降低出錯的概率。希望你在實際開發(fā)中能夠得心應手地運用這些技巧!
到此這篇關于MyBatis-Plus 自動賦值實體字段的文章就介紹到這了,更多相關mybatisplus自動賦值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot項目(jar包)指定配置文件啟動圖文教程
這篇文章主要給大家介紹了關于springboot項目(jar包)指定配置文件啟動的相關資料,在多環(huán)境部署過程中、及線上運維中可能會遇到臨時指定配置文件的情況,需要的朋友可以參考下2023-07-07
springcloud gateway如何實現(xiàn)路由和負載均衡
這篇文章主要介紹了springcloud gateway如何實現(xiàn)路由和負載均衡的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java的線程池ThreadPoolExecutor及多種線程池實現(xiàn)詳解
這篇文章主要介紹了Java的線程池ThreadPoolExecutor及多種線程池實現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲在一個變量中,是為了保證原子性,需要的朋友可以參考下2024-01-01
java遠程連接Linux執(zhí)行命令的3種方式完整代碼
在一些Java應用程序中需要執(zhí)行一些Linux系統(tǒng)命令,例如服務器資源查看、文件操作等,這篇文章主要給大家介紹了關于java遠程連接Linux執(zhí)行命令的3種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06
java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路
這篇文章主要為大家介紹了java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Java中的SimpleDateFormat的線程安全問題詳解
這篇文章主要介紹了Java中的SimpleDateFormat的線程安全問題詳解,sonar 是一個代碼質量管理工具,SonarQube是一個用于代碼質量管理的開放平臺,為項目提供可視化報告, 連續(xù)追蹤項目質量演化過程,需要的朋友可以參考下2024-01-01

