首頁 > 軟體

mybatis-plus新增資料時id自增問題及解決

2022-01-15 13:00:52

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做主鍵將會新增到表上的其他索引中,因此會降低效能。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com