快速解決 MyBatis-Plus 中 ID 自增問題(推薦)
MyBatis-Plus 中自動生成的 ID 過長,可能導致以下問題的出現(xiàn):
- 由于屬性的 ID 是由 mp 內(nèi)部的 UUID 生成,比如使用 Integer類型 將存不進去
- 當后端傳入 mp 雪花算法自動生成的 ID 時,前端接收的時候可能會導致精度的損失
問題一:由于屬性的 ID 是由 mp 內(nèi)部的 UUID 生成,比如使用 Integer類型 將存不進去
報錯信息如下所示:
ested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.xxx' with value '111042370348747XXXX Cause: java.lang.IllegalArgumentException: java.lang.ClassCastException@14041406
解決方法:
將 ID 字段類型改為 long,這樣就能保證有足夠位數(shù)放入生成的 ID
問題二:當后端傳入 mp 雪花算法自動生成的 ID 時,前端接收的時候可能會導致精度的損失
解決方法:
第一步:
首先在對應的類的主鍵屬性上,增加以下代碼配置
@TableId(value = "id",type = IdType.AUTO) private Long id;
type 屬性中,其他類型如下:
AUTO
:AUTO(0, “數(shù)據(jù)庫ID自增”),
INPUT
:INPUT(1, “用戶輸入ID”),
ID_WORKER
:ID_WORKER(2, “全局唯一ID”),
UUID
:UUID(3, “全局唯一ID”),
NONE
:NONE(4, “該類型為未設置主鍵類型”),
ID_WORKER_STR
:ID_WORKER_STR(5, “字符串全局唯一ID”);
這里的 @TableId 注解需要添加以下依賴:
這里的版本號最好與 mp 的主依賴的版本保持一致
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>版本號</version> </dependency>
第二步:
將之前的被自增長的ID數(shù)據(jù)刪除
第三步:
在需要解決 mp 自增長的表中,執(zhí)行以下語句
ALTER TABLE table_name AUTO_INCREMENT = value;
其中, table_name 是對應的表名,value 是你需要進行自增的 ID 值
比如:value 賦值為 2,則 mp 下次生成的 ID 則為2,即從 2 開始
自增主鍵與 UUID 的優(yōu)缺點
自增主鍵:
這種方式是使用數(shù)據(jù)庫提供的自增數(shù)值型字段作為自增主鍵
優(yōu)點:
- 數(shù)據(jù)庫自動編號,速度快,而且是增量增長,按順序存放,對于檢索非常有利
- 數(shù)字型,占用空間小,易排序,在程序中傳遞也方便
- 如果通過非系統(tǒng)增加記錄時,可以不用指定該字段,不用擔心主鍵重復問題
缺點 :
- 因為自動增長,在手動要插入指定ID的記錄時會顯得麻煩,尤其是當系統(tǒng)與其它系統(tǒng)集成時,需要數(shù)據(jù)導入時,很難保證原系統(tǒng)的ID不發(fā)生主鍵沖突(前提是老系統(tǒng)也是數(shù)字型的)
- 如果經(jīng)常有合并表的操作,就可能會出現(xiàn)主鍵重復的情況很難處理分布式存儲的數(shù)據(jù)表
- 數(shù)據(jù)量特別大時,會導致查詢數(shù)據(jù)庫操作變慢;此時需要進行數(shù)據(jù)庫的水平拆分,劃分到不同的數(shù)據(jù)庫中,那么當添加數(shù)據(jù)時,每個表都會自增長,導致主鍵沖突
UUID:
優(yōu)點:
能夠保證獨立性,程序可以在不同的數(shù)據(jù)庫間遷移,效果不受影響;保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分數(shù)據(jù)庫的時候尤為重要
缺點:
- 比較占地方,和INT類型相比,存儲一個UUID要花費更多的空間
- 使用UUID后,URL顯得冗長,不夠友好
- Join 操作性能比 int 要低
- UUID做主鍵將會添加到表上的其他索引中,因此會降低性能
到此這篇關于解決 MyBatis-Plus 中 ID 自增問題的文章就介紹到這了,更多相關MyBatis-Plus ID 自增內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決kafka:org.apache.kafka.common.errors.TimeoutException問題
這篇文章主要介紹了解決kafka:org.apache.kafka.common.errors.TimeoutException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Java關于遠程調(diào)試程序教程(以Eclipse為例)
這篇文章主要介紹了Java關于遠程調(diào)試程序教程(以Eclipse為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06MyBatis更新時新值為null時,updateById()更新失敗問題
這篇文章主要介紹了MyBatis更新時新值為null時,updateById()更新失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01Spring中的ClassPathXmlApplicationContext源碼詳解
這篇文章主要介紹了Spring中的ClassPathXmlApplicationContext源碼詳解,ApplicationContext的主要實現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認從類路徑加載配置文件,后者默認從文件系統(tǒng)中裝載配置文件,需要的朋友可以參考下2023-12-12