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。
推薦閱讀:
- Mybatis Plus使用@TableId之坑及解決
- MybatisPlus中的insert操作詳解
- mybatis-plus 如何使用雪花算法ID生成策略
- Mybatis-Plus自動生成的數據庫id過長的解決
- Mybatis-plus全局id生成策略詳解