mybatis-plus添加數據時id自增問題及解決

mybatis-plus添加數據時id自增問題

mybatis-plus插入數據,id自增列變的很長.比如下圖:

在這裡插入圖片描述

mybatis-plus中遇到一個,添加數據到數據庫,而數據庫中的id列是自增列

使用plus中自帶的insert方法添加到數據庫,id自增變的很長很長,

數據庫id字段數據類型為long

解決方案

在實體類自增的id字段添加一個註解

在這裡插入圖片描述

mybatis plus在插入記錄時,有以下幾種方法:

boolean insert(T var1);
boolean insertAllColumn(T var1);
boolean insertBatch(List var1);
boolean insertBatch(List var1, int var2);
boolean insertOrUpdateBatch(List var1);
boolean insertOrUpdateBatch(List var1, int var2);

當時實體中,主鍵生成方式不設置生成方式時,默認的是自增。所有當你設置主鍵的值時,依舊無法保存主鍵。

@TableId(value = “id”)
private Integer id;

我們可以設置主鍵的生成方式

@TableId(value = “id”,type = IdType.INPUT) 這種方式是主鍵手動輸入

主鍵生成方式類型如下(IdType):

  • AUTO(0, “數據庫ID自增”),
  • INPUT(1, “用戶輸入ID”),
  • ID_WORKER(2, “全局唯一ID”),
  • UUID(3, “全局唯一ID”),
  • NONE(4, “該類型為未設置主鍵類型”),
  • ID_WORKER_STR(5, “字符串全局唯一ID”);

插入記錄的主鍵自增賦值機制說明

現在的項目實踐中,表設計一般采用自增主鍵,那麼在這當中會涉及到數據插入後,獲取插入數據主鍵的一個場景處理。

對於這種情況,mybatis框架做瞭封裝,提供瞭支持。

代碼說明

通過debug方式,跟進執行路徑,查看對應邏輯代碼。

1、找到執行入口

在這裡插入圖片描述

這裡的參數賦值有三個,但不包括id的賦值,id是由數據庫自增。

這裡看到一個KeyGenerator的類型,這個名字name的很好,自說明性很好。

2、看看keyGenerator的執行邏輯

在這裡插入圖片描述

這裡可以看出,參數類型的id依然是空,但是上圖的sql執行已結束。

3、 跟進邏輯執行

在這裡插入圖片描述

這是一部分邏輯,還沒有到,但是看方法名assign,就要到瞭。

4、繼續進入下一層邏輯

在這裡插入圖片描述

這個時候,id仍然是null

5、繼續進入下一層邏輯

在這裡插入圖片描述

這裡我們看到有set的動作,在執行前,id是仍然為null

6、關鍵取值

在這裡插入圖片描述

在Object value 的賦值邏輯,看到數據是從rs中獲取,值是184

7、關鍵賦值

在這裡插入圖片描述

在這裡插入圖片描述

在執行完set後,插入數據的類型對象的id有瞭值。

到這裡自增id賦值就結束瞭。

總結

自增id的補償賦值很好的彌補瞭同自定義id的不足。但是為什麼框架能做到呢。看下面的註釋說明

在這裡插入圖片描述

這是JDBC的標準接口,提供瞭這個口子,在sql執行返回後,可以帶上自增id的信息,因此應用層框架可以執行賦值,避免二次查詢。

實際項目是采用自增主鍵,還是自定義賦值主鍵,需要充分考慮到兩者的優缺點同實際的情況結合。優缺點可以參考如下:

這種方式是使用數據庫提供的自增數值型字段作為自增主鍵,它的優點是:

自增主鍵

這種方式是使用數據庫提供的自增數值型字段作為自增主鍵,

優點是:

1、數據庫自動編號,速度快,而且是增量增長,按順序存放,對於檢索非常有利;

2、數字型,占用空間小,易排序,在程序中傳遞也方便;

3、如果通過非系統增加記錄時,可以不用指定該字段,不用擔心主鍵重復問題。

缺點 :

1、因為自動增長,在手動要插入指定ID的記錄時會顯得麻煩,尤其是當系統與其它系統集成時,需要數據導入時,很難保證原系統的ID不發生主鍵沖突(前提是老系統也是數字型的)。

2、如果經常有合並表的操作,就可能會出現主鍵重復的情況很難處理分佈式存儲的數據表。

3、數據量特別大時,會導致查詢數據庫操作變慢。此時需要進行數據庫的水平拆分,劃分到不同的數據庫中,那麼當添加數據時,每個表都會自增長,導致主鍵沖突。

UUID

優點:

1、能夠保證獨立性,程序可以在不同的數據庫間遷移,效果不受影響。保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分數據庫的時候尤為重要。

缺點:

1、比較占地方,和INT類型相比,存儲一個UUID要花費更多的空間。

2、使用UUID後,URL顯得冗長,不夠友好。

3、Join操作性能比int要低。

4、UUID做主鍵將會添加到表上的其他索引中,因此會降低性能。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: