MyBatis-Plus(MP) 提供了一個非常強大的功能——自動填充功能。該功能可以在執行插入或更新操作時,自動為某些字段賦值,免去手動設置這些字段的麻煩。常見的應用場景包括 創建時間 和 更新時間 字段的自動填充,幫助開發者在處理數據時更加高效,減少人為錯誤。
本文將介紹 MyBatis-Plus 自動填充功能 的概念、實現步驟、場景應用以及如何配置和自定義填充規則。
1. 自動填充的概念
自動填充功能指的是,當執行 插入(INSERT) 或 更新(UPDATE) 操作時,某些字段可以由 MyBatis-Plus 自動賦值,無需開發者手動提供。這些字段通常是一些系統字段,比如:
- 創建時間:記錄實體對象的創建時間。
- 更新時間:記錄實體對象的最后修改時間。
自動填充通過 字段注解 配合 MetaObjectHandler 實現,可以自動為某些字段設置默認值,避免重復的代碼邏輯。
2. 實現自動填充的步驟
要實現 MyBatis-Plus 的自動填充功能,通常需要以下幾個步驟:
2.1 步驟 1:在實體類中標注自動填充字段
在實體類中,使用 MyBatis-Plus 提供的 @TableField
注解,指定需要自動填充的字段,并設置 fill
屬性。
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;import java.time.LocalDateTime;public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;private String name;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;// Getters and Setters
}
@TableField(fill = FieldFill.INSERT)
:表示在插入數據時自動填充字段,如createTime
字段在插入時自動賦值。@TableField(fill = FieldFill.INSERT_UPDATE)
:表示在插入和更新時都會自動填充字段,如updateTime
字段。
2.2 步驟 2:實現 MetaObjectHandler
接口
MyBatis-Plus 通過 MetaObjectHandler
接口來實現字段的自動填充功能。開發者需要實現該接口,并重寫 insertFill
和 updateFill
方法。
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 {// 插入時自動填充@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 自動填充創建時間this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 自動填充更新時間}// 更新時自動填充@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 自動填充更新時間}
}
在這個實現中:
insertFill
:在插入操作時自動填充字段,例如將當前時間賦值給createTime
和updateTime
字段。updateFill
:在更新操作時自動填充字段,通常只會更新updateTime
字段。
2.3 步驟 3:注冊 MetaObjectHandler
MetaObjectHandler
接口的實現類需要通過 @Component
注解標記為 Spring Bean,這樣 Spring Boot 會自動掃描并注入到 MyBatis-Plus 中。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 同上
}
3. 自動填充的場景應用(創建時間、更新時間)
3.1 創建時間(createTime
)
創建時間 字段通常在數據插入時自動填充。它記錄了數據創建的時間,通常使用 LocalDateTime
類型存儲。
實現示例
在實體類中,我們使用 @TableField(fill = FieldFill.INSERT)
來確保插入數據時自動填充 createTime
字段。
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
在 MetaObjectHandler
中,我們設置 insertFill
方法自動填充當前時間:
@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
3.2 更新時間(updateTime
)
更新時間 字段通常在數據更新時自動填充,記錄數據最后一次修改的時間。updateTime
字段需要通過 @TableField(fill = FieldFill.INSERT_UPDATE)
注解來進行配置,使得在插入和更新時都能自動填充。
實現示例
在實體類中,我們使用 @TableField(fill = FieldFill.INSERT_UPDATE)
來確保插入和更新時自動填充 updateTime
字段。
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
在 MetaObjectHandler
中,我們設置 updateFill
方法自動填充當前時間:
@Override
public void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
3.3 自動填充的效果
通過上述配置,在執行插入和更新操作時,MyBatis-Plus 會自動為 createTime
和 updateTime
字段填充當前時間,無需開發者顯式賦值。
User user = new User();
user.setName("John");
userService.save(user); // 自動填充 createTime 和 updateTime
4. 配置與自定義填充規則
4.1 配置自動填充字段
在 MyBatis-Plus 中,我們可以通過 @TableField
注解的 fill
屬性來指定需要自動填充的字段。當執行插入或更新操作時,Spring 會自動為這些字段填充值。
示例:配置自動填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
4.2 自定義填充規則
如果需要自定義填充規則,例如在創建時使用自定義的時間格式或設置特定的字段值,可以在 MetaObjectHandler
中進行實現。
示例:自定義填充規則
@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 自動填充當前時間this.strictInsertFill(metaObject, "status", Integer.class, 1); // 自定義填充規則:status 默認值為 1
}
在此示例中,我們不僅自動填充 createTime
字段,還將 status
字段的默認值設置為 1
。
5. 總結
- 自動填充功能 是 MyBatis-Plus 的一項強大特性,能夠減少手動設置系統字段的工作,提升開發效率。
- 通過
@TableField
注解中的fill
屬性,開發者可以輕松配置需要自動填充的字段,如 創建時間 和 更新時間。 - 自定義填充規則 允許開發者在插入和更新時根據需求設置字段的默認值,進一步增強了靈活性。
- 使用 MetaObjectHandler 接口,開發者可以靈活控制自動填充的字段,在
insertFill
和updateFill
方法中定義自動填充規則。
通過 MyBatis-Plus 提供的自動填充功能,開發者可以更加高效地進行數據處理,減少代碼冗余,并確保系統字段的一致性和正確性。 🚀