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

MybatisPlus中的insert操作詳解

 更新時(shí)間:2022年02月09日 09:33:45   作者:pipizhen_  
這篇文章主要介紹了MybatisPlus中的insert操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MybatisPlus insert操作

在測(cè)試之前,我們思考一個(gè)問(wèn)題,上個(gè)入門案例中,我們什么sql語(yǔ)句代碼都沒(méi)寫(xiě),但也能查詢出來(lái)數(shù)據(jù)。

是誰(shuí)幫我們做了寫(xiě)基本代碼的事情?肯定是MybatisPlus。

為了驗(yàn)證并繼續(xù)向下學(xué)習(xí),我們開(kāi)啟日志,打印在控制臺(tái)上。

1、開(kāi)啟日志

只需在yml配置文件中,寫(xiě)上:

mybatis-plus:
? configuration:
? ? log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、測(cè)試插入的代碼

? ? @Test
? ? void testInsert() {
? ? ? ? UserEntity userEntity = new UserEntity();
? ? ? ? userEntity.setName("pipizhen");
? ? ? ? userEntity.setAge(10);
? ? ? ? userEntity.setEmail("ppz@qq.com");
? ? ? ? int count = userMapper.insert(userEntity);

? ? ? ? System.out.println(count);
? ? ? ? System.out.println(userEntity);
? ? }

控制臺(tái)輸出:

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2373ad99] was not registered for synchronization because synchronization is not active
2020-11-23 14:13:12.748  INFO 7392 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-11-23 14:13:13.028  INFO 7392 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1977652583 wrapping com.mysql.cj.jdbc.ConnectionImpl@2a334bac] will not be managed by Spring
==>  Preparing: INSERT INTO tbl_user ( id, name, email, age ) VALUES ( ?, ?, ?, ? ) 
==> Parameters: 1330756266048045058(Long), pipizhen(String), ppz@qq.com(String), 10(Integer)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2373ad99]
1
UserEntity(id=1330756266048045058, name=pipizhen, age=10, email=ppz@qq.com)

說(shuō)明我們插入數(shù)據(jù)成功了,細(xì)心的人會(huì)發(fā)現(xiàn)我們并沒(méi)有指定id,但插入成功后,我們發(fā)現(xiàn)對(duì)象存在id。

肯定是主鍵自動(dòng)生成的,沒(méi)錯(cuò),但是怎么生成一個(gè)這么大的數(shù)字呢?為什么不是在原有的記錄條數(shù)id在自增1呢?

這里數(shù)據(jù)庫(kù)插入的id的默認(rèn)值為:全局唯一id。

全局唯一id可自行百度:分布式系統(tǒng)唯一id生成。

3、MybatisPlus使用的是雪花算法

原理:Twitter的雪花算法SnowFlake,使用Java語(yǔ)言實(shí)現(xiàn)。

可以了解一下:

SnowFlake算法產(chǎn)生的ID是一個(gè)64位的整型,結(jié)構(gòu)如下(每一部分用“-”符號(hào)分隔):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

  • 1位標(biāo)識(shí)部分,在java中由于long的最高位是符號(hào)位,正數(shù)是0,負(fù)數(shù)是1,一般生成的ID為正數(shù),所以為0;
  • 41位時(shí)間戳部分,這個(gè)是毫秒級(jí)的時(shí)間,一般實(shí)現(xiàn)上不會(huì)存儲(chǔ)當(dāng)前的時(shí)間戳,而是時(shí)間戳的差值(當(dāng)前時(shí)間-固定的開(kāi)始時(shí)間),這樣可以使產(chǎn)生的ID從更小值開(kāi)始;41位的時(shí)間戳可以使用69年,(1L << 41) / (1000L606024365) = 69年;
  • 10位節(jié)點(diǎn)部分,Twitter實(shí)現(xiàn)中使用前5位作為數(shù)據(jù)中心標(biāo)識(shí),后5位作為機(jī)器標(biāo)識(shí),可以部署1024個(gè)節(jié)點(diǎn);
  • 12位序列號(hào)部分,支持同一毫秒內(nèi)同一個(gè)節(jié)點(diǎn)可以生成4096個(gè)ID;

SnowFlake算法生成的ID大致上是按照時(shí)間遞增的,用在分布式系統(tǒng)中時(shí),需要注意數(shù)據(jù)中心標(biāo)識(shí)和機(jī)器標(biāo)識(shí)必須唯一,這樣就能保證每個(gè)節(jié)點(diǎn)生成的ID都是唯一的?;蛟S我們不一定都需要像上面那樣使用5位作為數(shù)據(jù)中心標(biāo)識(shí),5位作為機(jī)器標(biāo)識(shí),可以根據(jù)我們業(yè)務(wù)的需要,靈活分配節(jié)點(diǎn)部分,如:若不需要數(shù)據(jù)中心,完全可以使用全部10位作為機(jī)器標(biāo)識(shí);若數(shù)據(jù)中心不多,也可以只使用3位作為數(shù)據(jù)中心,7位作為機(jī)器標(biāo)識(shí)。

snowflake生成的ID整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生ID碰撞(由datacenter和workerId作區(qū)分),并且效率較高。據(jù)說(shuō):snowflake每秒能夠產(chǎn)生26萬(wàn)個(gè)ID。

4、MybatisPlus中的主鍵生成策略

我們可以在@TableId注解中發(fā)現(xiàn)有個(gè)屬性IdType,這是一個(gè)枚舉類。

舊版本的枚舉值有AUTO, NONE, INPUT, ID_WORKER, UUID, ID_WORKER_STR;

新版本又增加了兩種,ASSIGN_ID,ASSIGN_UUID。

舊版本當(dāng)我們不指定主鍵生成類型時(shí),即值為null時(shí),默認(rèn)使用ID_WORKER類型。

新版本默認(rèn)為NONE,注解里等于跟隨全局,全局里約等于 INPUT。

(1)AUTO:數(shù)據(jù)庫(kù)ID自增。

(2)NONE:無(wú)狀態(tài),該類型為未設(shè)置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT)。

(3)INPUT:insert前自行set主鍵值,即我們插入前,需要手動(dòng)設(shè)置id。

(4)ASSIGN_ID:分配ID(主鍵類型為Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認(rèn)實(shí)現(xiàn)類為DefaultIdentifierGenerator雪花算法)。

(5)ASSIGN_UUID:分配UUID,主鍵類型為String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認(rèn)default方法)

(6)ID_WORKER:分布式全局唯一ID 長(zhǎng)整型類型(please use ASSIGN_ID)。

(7)UUID:32位UUID字符串(please use ASSIGN_UUID)。

(8)ID_WORKER_STR 分布式全局唯一ID 字符串類型(please use ASSIGN_ID)

注意:最后三個(gè)在最新版本中,ID_WORKER,UUID,ID_WORKER_STR已經(jīng)被遺棄了,不建議使用。

5、測(cè)試不同的主鍵生成策略

(1)AUTO策略

我們修改實(shí)體類中的id注解為:@TableId(value = “id”, type = IdType.AUTO)

并修改數(shù)據(jù)庫(kù)中表tbl_user的id確定為自增。不然啟動(dòng)會(huì)報(bào)錯(cuò):Field ‘id’ doesn’t have a default value.

測(cè)試之前,我們還需把表中那個(gè)id好長(zhǎng)的記錄刪掉,并重啟MySQL軟件,我的是Navicat。目的防止緩存的影響。

測(cè)試程序還是上面那幾行代碼:

@Test
? ? void testInsert() {
? ? ? ? UserEntity userEntity = new UserEntity();
? ? ? ? userEntity.setName("pipizhen");
? ? ? ? userEntity.setAge(10);
? ? ? ? userEntity.setEmail("ppz@qq.com");
? ? ? ? int count = userMapper.insert(userEntity);
? ? ? ? System.out.println(count);
? ? ? ? System.out.println(userEntity);
? ? }

控制臺(tái)的部分打印為:

1
UserEntity(id=6, name=pipizhen, age=10, email=ppz@qq.com)

我們發(fā)現(xiàn)確實(shí)是我們熟悉的id自增1。

(2)INPUT策略

需要我們手動(dòng)設(shè)置id的值,這樣設(shè)置時(shí),當(dāng)數(shù)據(jù)庫(kù)表的id設(shè)置了自增,插入時(shí)可設(shè)置id,也可不設(shè)置id。

當(dāng)數(shù)據(jù)庫(kù)表id沒(méi)有設(shè)置自增,那我們插入數(shù)據(jù)時(shí)就必須設(shè)置id,不然誰(shuí)來(lái)幫我們?cè)O(shè)置id的值,大家都知道id存在主鍵約束。

(3)ASSIGN_ID策略

也是自動(dòng)生成一個(gè)很長(zhǎng)的Long型數(shù)字。

可以自己嘗試測(cè)試一下,只需改變實(shí)體類中注解中的IdType屬性值。

MybatisPlus坑insert方法

有天早上我的一個(gè)同事,突然跑來(lái)告訴我。我們某張表的自增ID變得很大。類似1173776258468638722 這種。這個(gè)當(dāng)然是不能接受的啊。

著手解決

然后就開(kāi)始找問(wèn)題的原因,一開(kāi)始我想的是數(shù)據(jù)庫(kù)上的問(wèn)題,我刪掉不合理的數(shù)據(jù),

alter table *** AUTO_INCREMENT=20

修改自增ID從20開(kāi)始。手動(dòng)插入數(shù)據(jù),居然OK。

那就說(shuō)明,可能是我們代碼insert數(shù)據(jù)的時(shí)候存在的問(wèn)題。我找到數(shù)據(jù)庫(kù)訪問(wèn)層的insert語(yǔ)句處,發(fā)現(xiàn)使用的是mybatis-plus,網(wǎng)上查了一下關(guān)于這塊的東西,發(fā)現(xiàn)insert方法在配置的時(shí)候,可以指定自增ID的方式。

源碼中定義有以下幾種

public enum IdType {
? ? AUTO(0, "數(shù)據(jù)庫(kù)ID自增"),
? ? INPUT(1, "用戶輸入ID"),
? ? ID_WORKER(2, "全局唯一ID"),
? ? UUID(3, "全局唯一ID"),
? ? NONE(4, "該類型為未設(shè)置主鍵類型"),
? ? ID_WORKER_STR(5, "字符串全局唯一ID");

然后我就果斷手動(dòng)配置了一下,

? ? @TableId(type = IdType.AUTO)
? ? private Long userId;

重啟測(cè)試,OK。

也是很奇怪為什么之前的那部分?jǐn)?shù)據(jù)的自增ID都是沒(méi)問(wèn)題的,突然出現(xiàn)這個(gè),也是很困惑

總結(jié),出現(xiàn)這個(gè)問(wèn)題的原因,還是因?yàn)樽约杭夹g(shù)不熟練啦~~

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

相關(guān)文章

  • Java利用Easyexcel導(dǎo)出excel表格的示例代碼

    Java利用Easyexcel導(dǎo)出excel表格的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java利用Easyexcel導(dǎo)出excel表格的示例代碼,文中的代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-07-07
  • 解決java錯(cuò)誤:不支持發(fā)行版本5

    解決java錯(cuò)誤:不支持發(fā)行版本5

    這篇文章主要給大家介紹了關(guān)于如何解決java錯(cuò)誤:不支持發(fā)行版本5的相關(guān)資料,發(fā)行版本5是Java5,已經(jīng)是十多年前的版本了,現(xiàn)在已經(jīng)不再被支持,需要的朋友可以參考下
    2023-07-07
  • SpringCloud集成Hystrix熔斷過(guò)程分步分解

    SpringCloud集成Hystrix熔斷過(guò)程分步分解

    通過(guò)hystrix可以解決雪崩效應(yīng)問(wèn)題,它提供了資源隔離、降級(jí)機(jī)制、融斷、緩存等功能。接下來(lái)通過(guò)本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2022-09-09
  • java設(shè)計(jì)模式之淺談適配器模式

    java設(shè)計(jì)模式之淺談適配器模式

    我們現(xiàn)實(shí)生活中的適配器不少.例如,我們使用存儲(chǔ)卡適配器連接存儲(chǔ)卡和一個(gè)計(jì)算機(jī),因?yàn)橛?jì)算機(jī)僅支持一種類型的存儲(chǔ)卡和我們的卡不與計(jì)算機(jī)兼容,適配器是兩種不相容的實(shí)體之間的轉(zhuǎn)換器,適配器模式是一種結(jié)構(gòu)模式.本文就帶大家了解一下java適配器模式,需要的朋友可以參考下
    2021-06-06
  • SpringBoot入門實(shí)現(xiàn)第一個(gè)SpringBoot項(xiàng)目

    SpringBoot入門實(shí)現(xiàn)第一個(gè)SpringBoot項(xiàng)目

    今天我們一起來(lái)完成一個(gè)簡(jiǎn)單的SpringBoot(Hello World)。就把他作為你的第一個(gè)SpringBoot項(xiàng)目。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • SpringAop實(shí)現(xiàn)操作日志記錄

    SpringAop實(shí)現(xiàn)操作日志記錄

    這篇文章主要介紹了SpringAop實(shí)現(xiàn)操作日志記錄的方法,幫助大家更好的理解和使用SpringAop,感興趣的朋友可以了解下
    2020-12-12
  • SpringBoot+JUnit5+MockMvc+Mockito單元測(cè)試的實(shí)現(xiàn)

    SpringBoot+JUnit5+MockMvc+Mockito單元測(cè)試的實(shí)現(xiàn)

    今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應(yīng)用最廣的測(cè)試框架,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Mybatis-plus自動(dòng)填充不生效或自動(dòng)填充數(shù)據(jù)為null原因及解決方案

    Mybatis-plus自動(dòng)填充不生效或自動(dòng)填充數(shù)據(jù)為null原因及解決方案

    本文主要介紹了Mybatis-plus自動(dòng)填充不生效或自動(dòng)填充數(shù)據(jù)為null原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java泛型類型通配符和C#對(duì)比分析

    Java泛型類型通配符和C#對(duì)比分析

    下面小編就為大家?guī)?lái)一篇Java泛型類型通配符和C#對(duì)比分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解

    SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解

    這篇文章主要介紹了SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

名山县| 朝阳区| 阳信县| 新闻| 松江区| 桐柏县| 宽甸| 资溪县| 安乡县| 南部县| 开远市| 措勤县| 莎车县| 益阳市| 富阳市| 东丰县| 上虞市| 开远市| 辰溪县| 宁波市| 华坪县| 东莞市| 池州市| 克拉玛依市| 青浦区| 永川市| 宁国市| 玉溪市| 莱芜市| 房产| 綦江县| 静海县| 隆安县| 彰化县| 确山县| 金沙县| 睢宁县| 黔西县| 寻甸| 黑龙江省| 康平县|