切換語言為:簡體

MyBatis-Plus 配置自動填充時間或者初始化狀態等欄位

  • 爱糖宝
  • 2024-08-15
  • 2067
  • 0
  • 0

今天編寫一個詳細的教程來介紹如何在 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.ymlapplication.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,從而自動獲得 createTimeupdateTime 欄位的自動填充功能。

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 層,執行插入或更新操作時,createTimeupdateTime 欄位會自動填充。

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. 驗證自動填充功能

透過簡單的單元測試或整合測試,驗證 createTimeupdateTime 欄位在插入和更新時是否正確自動填充。

7. 其他注意事項

  • 欄位型別: 確保資料庫中的 createTimeupdateTime 欄位型別與 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 是否正確註冊,欄位型別是否匹配,以及資料庫配置是否正確。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.