1. 程式人生 > 程式設計 >Mybatis-Plus自動填充更新操作相關欄位的實現

Mybatis-Plus自動填充更新操作相關欄位的實現

在阿里開發手冊的建表規約中有說明,資料庫表中應該都要有create_time、update_time欄位;那麼在開發中,對於這些共有欄位的處理應該要進行統一,這樣就可以簡化我們的開發過程。那麼本文就對Mybatis-Plus中的欄位自動填充進行記錄。

場景介紹

在專案的資料表設計中,每張表都有create_id、create_time、update_id、update_time這四個欄位,那麼在Java應用中,針對新增和修改操作要對這四個欄位進行相應的更改:

  • create_id、update_id要自動填充為當前登入的使用者ID
  • create_time、update_time要自動填充為當前時間

下面說說程式碼實現:

自動填充處理器

需要實現Mybatis-Plus中的MetaObjectHandler介面

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import hw.topevery.basis.runtime.UserRuntime;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 更新相關欄位處理器
 *
 * @author whw
 * @date 2020/1/3 16:41
 */
@Component
public class UpdateRelatedFieldsMetaHandler implements MetaObjectHandler {

  /**
   * 新增操作
   *
   * @param metaObject
   */
  @Override
  public void insertFill(MetaObject metaObject) {
    this.strictInsertFill(metaObject,"createId",String.class,getCurrentUserId());
    this.strictInsertFill(metaObject,"createTime",LocalDateTime.class,LocalDateTime.now());
    this.strictInsertFill(metaObject,"updateId","updateTime",LocalDateTime.now());
  }

  /**
   * 更新操作
   *
   * @param metaObject
   */
  @Override
  public void updateFill(MetaObject metaObject) {
    this.strictUpdateFill(metaObject,getCurrentUserId());
    this.strictUpdateFill(metaObject,LocalDateTime.now());
  }

  /**
   * 獲取當前登入使用者ID
   *
   * @return
   */
  private String getCurrentUserId() {
    return "當前登入使用者ID";
  }
}

Mybatis-Plus配置類

需要將處理器注入進Spring容器才會生效

import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import hw.topevery.kunming.wapi.handler.UpdateRelatedFieldsMetaHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Mybatis-Plus配置類
 *
 * @author whw
 * @date 2020/1/3 16:41
 */
@Configuration
public class MybatisPlusConfig {

  @Bean
  public GlobalConfig globalConfig() {
    GlobalConfig globalConfig = new GlobalConfig();
    globalConfig.setMetaObjectHandler(new UpdateRelatedFieldsMetaHandler());
    return globalConfig;
  }
}

配置實體類中相關欄位的自動填充策略

在@TableField註解中設定fill屬性

欄位填充策略FieldFill說明

描述
DEFAULT 預設不處理
INSERT 插入填充欄位
UPDATE 更新填充欄位
INSERT_UPDATE 插入和更新填充欄位

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 基礎實體類
 *
 * @author whw
 * @date 2020/1/3 17:37
 */
@Data
public class BaseEntity implements Serializable {

  private static final long serialVersionUID = 1L;

  @ApiModelProperty(value = "建立使用者ID")
  @TableField(value = "c_create_id",fill = FieldFill.INSERT)
  private String createId;

  @ApiModelProperty(value = "建立時間")
  @TableField(value = "c_create_time",fill = FieldFill.INSERT)
  private LocalDateTime createTime;

  @ApiModelProperty(value = "更新使用者ID")
  @TableField(value = "c_update_id",fill = FieldFill.INSERT_UPDATE)
  private String updateId;

  @ApiModelProperty(value = "更新時間")
  @TableField(value = "c_update_time",fill = FieldFill.INSERT_UPDATE)
  private LocalDateTime updateTime;
}

我這邊是在實體中抽取了一個父類出來,當然也可以直接在實體類的對應欄位上添加註解。

到此這篇關於Mybatis-Plus自動填充更新操作相關欄位的實現的文章就介紹到這了,更多相關Mybatis-Plus自動填充更新內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!