mybatis-plus添加數(shù)據(jù)時id自增問題及解決
mybatis-plus添加數(shù)據(jù)時id自增問題
mybatis-plus插入數(shù)據(jù),id自增列變的很長.比如下圖:

mybatis-plus中遇到一個,添加數(shù)據(jù)到數(shù)據(jù)庫,而數(shù)據(jù)庫中的id列是自增列
使用plus中自帶的insert方法添加到數(shù)據(jù)庫,id自增變的很長很長,
數(shù)據(jù)庫id字段數(shù)據(jù)類型為long
解決方案
在實體類自增的id字段添加一個注解

mybatis plus在插入記錄時,有以下幾種方法:
boolean insert(T var1); boolean insertAllColumn(T var1); boolean insertBatch(List var1); boolean insertBatch(List var1, int var2); boolean insertOrUpdateBatch(List var1); boolean insertOrUpdateBatch(List var1, int var2);
當(dāng)時實體中,主鍵生成方式不設(shè)置生成方式時,默認(rèn)的是自增。所有當(dāng)你設(shè)置主鍵的值時,依舊無法保存主鍵。
@TableId(value = “id”) private Integer id;
我們可以設(shè)置主鍵的生成方式
@TableId(value = “id”,type = IdType.INPUT) 這種方式是主鍵手動輸入
主鍵生成方式類型如下(IdType):
- AUTO(0, “數(shù)據(jù)庫ID自增”),
- INPUT(1, “用戶輸入ID”),
- ID_WORKER(2, “全局唯一ID”),
- UUID(3, “全局唯一ID”),
- NONE(4, “該類型為未設(shè)置主鍵類型”),
- ID_WORKER_STR(5, “字符串全局唯一ID”);
插入記錄的主鍵自增賦值機制說明
現(xiàn)在的項目實踐中,表設(shè)計一般采用自增主鍵,那么在這當(dāng)中會涉及到數(shù)據(jù)插入后,獲取插入數(shù)據(jù)主鍵的一個場景處理。
對于這種情況,mybatis框架做了封裝,提供了支持。
代碼說明
通過debug方式,跟進(jìn)執(zhí)行路徑,查看對應(yīng)邏輯代碼。
1、找到執(zhí)行入口

這里的參數(shù)賦值有三個,但不包括id的賦值,id是由數(shù)據(jù)庫自增。
這里看到一個KeyGenerator的類型,這個名字name的很好,自說明性很好。
2、看看keyGenerator的執(zhí)行邏輯

這里可以看出,參數(shù)類型的id依然是空,但是上圖的sql執(zhí)行已結(jié)束。
3、 跟進(jìn)邏輯執(zhí)行

這是一部分邏輯,還沒有到,但是看方法名assign,就要到了。
4、繼續(xù)進(jìn)入下一層邏輯

這個時候,id仍然是null
5、繼續(xù)進(jìn)入下一層邏輯

這里我們看到有set的動作,在執(zhí)行前,id是仍然為null
6、關(guān)鍵取值

在Object value 的賦值邏輯,看到數(shù)據(jù)是從rs中獲取,值是184
7、關(guān)鍵賦值


在執(zhí)行完set后,插入數(shù)據(jù)的類型對象的id有了值。
到這里自增id賦值就結(jié)束了。
總結(jié)
自增id的補償賦值很好的彌補了同自定義id的不足。但是為什么框架能做到呢。看下面的注釋說明

這是JDBC的標(biāo)準(zhǔn)接口,提供了這個口子,在sql執(zhí)行返回后,可以帶上自增id的信息,因此應(yīng)用層框架可以執(zhí)行賦值,避免二次查詢。
實際項目是采用自增主鍵,還是自定義賦值主鍵,需要充分考慮到兩者的優(yōu)缺點同實際的情況結(jié)合。優(yōu)缺點可以參考如下:
這種方式是使用數(shù)據(jù)庫提供的自增數(shù)值型字段作為自增主鍵,它的優(yōu)點是:
自增主鍵
這種方式是使用數(shù)據(jù)庫提供的自增數(shù)值型字段作為自增主鍵,
優(yōu)點是:
1、數(shù)據(jù)庫自動編號,速度快,而且是增量增長,按順序存放,對于檢索非常有利;
2、數(shù)字型,占用空間小,易排序,在程序中傳遞也方便;
3、如果通過非系統(tǒng)增加記錄時,可以不用指定該字段,不用擔(dān)心主鍵重復(fù)問題。
缺點 :
1、因為自動增長,在手動要插入指定ID的記錄時會顯得麻煩,尤其是當(dāng)系統(tǒng)與其它系統(tǒng)集成時,需要數(shù)據(jù)導(dǎo)入時,很難保證原系統(tǒng)的ID不發(fā)生主鍵沖突(前提是老系統(tǒng)也是數(shù)字型的)。
2、如果經(jīng)常有合并表的操作,就可能會出現(xiàn)主鍵重復(fù)的情況很難處理分布式存儲的數(shù)據(jù)表。
3、數(shù)據(jù)量特別大時,會導(dǎo)致查詢數(shù)據(jù)庫操作變慢。此時需要進(jìn)行數(shù)據(jù)庫的水平拆分,劃分到不同的數(shù)據(jù)庫中,那么當(dāng)添加數(shù)據(jù)時,每個表都會自增長,導(dǎo)致主鍵沖突。
UUID
優(yōu)點:
1、能夠保證獨立性,程序可以在不同的數(shù)據(jù)庫間遷移,效果不受影響。保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分?jǐn)?shù)據(jù)庫的時候尤為重要。
缺點:
1、比較占地方,和INT類型相比,存儲一個UUID要花費更多的空間。
2、使用UUID后,URL顯得冗長,不夠友好。
3、Join操作性能比int要低。
4、UUID做主鍵將會添加到表上的其他索引中,因此會降低性能。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過MyBatis框架對MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法
MyBatis框架由Java的JDBC API進(jìn)一步封裝而來,在操作數(shù)據(jù)庫方面效果拔群,接下來我們就一起來看看Java通過MyBatis框架對MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法:2016-06-06
Java?Lambda表達(dá)式常用的函數(shù)式接口
這篇文章主要介紹了Java?Lambda表達(dá)式常用的函數(shù)式接口,文章基于Java?Lambda表達(dá)式展開對常用的函數(shù)式接口的介紹,具有一的的參考價值需要的小伙伴可以參考一下2022-04-04
SpringBoot 集成 Jasypt 對數(shù)據(jù)庫加密以及踩坑的記錄分享
這篇文章主要介紹了SpringBoot 集成 Jasypt 對數(shù)據(jù)庫加密以及踩坑,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

