1. 程式人生 > 程式設計 >mybatis-plus 通用欄位自動化(如邏輯刪除和更新時間等)

mybatis-plus 通用欄位自動化(如邏輯刪除和更新時間等)

一般來說某些專案比較規範的情況下,大多數表都會有邏輯刪除欄位和通用欄位,例如更新時間,建立時間,更新人,建立人等等,但是在程式碼開發上會產生很多冗餘的程式碼,邏輯刪除的話,自己寫比較繁瑣,而且容易有遺漏邏輯。

本來打算自己寫切面去實現,偶然發現mybatis-plus已經幫封裝實現了,試了一下,很好用,所以分享一下。

邏輯刪除

邏輯刪除的意思就是某些業務表,在使用者刪除某條資料的時候,不真正刪除,而是將此資料某欄位改成類似“已刪除”,而查詢語句、更新語句等會忽略此條被邏輯刪除的資料。
這裡就不多介紹mybatis-plus的基礎使用了,沒接觸過的小夥伴可以去官網研究一下,都是中文,很好看懂。

貼一下我們mybatis-plus的pom依賴:

 <!-- mybatis plus 核心依賴 -->
 <dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.0</version>
 </dependency>
 <!-- mybatis plus 程式碼生成器依賴 -->
 <dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-generator</artifactId>
  <version>3.4.0</version>
 </dependency>
 <!-- 程式碼生成器模板 -->
 <dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity-engine-core</artifactId>
  <version>2.1</version>
 </dependency>

邏輯刪除比較簡單,在3.3版本之後只要兩步:

1.在配置檔案中加入:

mybatis-plus:
 global-config:
  db-config:
   logic-delete-field: deleted # 全域性邏輯刪除的實體欄位名
   logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
   logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)

這裡的deleted就是資料庫表中表示邏輯刪除與否的欄位名,一般都是tinyint或者boolean,如果是boolean,logic-delete-value和logic-not-delete-value設定成true和false就行。

2.實體類欄位上加上@TableLogic註解

  @TableLogic
  private Boolean deleted;

當然,一般自動生成的entity一般不建議做改動,因為entity和mapper經常會重新生成,這樣加的程式碼就消失了,這裡我們修改mybatis-plus程式碼生成器中的一個配置實現:

StrategyConfig strategy = new StrategyConfig();
// 省略命名規範、entity模式等其他配置
strategy.setLogicDeleteFieldName("deleted");

這裡deleted同樣是表字段名,而不是生成的類欄位名。

加了這段配置後,自動生成的entity就會帶有@TableLogic註解了。

在使用了封裝化的邏輯刪除後,mybatis-plus就能幫我們實現:

  • 呼叫mapper.delete類方法後,不刪除對應的記錄,而是將匹配到的記錄的邏輯刪除欄位設定為我們設定的logic-delete-value值。
  • 呼叫查詢語句包括selectList、selectById等語句或者更新語句時,會自動拼上邏輯刪除欄位的查詢條件,達到不會查詢出已邏輯刪除的記錄

通用欄位自動化填充

如果說專案要求表設計上需要有一些通用欄位,比如我現在做的專案每個主體表都需要有建立時間、更新時間、建立人、更新人這四個欄位,mybatis-plus可以幫我們自動填充這四個欄位,而不需要我們自己修改。
當然,這四個欄位的獲取邏輯必須是有通用方式的。

1.@TableField註解

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;

這裡只是一個例子,FieldFill.INSERT表示在執行insert類方法時會自動填充此欄位,FieldFill.UPDATE是在執行update類方法時會自動填充此欄位,除此之外還有FieldFill.INSERT_UPDATE表示插入和更新時都會填充。
當然,和邏輯刪除一樣,我們不會手動去加這個註解,還是依賴程式碼生成器的配置:

// 和邏輯刪除一樣的StrategyConfig,不要重複寫
StrategyConfig strategy = new StrategyConfig();
// 省略命名規範、entity模式等其他配置
List<TableFill> tableFillList = new ArrayList<>();
tableFillList.add(new TableFill("create_time",FieldFill.INSERT));
tableFillList.add(new TableFill("create_user",FieldFill.INSERT));
tableFillList.add(new TableFill("update_time",FieldFill.UPDATE));
tableFillList.add(new TableFill("update_user",FieldFill.UPDATE));
strategy.setTableFillList(tableFillList);

這裡的create_time、create_user等是表裡的欄位名,當mybatis-plus檢測到表裡有這些欄位時,生成的entity會自動加上對應的@TableField註解。

2.自動填充處理類

@Component
public class MybatisPlusMetaFillHandler implements MetaObjectHandler {

  @Override
  public void insertFill(MetaObject metaObject) {
    this.strictInsertFill(metaObject,"createTime",LocalDateTime::now,LocalDateTime.class);
    this.strictInsertFill(metaObject,"createUser",()-> {
          try{
           //這裡是我自己專案獲取當前session使用者id的方法
            return Long.parseLong(UserContext.getUserInfo().get().getUserId());
          }catch(Exception ignored){
          }
          return null;
        },Long.class);
  }

  @Override
  public void updateFill(MetaObject metaObject) {
    this.strictUpdateFill(metaObject,"updateTime",LocalDateTime.class);
    this.strictUpdateFill(metaObject,"updateUser",()-> {
          try{
            //這裡是我自己專案獲取當前session使用者id的方法
            return Long.parseLong(UserContext.getUserInfo().get().getUserId());
          }catch(Exception ignored){
          }
          return null;
        },Long.class);
  }
}

自定義bean實現MetaObjectHandler介面,並實現insertFill方法和updateFill方法,this.strictUpdateFill方法中新增需要自動填充的entity欄位名和填充Function,比如建立時間和更新時間,傳入LocalDateTime::now方法,當然也可以用自定義的方法:

()->{
 //比方說我們更新時間不想太精確,只想設定為那一天的0點
 return LocalDateTime.now().toLocalDate().atStartOfDay();
}

這兩個步驟完成後,mybatis-plus就可以自動填充此欄位了,比如在新增一條記錄時,只需要set此記錄的業務值,不設定create_time和create_user,直接呼叫entity.insert()方法,可以在資料庫新增的記錄中看到create_time自動填充了當前時間,create_user自動填充了session中的當前使用者id。

這是欄位自動填充一個應用,可拓展方向有很多,大家可以多多思考,自行發揮。

到此這篇關於mybatis-plus 通用欄位自動化(如邏輯刪除和更新時間等)的文章就介紹到這了,更多相關mybatis-plus 欄位自動化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!