您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么解決Mybatis-Plus自動生成的數(shù)據(jù)庫id過長問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么解決Mybatis-Plus自動生成的數(shù)據(jù)庫id過長問題”吧!
作為一名第一次使用mybatis-plus的萌新開發(fā)工程師,在項目開發(fā)過程中遇到一個問題。
當(dāng)使用mybatis-plus自帶的mybatis-generate生成DO文件,如下圖所示
DO類由注釋@Table修飾,主鍵id由注釋@Id,@GeneratedValue修飾。但是使用這樣的默認DO進行數(shù)據(jù)庫操作時,會有導(dǎo)致數(shù)據(jù)庫自動生成的主鍵id過長,如下所示
這樣的19位id,會存在一些問題:
1)前端拿到這樣的id后,會發(fā)生Number精度丟失,導(dǎo)致id數(shù)值發(fā)生變化,使得前后端的id不一致,這樣就使得無法利用id進行操作
2)InnoDB存儲引擎的索引與記錄結(jié)構(gòu)是這樣的:
其索引與記錄的結(jié)構(gòu)是這樣的:
(1)主鍵索引與記錄存儲在一起;InnoDB通過主鍵索引查詢時,能夠直接定位到行記錄。
(2)普通索引存儲主鍵(這下不是指針了);
這樣當(dāng)主鍵id是一個比較長的數(shù)值時每個索引都存儲這個值,在數(shù)據(jù)量大,內(nèi)存珍貴的情況下,MySQL有限的緩沖區(qū),存儲的索引與數(shù)據(jù)會減少,索引占用的磁盤空間也會增加,磁盤IO的概率會增加。
通過詢問各位師兄和開發(fā)同學(xué),解決了這個問題,解決方案如下:
將DO類的注釋改為@TableName,主鍵id的注釋改為@TableId,這樣自動生成的主鍵id就是正常位數(shù)。
至于為什么會這樣,我通過查閱資料得出一下結(jié)論
1.首先了解下@GeneratedValue的使用。@GeneratedValue屬于JPA注解之一,JPA通過annotation來映射hibernate實體,基于annotation的hibernate主鍵標(biāo)識為@Id,其生成規(guī)則是由@GeneratedValue設(shè)定的。
JPA提供四種標(biāo)準(zhǔn)用法,由@GeneratedValue的源代碼可以明顯看出:
@Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ GenerationType strategy() default AUTO; String generator() default ""; }
其中GenerationType包含四種策略:
public enum GenerationType{ //使用一個特定的數(shù)據(jù)庫表格來保存主鍵。 TABLE, //根據(jù)底層數(shù)據(jù)庫的序列來生成主鍵,條件是數(shù)據(jù)庫支持序列。 SEQUENCE, //主鍵由數(shù)據(jù)庫自動生成(主要是自動增長型) IDENTITY, //主鍵由程序控制。 AUTO; private GenerationType() { } }
其中的AUTO類型,在指定主鍵時,如果不指定主鍵生成策略,默認為AUTO。
即
@Id # 默認生成策略為AUTO
效果等同于
@Id @GeneratedValue(strategy = GenerationType.AUTO)
由此可見,自動生成的id和注解沒什么關(guān)系,那也許就是mybatis-plus的主鍵生成邏輯問題了。
通過去查詢mybatis-plus的文檔
發(fā)現(xiàn)mybatis-plus默認的主鍵生成是全局唯一的UUID,會導(dǎo)致生成的id過長。
并且官方也提供了解決方法,如下圖
可這只是將防止了前端接收時的精度丟失,并沒有解決我的問題。
根據(jù)文檔,可以得出一個新的解決辦法,并且不用更改DO類代碼:
將文檔中所說的id-type配置設(shè)置為0即可。
由于mybatis-plus會自動插入一個id到實體對象, 不管你封裝與否, 所以有時候?qū)е乱恍┮馔獾那闆r發(fā)生
默認是生成一個長數(shù)字字符串(編碼不同可能結(jié)尾帶有字母)
ested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.xxx' with value '1110423703487479810' Cause: java.lang.IllegalArgumentException: java.lang.ClassCastException@14041406
大致就是由于自動生成了一個id1110423703487479810, 但是無法放入到integer中
1. 修改id字段類型
將id字段類型改為long, 這樣就能保證有足夠位數(shù)放入生成的id
2. 調(diào)整數(shù)據(jù)庫id字段類型
將數(shù)據(jù)庫的id字段的長度(改為20位)
如果想要使用id自增的, 就需要把mybatis-plus這個id生成的功能給關(guān)掉
添加注解
在id字段上加上如下注解即可
@TableId(value = "id",type = IdType.AUTO)
其他type類型介紹
AUTO
:AUTO(0, “數(shù)據(jù)庫ID自增”),
INPUT
:INPUT(1, “用戶輸入ID”),
ID_WORKER
:ID_WORKER(2, “全局唯一ID”),
UUID
:UUID(3, “全局唯一ID”),
NONE
:NONE(4, “該類型為未設(shè)置主鍵類型”),
ID_WORKER_STR
:ID_WORKER_STR(5, “字符串全局唯一ID”);
感謝各位的閱讀,以上就是“怎么解決Mybatis-Plus自動生成的數(shù)據(jù)庫id過長問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么解決Mybatis-Plus自動生成的數(shù)據(jù)庫id過長問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。