今天編寫一個詳細的教程來介紹如何在 Spring Boot 專案中使用 MyBatis-Plus 實現自動填充時間欄位(如建立時間 createTime
和更新時間 updateTime
),可以分為以下幾個部分。這個教程將涵蓋從專案配置到自動填充的完整過程。
1. 專案環境配置
首先,需要確保專案中已經整合了 Spring Boot 和 MyBatis-Plus。下面是一些基本的配置步驟:
1.1 引入必要的依賴
在 pom.xml
中新增 MyBatis-Plus 的依賴:
<dependencies> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <!-- 其他必要依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL 驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
1.2 配置資料來源
在 application.yml
或 application.properties
檔案中配置資料庫連線:
spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:/mapper/*.xml type-aliases-package: com.example.entity global-config: db-config: id-type: auto
2. 建立基礎實體類
為資料庫中的表建立一個基礎實體類 BaseEntity
,在該類中定義建立時間和更新時間欄位,並使用 MyBatis-Plus 的註解配置自動填充。
package com.example.utils; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; @Data public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 搜尋值(暫時忽略) */ @JsonIgnore @TableField(exist = false) private String searchValue; /** * 建立者 */ @TableField(fill = FieldFill.INSERT) private String createBy; /** * 建立時間 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新者 */ @TableField(fill = FieldFill.INSERT_UPDATE) private String updateBy; /** * 更新時間 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** * 請求引數(暫時忽略) */ @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private Map<String, Object> params = new HashMap<>(); }
3. 實現 MetaObjectHandler
介面
爲了使 BaseEntity
中的自動填充註解生效,我們需要實現 MetaObjectHandler
介面,並將其配置為 Spring 的一個 Bean。
3.1 建立 MyMetaObjectHandler
類
package com.example.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 填充建立時間和更新時間 this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); // 可以根據業務需求獲取當前使用者,填充建立者和更新者 this.strictInsertFill(metaObject, "createBy", String.class, getCurrentUser()); this.strictInsertFill(metaObject, "updateBy", String.class, getCurrentUser()); } @Override public void updateFill(MetaObject metaObject) { // 更新時只填充更新時間和更新者 this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); this.strictUpdateFill(metaObject, "updateBy", String.class, getCurrentUser()); } // 示例方法:獲取當前使用者資訊 private String getCurrentUser() { // 這裏可以整合 Spring Security 或其他上下文獲取實際的當前使用者 return "system"; // 這是一個佔位符,實際應用中會替換為真實使用者資訊 } }
3.2 配置生效
透過在 MyMetaObjectHandler
類上使用 @Component
註解,Spring 會自動管理這個類,並在實體插入和更新時呼叫它來填充欄位。
4. 實體類繼承 BaseEntity
現在,你的具體實體類可以繼承 BaseEntity
,從而自動獲得 createTime
和 updateTime
欄位的自動填充功能。
package com.example.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.example.utils.BaseEntity; import lombok.Data; @Data @TableName("your_table") public class YourEntity extends BaseEntity { // 其他欄位 private String name; private Integer age; }
5. 處理資料插入與更新
在 Service 或 Mapper 層,執行插入或更新操作時,createTime
和 updateTime
欄位會自動填充。
5.1 Service 層示例
@Service public class YourEntityService { @Autowired private YourEntityMapper yourEntityMapper; public void saveEntity(YourEntity entity) { yourEntityMapper.insert(entity); } public void updateEntity(YourEntity entity) { yourEntityMapper.updateById(entity); } }
6. 驗證自動填充功能
透過簡單的單元測試或整合測試,驗證 createTime
和 updateTime
欄位在插入和更新時是否正確自動填充。
7. 其他注意事項
欄位型別: 確保資料庫中的
createTime
和updateTime
欄位型別與 Java 實體類中的型別相匹配(通常是DATETIME
型別)。時間格式: 如果需要統一時間格式,可以在配置檔案中設定 Spring Boot 的全域性時間格式,或使用
@JsonFormat
註解指定序列化時的格式。
spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
總結
透過本文的教程,你可以輕鬆地在 Spring Boot 專案中使用 MyBatis-Plus 自動填充建立時間和更新時間欄位。該方法充分利用了 MyBatis-Plus 的自動填充機制,並結合 Spring Boot 的優勢,使開發過程更加簡潔高效。如果遇到問題,務必檢查 MetaObjectHandler
是否正確註冊,欄位型別是否匹配,以及資料庫配置是否正確。