最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus自動生成的數(shù)據(jù)庫id過長的解決

 更新時間:2021年12月03日 14:40:44   作者:lilun1231  
這篇文章主要介紹了Mybatis-Plus自動生成的數(shù)據(jù)庫id過長的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis-Plus自動生成的數(shù)據(jù)庫id過長

一、問題

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

2)InnoDB存儲引擎的索引與記錄結(jié)構(gòu)是這樣的:

其索引與記錄的結(jié)構(gòu)是這樣的:

img

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

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

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

二、解決方案

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

在這里插入圖片描述

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

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

三、原理

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

JPA提供四種標準用法,由@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的文檔(文檔鏈接:https://baomidou.gitee.io/mybatis-plus-doc/#/spring-boot

在這里插入圖片描述

發(fā)現(xiàn)mybatis-plus默認的主鍵生成是全局唯一的UUID,會導致生成的id過長。

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

在這里插入圖片描述

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

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

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

Mybatis-Plus id主鍵生成的問題

簡要說明

由于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”);

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java web上傳文件和下載文件代碼片段分享

    java web上傳文件和下載文件代碼片段分享

    這篇文章主要為大家詳細介紹了java web上傳文件和下載文件代碼片段,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池

    SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池

    這篇文章主要介紹了SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java實現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼)

    java實現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼)

    為避免繁瑣的注冊登陸,很多平臺和網(wǎng)站都會實現(xiàn)三方登陸的功能,增強用戶的粘性。這篇文章主要介紹了java實現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼),避免做微信登錄開發(fā)的朋友們少走彎路
    2022-12-12
  • Java中的snowflake算法詳解

    Java中的snowflake算法詳解

    這篇文章主要介紹了Java中的snowflake算法詳解,Snowflake算法產(chǎn)生是為了滿足Twitter每秒上萬條消息的請求,每條消息都必須分配一條唯一的id,這些id還需要一些大致的順序,并且在分布式系統(tǒng)中不同機器產(chǎn)生的id必須不同,需要的朋友可以參考下
    2023-08-08
  • Java中IO流概述

    Java中IO流概述

    大家好,本篇文章主要講的是Java中IO流概述,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng)

    基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng)

    最近想做一個關(guān)于文件上傳的個人小網(wǎng)盤,一開始嘗試使用了OSS的方案,但是該方案對于大文件來說并不友好,所以開始嘗試分片上傳方案的探索,接下來小編給大家詳細的介紹一下如何基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng),需要的朋友可以參考下
    2023-12-12
  • 優(yōu)化SpringBoot程序啟動速度的實現(xiàn)

    優(yōu)化SpringBoot程序啟動速度的實現(xiàn)

    本文主要介紹了優(yōu)化SpringBoot程序啟動速度的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • java編程求二叉樹最大路徑問題代碼分析

    java編程求二叉樹最大路徑問題代碼分析

    這篇文章主要介紹了java編程求二叉樹最大路徑問題代碼分析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 解決SpringBoot掃描不到公共類的實體問題

    解決SpringBoot掃描不到公共類的實體問題

    這篇文章主要介紹了解決SpringBoot掃描不到公共類的實體問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Spring Batch 輕量級批處理框架實踐

    詳解Spring Batch 輕量級批處理框架實踐

    這篇文章主要介紹了詳解Spring Batch 輕量級批處理框架實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06

最新評論

临猗县| 阿瓦提县| 黄骅市| 久治县| 华蓥市| 曲水县| 乐平市| 高陵县| 宜君县| 内乡县| 高平市| 鄂州市| 北辰区| 德阳市| 沁水县| 密云县| 南安市| 余姚市| 丰原市| 响水县| 海南省| 白朗县| 育儿| 万年县| 石家庄市| 老河口市| 营山县| 云梦县| 夏邑县| 互助| 大宁县| 丹巴县| 黔江区| 礼泉县| 黄石市| 于田县| 永春县| 志丹县| 亳州市| 柳河县| 青龙|