快速解決 MyBatis-Plus 中 ID 自增問(wèn)題(推薦)
MyBatis-Plus 中自動(dòng)生成的 ID 過(guò)長(zhǎng),可能導(dǎo)致以下問(wèn)題的出現(xiàn):
- 由于屬性的 ID 是由 mp 內(nèi)部的 UUID 生成,比如使用 Integer類(lèi)型 將存不進(jìn)去
- 當(dāng)后端傳入 mp 雪花算法自動(dòng)生成的 ID 時(shí),前端接收的時(shí)候可能會(huì)導(dǎo)致精度的損失
問(wèn)題一:由于屬性的 ID 是由 mp 內(nèi)部的 UUID 生成,比如使用 Integer類(lèi)型 將存不進(jìn)去
報(bào)錯(cuò)信息如下所示:
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 字段類(lèi)型改為 long,這樣就能保證有足夠位數(shù)放入生成的 ID
問(wèn)題二:當(dāng)后端傳入 mp 雪花算法自動(dòng)生成的 ID 時(shí),前端接收的時(shí)候可能會(huì)導(dǎo)致精度的損失
解決方法:
第一步:
首先在對(duì)應(yīng)的類(lèi)的主鍵屬性上,增加以下代碼配置
@TableId(value = "id",type = IdType.AUTO)
private Long id;type 屬性中,其他類(lèi)型如下:
AUTO:AUTO(0, “數(shù)據(jù)庫(kù)ID自增”),
INPUT:INPUT(1, “用戶(hù)輸入ID”),
ID_WORKER:ID_WORKER(2, “全局唯一ID”),
UUID:UUID(3, “全局唯一ID”),
NONE:NONE(4, “該類(lèi)型為未設(shè)置主鍵類(lèi)型”),
ID_WORKER_STR:ID_WORKER_STR(5, “字符串全局唯一ID”);
這里的 @TableId 注解需要添加以下依賴(lài):
這里的版本號(hào)最好與 mp 的主依賴(lài)的版本保持一致
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>版本號(hào)</version>
</dependency>第二步:
將之前的被自增長(zhǎng)的ID數(shù)據(jù)刪除

第三步:
在需要解決 mp 自增長(zhǎng)的表中,執(zhí)行以下語(yǔ)句
ALTER TABLE table_name AUTO_INCREMENT = value;
其中, table_name 是對(duì)應(yīng)的表名,value 是你需要進(jìn)行自增的 ID 值
比如:value 賦值為 2,則 mp 下次生成的 ID 則為2,即從 2 開(kāi)始
自增主鍵與 UUID 的優(yōu)缺點(diǎn)
自增主鍵:
這種方式是使用數(shù)據(jù)庫(kù)提供的自增數(shù)值型字段作為自增主鍵
優(yōu)點(diǎn):
- 數(shù)據(jù)庫(kù)自動(dòng)編號(hào),速度快,而且是增量增長(zhǎng),按順序存放,對(duì)于檢索非常有利
- 數(shù)字型,占用空間小,易排序,在程序中傳遞也方便
- 如果通過(guò)非系統(tǒng)增加記錄時(shí),可以不用指定該字段,不用擔(dān)心主鍵重復(fù)問(wèn)題
缺點(diǎn) :
- 因?yàn)樽詣?dòng)增長(zhǎng),在手動(dòng)要插入指定ID的記錄時(shí)會(huì)顯得麻煩,尤其是當(dāng)系統(tǒng)與其它系統(tǒng)集成時(shí),需要數(shù)據(jù)導(dǎo)入時(shí),很難保證原系統(tǒng)的ID不發(fā)生主鍵沖突(前提是老系統(tǒng)也是數(shù)字型的)
- 如果經(jīng)常有合并表的操作,就可能會(huì)出現(xiàn)主鍵重復(fù)的情況很難處理分布式存儲(chǔ)的數(shù)據(jù)表
- 數(shù)據(jù)量特別大時(shí),會(huì)導(dǎo)致查詢(xún)數(shù)據(jù)庫(kù)操作變慢;此時(shí)需要進(jìn)行數(shù)據(jù)庫(kù)的水平拆分,劃分到不同的數(shù)據(jù)庫(kù)中,那么當(dāng)添加數(shù)據(jù)時(shí),每個(gè)表都會(huì)自增長(zhǎng),導(dǎo)致主鍵沖突
UUID:
優(yōu)點(diǎn):
能夠保證獨(dú)立性,程序可以在不同的數(shù)據(jù)庫(kù)間遷移,效果不受影響;保證生成的ID不僅是表獨(dú)立的,而且是庫(kù)獨(dú)立的,這點(diǎn)在你想切分?jǐn)?shù)據(jù)庫(kù)的時(shí)候尤為重要
缺點(diǎn):
- 比較占地方,和INT類(lèi)型相比,存儲(chǔ)一個(gè)UUID要花費(fèi)更多的空間
- 使用UUID后,URL顯得冗長(zhǎng),不夠友好
- Join 操作性能比 int 要低
- UUID做主鍵將會(huì)添加到表上的其他索引中,因此會(huì)降低性能
到此這篇關(guān)于解決 MyBatis-Plus 中 ID 自增問(wèn)題的文章就介紹到這了,更多相關(guān)MyBatis-Plus ID 自增內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)為Word文檔添加文檔屬性
Word文檔的文檔屬性是一組用于描述文件本身及其內(nèi)容的元數(shù)據(jù),本文以客觀方式介紹如何在Java項(xiàng)目中為Word文檔添加文檔屬性,包含環(huán)境準(zhǔn)備、代碼示例和注意事項(xiàng),適合開(kāi)發(fā)者快速上手2026-03-03
LeetCode程序員面試題之無(wú)重復(fù)字符的最長(zhǎng)子串
Java計(jì)算無(wú)重復(fù)字符的最長(zhǎng)子串是一種常見(jiàn)的字符串處理算法,它的目的是找出一個(gè)字符串中無(wú)重復(fù)字符的最長(zhǎng)子串。該算法可以很好地解決一些字符串處理問(wèn)題,比如尋找字符串中重復(fù)字符的位置,以及計(jì)算字符串中無(wú)重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度。2023-02-02
常用Maven庫(kù),鏡像庫(kù)及maven/gradle配置(小結(jié))
這篇文章主要介紹了常用Maven庫(kù),鏡像庫(kù)及maven/gradle配置(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring Boot JDBC 連接數(shù)據(jù)庫(kù)示例
本篇文章主要介紹了Spring Boot JDBC 連接數(shù)據(jù)庫(kù)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
SpringCloud zookeeper作為注冊(cè)中心使用介紹
ZooKeeper由雅虎研究院開(kāi)發(fā),是Google Chubby的開(kāi)源實(shí)現(xiàn),后來(lái)托管到Apache,于2010年11月正式成為Apache的頂級(jí)項(xiàng)目。ZooKeeper是一個(gè)經(jīng)典的分布式數(shù)據(jù)一致性解決方案,致力于為分布式應(yīng)用提供一個(gè)高性能、高可用,且具有嚴(yán)格順序訪問(wèn)控制能力的分布式協(xié)調(diào)服務(wù)2022-11-11
Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解
這篇文章主要介紹了Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解,當(dāng)在?web.xml?注冊(cè)了一個(gè)?Filter?來(lái)對(duì)某個(gè)?Servlet?程序進(jìn)行攔截處理時(shí),它可以決定是否將請(qǐng)求繼續(xù)傳遞給?Servlet?程序,以及對(duì)請(qǐng)求和響應(yīng)消息是否進(jìn)行修改,需要的朋友可以參考下2023-08-08
SpringBoot實(shí)現(xiàn)接口加密的五大技巧分享
為了有效應(yīng)對(duì)接口安全面臨的挑戰(zhàn),接口加密作為一種至關(guān)重要的手段,能夠?qū)⒃紨?shù)據(jù)轉(zhuǎn)化為密文進(jìn)行傳輸,從而確保數(shù)據(jù)在傳輸過(guò)程中的機(jī)密性和完整性,本文將深入探討SpringBoot接口加密的最佳實(shí)踐,需要的朋友可以參考下2025-07-07

