91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

發布時間:2021-12-03 16:30:09 來源:億速云 閱讀:1327 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么解決Mybatis-Plus自動生成的數據庫id過長問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么解決Mybatis-Plus自動生成的數據庫id過長問題”吧!

一、問題

作為一名第一次使用mybatis-plus的萌新開發工程師,在項目開發過程中遇到一個問題。

當使用mybatis-plus自帶的mybatis-generate生成DO文件,如下圖所示

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

DO類由注釋@Table修飾,主鍵id由注釋@Id,@GeneratedValue修飾。但是使用這樣的默認DO進行數據庫操作時,會有導致數據庫自動生成的主鍵id過長,如下所示

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

這樣的19位id,會存在一些問題:

1)前端拿到這樣的id后,會發生Number精度丟失,導致id數值發生變化,使得前后端的id不一致,這樣就使得無法利用id進行操作

2)InnoDB存儲引擎的索引與記錄結構是這樣的:

其索引與記錄的結構是這樣的:

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

(1)主鍵索引與記錄存儲在一起;InnoDB通過主鍵索引查詢時,能夠直接定位到行記錄。

(2)普通索引存儲主鍵(這下不是指針了);

這樣當主鍵id是一個比較長的數值時每個索引都存儲這個值,在數據量大,內存珍貴的情況下,MySQL有限的緩沖區,存儲的索引與數據會減少,索引占用的磁盤空間也會增加,磁盤IO的概率會增加。

二、解決方案

通過詢問各位師兄和開發同學,解決了這個問題,解決方案如下:

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

將DO類的注釋改為@TableName,主鍵id的注釋改為@TableId,這樣自動生成的主鍵id就是正常位數。

至于為什么會這樣,我通過查閱資料得出一下結論

三、原理

1.首先了解下@GeneratedValue的使用。@GeneratedValue屬于JPA注解之一,JPA通過annotation來映射hibernate實體,基于annotation的hibernate主鍵標識為@Id,其生成規則是由@GeneratedValue設定的。

JPA提供四種標準用法,由@GeneratedValue的源代碼可以明顯看出:

@Target({METHOD,FIELD})    
    @Retention(RUNTIME)    
    public @interface GeneratedValue{    
        GenerationType strategy() default AUTO;    
        String generator() default "";    
    }

其中GenerationType包含四種策略:

public enum GenerationType{    
  //使用一個特定的數據庫表格來保存主鍵。 
    TABLE,
  //根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 
    SEQUENCE,
  //主鍵由數據庫自動生成(主要是自動增長型) 
    IDENTITY,
  //主鍵由程序控制。
    AUTO;
  
    private GenerationType() {
    }
}

其中的AUTO類型,在指定主鍵時,如果不指定主鍵生成策略,默認為AUTO。

@Id # 默認生成策略為AUTO

效果等同于

@Id  
@GeneratedValue(strategy = GenerationType.AUTO)

由此可見,自動生成的id和注解沒什么關系,那也許就是mybatis-plus的主鍵生成邏輯問題了。

通過去查詢mybatis-plus的文檔

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

發現mybatis-plus默認的主鍵生成是全局唯一的UUID,會導致生成的id過長。

并且官方也提供了解決方法,如下圖

怎么解決Mybatis-Plus自動生成的數據庫id過長問題

可這只是將防止了前端接收時的精度丟失,并沒有解決我的問題。

根據文檔,可以得出一個新的解決辦法,并且不用更改DO類代碼:

將文檔中所說的id-type配置設置為0即可。

Mybatis-Plus id主鍵生成的問題

簡要說明

由于mybatis-plus會自動插入一個id到實體對象, 不管你封裝與否, 所以有時候導致一些意外的情況發生

默認是生成一個長數字字符串(編碼不同可能結尾帶有字母)

錯誤

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, 這樣就能保證有足夠位數放入生成的id

2. 調整數據庫id字段類型

將數據庫的id字段的長度(改為20位)

解決方案二

如果想要使用id自增的, 就需要把mybatis-plus這個id生成的功能給關掉

添加注解

在id字段上加上如下注解即可

@TableId(value = "id",type = IdType.AUTO)

其他type類型介紹

  • AUTO:AUTO(0, “數據庫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”);

感謝各位的閱讀,以上就是“怎么解決Mybatis-Plus自動生成的數據庫id過長問題”的內容了,經過本文的學習后,相信大家對怎么解決Mybatis-Plus自動生成的數據庫id過長問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炉霍县| 咸丰县| 红安县| 荥阳市| 象州县| 温泉县| 金寨县| 武定县| 西安市| 大城县| 岳普湖县| 青铜峡市| 大竹县| 衡阳市| 锡林浩特市| 鄂伦春自治旗| 彩票| 孝感市| 保定市| 汝阳县| 西宁市| 晋城| 宁波市| 象州县| 乌鲁木齐市| 江西省| 南涧| 高平市| 塔城市| 台北市| 城步| 平塘县| 西充县| 涟源市| 星子县| 将乐县| 宽城| 长顺县| 高淳县| 闽侯县| 金秀|