一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式

MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式

2022-01-17 11:26liaosilzu2007 Java教程

這篇文章主要介紹了MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

insert語(yǔ)句返回主鍵和selectKey標(biāo)簽

往數(shù)據(jù)庫(kù)中插入一條記錄后,有時(shí)候我們需要這條記錄的主鍵,用于后續(xù)的操作。

如果在插入后再去查一次數(shù)據(jù)庫(kù),顯然不夠優(yōu)雅和效率,MyBatis中已經(jīng)有了insert后返回主鍵的功能,下面就主要講幾種不同情況的具體做法。

1.主鍵自增的情況

對(duì)于MySQL和Sql Server這種支持主鍵自增的數(shù)據(jù)庫(kù),可以設(shè)置useGeneratedKeys="true"和keyProperty。例如現(xiàn)在有一個(gè)表 tbl_employee,表有id,name,age,create_time四個(gè)字段,MyBatis映射文件中可以寫(xiě)成如下:

?
1
2
3
4
5
<insert id="insertRecord" parameterType="com.lzumetal.mybatis.entity.Employee"
    useGeneratedKeys="true"  keyProperty="id">
        INSERT INTO tbl_employee(name, age, create_time)
        VALUES(#{name}, #{age}, #{createTime})
</insert>
  • useGeneratedKeys="true":使用自動(dòng)生成的主鍵
  • keyProperty:指定主鍵是(javaBean的)哪個(gè)屬性。

useGeneratedKeys:
(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false

keyProperty:
(insert and update only) Identifies a property into which MyBatis will set the key value returned by getGeneratedKeys , or by a selectKey child element of the insert statement. Default: unset .
Can be a comma separated list of property names if multiple generated columns are expected.

2.Oracle中用Sequence獲取主鍵

對(duì)于Oracle數(shù)據(jù)庫(kù),當(dāng)要用到自增字段時(shí),需要用到Sequence,假設(shè)我們現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)名字為SEQ_ADMIN的 Sequence,在MyBatis中的映射文件中可以結(jié)合selectKey標(biāo)簽使用。

?
1
2
3
4
5
6
7
<insert id="insert"  parameterType="com.lzumetal.mybatis.entity.Employee">
    <selectKey keyProperty="id" resultType="long" order="BEFORE">
    SELECT SEQ_ADMIN.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO tbl_employee(id, name, age, create_time)
    VALUES(#{id}, #{name}, #{age}, #{createTime})
</insert>

order="BEFORE"表示SELECT SEQ_ADMIN.NEXTVAL FROM DUAL在 INSERT 語(yǔ)句執(zhí)行之前先對(duì)id進(jìn)行賦值。相反的,order還可以設(shè)置成AFTER,表示在INSERT語(yǔ)句執(zhí)行完后,再查詢一次slectKey標(biāo)簽中的語(yǔ)句,并賦值到Javabean的keyProperty的那個(gè)屬性上。

源碼分析

從源碼上來(lái)分析,在BaseStatementHandler里面有生成generateKeys,主要是執(zhí)行:

?
1
2
3
4
5
6
protected void generateKeys(Object parameter) { 
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); 
    ErrorContext.instance().store(); 
    keyGenerator.processBefore(executor, mappedStatement, null, parameter); 
    ErrorContext.instance().recall(); 
}

processBefore,表示執(zhí)行前處理,對(duì)應(yīng)mapper里面的selectKey中的order="BEFORE"屬性,先執(zhí)行查詢key,并設(shè)置到參數(shù)對(duì)象中。

在各個(gè)聲明處理器中,update有代碼:

?
1
2
KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); 
keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);

processAfter,表示執(zhí)行后處理,對(duì)應(yīng)mapper里面的selectKey中的order="AFTER"屬性,表示執(zhí)行后,再查一遍key,設(shè)置到參數(shù)對(duì)象中。

MyBatis insert語(yǔ)句key的生成和返回

1.使用數(shù)據(jù)庫(kù)自帶的生成器

?
1
2
3
<insert id="insertOne" keyProperty="userId"  useGeneratedKeys="true" >
        insert into user (user_name) values(#{userName})       
    </insert>

mybatis會(huì)獲取數(shù)據(jù)庫(kù)自動(dòng)生成的列,并把值賦值給傳入?yún)?shù)的userId屬性。

2.使用selectKey

?
1
2
3
4
5
6
<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="AFTER"  keyProperty="userId">
            SELECT LAST_INSERT_ID()       
        </selectKey>
    </insert>

插入語(yǔ)句執(zhí)行后selectKey語(yǔ)句,并把返回值塞進(jìn)傳入?yún)?shù)的userId屬性。

?
1
2
3
4
5
6
<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="BEFORE"  keyProperty="userId">
            SELECT LAST_INSERT_ID()       
        </selectKey>
    </insert>

先執(zhí)行selectKey,并把返回值賦值給傳入?yún)?shù)的userId屬性,然后執(zhí)行insert語(yǔ)句。

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

原文鏈接:https://segmentfault.com/a/1190000014699207

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 色综合久久天天综合 | 国产全部理论片线观看 | 国产大片51精品免费观看 | 日韩妹妹 | 国产91无毒不卡在线观看 | 成年人视频在线播放 | 婚前试爱免费看 | 99久久精品免费精品国产 | 男人女人日皮视频 | 精品suv一区二区三区 | 91高跟丝袜 | ak福利午夜在线观看 | 日韩一本在线 | 美女被狂揉下部羞羞动漫 | 日出水了特别黄的视频 | 日本xxxxxxxxx高清hd| 91制片厂制作果冻传媒123 | 美女gif跪趴式抽搐动态图 | 欧美亚洲国产另类在线观看 | 日韩欧免费一区二区三区 | 天天干天天日天天射天天操毛片 | 久久热这里面只有精品 | 嗯啊视频在线 | 隔壁的漂亮邻居hd中文 | 国产酒店自拍 | 九九免费高清在线观看视频 | 17个农民工婉莹第一部 | 日本wwxx护士 | 胸大的姑娘中文字幕视频 | 青草娱乐极品免费视频 | 亚洲欧美久久一区二区 | 亚洲国产欧美在线人成aaaa20 | 亚洲AV国产福利精品在现观看 | 99小视频 | 日韩精品视频在线播放 | 欧美添下面视频免费观看 | 日本不卡高清免费v日本 | 色婷婷狠狠 | 日韩欧美一级大片 | 好姑娘在线视频观看免费 | 丝瓜视频成人在线观看 |