您好,登錄后才能下訂單哦!
小編給大家分享一下如何解決mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
mybatis-plus插入數(shù)據(jù),id自增列變的很長(zhǎng).比如下圖:
mybatis-plus中遇到一個(gè),添加數(shù)據(jù)到數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)中的id列是自增列
使用plus中自帶的insert方法添加到數(shù)據(jù)庫(kù),id自增變的很長(zhǎng)很長(zhǎng),
數(shù)據(jù)庫(kù)id字段數(shù)據(jù)類(lèi)型為long
在實(shí)體類(lèi)自增的id字段添加一個(gè)注解
mybatis plus在插入記錄時(shí),有以下幾種方法:
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í)實(shí)體中,主鍵生成方式不設(shè)置生成方式時(shí),默認(rèn)的是自增。所有當(dāng)你設(shè)置主鍵的值時(shí),依舊無(wú)法保存主鍵。
@TableId(value = “id”) private Integer id;
我們可以設(shè)置主鍵的生成方式
@TableId(value = “id”,type = IdType.INPUT) 這種方式是主鍵手動(dòng)輸入
主鍵生成方式類(lèi)型如下(IdType):
AUTO(0, “數(shù)據(jù)庫(kù)ID自增”),
INPUT(1, “用戶(hù)輸入ID”),
ID_WORKER(2, “全局唯一ID”),
UUID(3, “全局唯一ID”),
NONE(4, “該類(lèi)型為未設(shè)置主鍵類(lèi)型”),
ID_WORKER_STR(5, “字符串全局唯一ID”);
現(xiàn)在的項(xiàng)目實(shí)踐中,表設(shè)計(jì)一般采用自增主鍵,那么在這當(dāng)中會(huì)涉及到數(shù)據(jù)插入后,獲取插入數(shù)據(jù)主鍵的一個(gè)場(chǎng)景處理。
對(duì)于這種情況,mybatis框架做了封裝,提供了支持。
通過(guò)debug方式,跟進(jìn)執(zhí)行路徑,查看對(duì)應(yīng)邏輯代碼。
這里的參數(shù)賦值有三個(gè),但不包括id的賦值,id是由數(shù)據(jù)庫(kù)自增。
這里看到一個(gè)KeyGenerator的類(lèi)型,這個(gè)名字name的很好,自說(shuō)明性很好。
這里可以看出,參數(shù)類(lèi)型的id依然是空,但是上圖的sql執(zhí)行已結(jié)束。
這是一部分邏輯,還沒(méi)有到,但是看方法名assign,就要到了。
這個(gè)時(shí)候,id仍然是null
這里我們看到有set的動(dòng)作,在執(zhí)行前,id是仍然為null
在Object value 的賦值邏輯,看到數(shù)據(jù)是從rs中獲取,值是184
在執(zhí)行完set后,插入數(shù)據(jù)的類(lèi)型對(duì)象的id有了值。
到這里自增id賦值就結(jié)束了。
總結(jié)
自增id的補(bǔ)償賦值很好的彌補(bǔ)了同自定義id的不足。但是為什么框架能做到呢??聪旅娴淖⑨屨f(shuō)明
這是JDBC的標(biāo)準(zhǔn)接口,提供了這個(gè)口子,在sql執(zhí)行返回后,可以帶上自增id的信息,因此應(yīng)用層框架可以執(zhí)行賦值,避免二次查詢(xún)。
實(shí)際項(xiàng)目是采用自增主鍵,還是自定義賦值主鍵,需要充分考慮到兩者的優(yōu)缺點(diǎn)同實(shí)際的情況結(jié)合。優(yōu)缺點(diǎn)可以參考如下:
這種方式是使用數(shù)據(jù)庫(kù)提供的自增數(shù)值型字段作為自增主鍵,它的優(yōu)點(diǎn)是:
這種方式是使用數(shù)據(jù)庫(kù)提供的自增數(shù)值型字段作為自增主鍵,
優(yōu)點(diǎn)是:
1、數(shù)據(jù)庫(kù)自動(dòng)編號(hào),速度快,而且是增量增長(zhǎng),按順序存放,對(duì)于檢索非常有利;
2、數(shù)字型,占用空間小,易排序,在程序中傳遞也方便;
3、如果通過(guò)非系統(tǒng)增加記錄時(shí),可以不用指定該字段,不用擔(dān)心主鍵重復(fù)問(wèn)題。
缺點(diǎn) :
1、因?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ù)字型的)。
2、如果經(jīng)常有合并表的操作,就可能會(huì)出現(xiàn)主鍵重復(fù)的情況很難處理分布式存儲(chǔ)的數(shù)據(jù)表。
3、數(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)致主鍵沖突。
優(yōu)點(diǎn):
1、能夠保證獨(dú)立性,程序可以在不同的數(shù)據(jù)庫(kù)間遷移,效果不受影響。保證生成的ID不僅是表獨(dú)立的,而且是庫(kù)獨(dú)立的,這點(diǎn)在你想切分?jǐn)?shù)據(jù)庫(kù)的時(shí)候尤為重要。
缺點(diǎn):
1、比較占地方,和INT類(lèi)型相比,存儲(chǔ)一個(gè)UUID要花費(fèi)更多的空間。
2、使用UUID后,URL顯得冗長(zhǎng),不夠友好。
3、Join操作性能比int要低。
4、UUID做主鍵將會(huì)添加到表上的其他索引中,因此會(huì)降低性能。
看完了這篇文章,相信你對(duì)“如何解決mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。