欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis?selectKey 如何返回新增用戶的id值

 更新時(shí)間:2022年01月23日 10:19:20   作者:_七七  
這篇文章主要介紹了Mybatis?selectKey 如何返回新增用戶的id值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mybatis selectKey返回新增用戶的id值

一、需求:新增用戶后,同時(shí)還要返回當(dāng)前新增用戶的id值

id是由數(shù)據(jù)庫(kù)的自動(dòng)增長(zhǎng)來(lái)實(shí)現(xiàn)的,所以就相當(dāng)于我們要在新增后將自動(dòng)增長(zhǎng)auto_increment的值返回。

?<insert id="saveUser" parameterType="USER">
??? ?<!-- 配置保存時(shí)獲取插入的id -->?
??? ?<selectKey keyColumn="id" keyProperty="id" resultType="int">?
??? ??? ?select last_insert_id() as id;?
??? ?</selectKey>
??? ?insert into user(username,birthday,sex,address)?
??? ?values(#{username},#{birthday},#{sex},#{address})?
?</insert>

通過(guò)LAST_INSERT_ID()獲得剛插入的自動(dòng)增長(zhǎng)的id的值

或者

SELECT @@IDENTITY AS id
?<insert id="saveUser" parameterType="USER">
?? ?insert into user(username,birthday,sex,address)?
??? ?values(#{username},#{birthday},#{sex},#{address})
?? ?<selectKey resultClass="long" keyProperty="id">
?? ??? ?SELECT @@IDENTITY AS id
?? ?</selectKey>
</insert>

這時(shí)也能返回新增那一條數(shù)據(jù)的id,這時(shí)的selectkey沒(méi)有要求寫(xiě)在前面以@@定義的變量都是系統(tǒng)的全局變量。

二、為什么要使用selectKey?

數(shù)據(jù)庫(kù)主鍵包括自增和非自增,有時(shí)候新增一條數(shù)據(jù)不僅僅知道成功就行了,后邊的邏輯可能還需要這個(gè)新增的主鍵,這時(shí)候再查詢(xún)數(shù)據(jù)庫(kù)就有點(diǎn)耗時(shí)耗力,我們可以采用selectKey來(lái)幫助我們獲取新增的主鍵。

三、屬性解析

  • keyProperty

結(jié)果集映射目標(biāo)類(lèi)的屬性;

若存在多個(gè),則使用逗號(hào)分隔;

  • keyColumn

目標(biāo)類(lèi)的屬性,映射結(jié)果集的列名;

若存在多個(gè),則使用逗號(hào)分割;

  • resultType

設(shè)置返回類(lèi)型;

可使用全類(lèi)名或者是別名;

  • order

設(shè)置此selectKey的執(zhí)行順序是早于sql語(yǔ)句,還是晚于sql語(yǔ)句;

候選值是BEFORE和AFTER;

  • statementType

設(shè)置sql語(yǔ)句的映射類(lèi)型;候選值有:

STATEMENT,PREPARED,CALLABLE;

  • databaseID

與ibatis全局配置中的databaseIdProvider標(biāo)簽呼應(yīng)

Mybatis selectKey 采坑筆記

一、現(xiàn)象描述

觀察某張表的數(shù)據(jù)時(shí),發(fā)現(xiàn)設(shè)置了自增屬性的AutoId,在插入數(shù)據(jù)后并不是自增的,而是數(shù)值跳躍著增加的。

二、問(wèn)題排查

在確認(rèn)AutoId的自增屬性設(shè)置沒(méi)有問(wèn)題后,開(kāi)始懷疑是不是insert語(yǔ)句的問(wèn)題,insert語(yǔ)句是MyBatis Generator自動(dòng)生成的,示例如下:

<insert id="insert" parameterType="com.xx.yy.datasource.domain.User" >
? <selectKey resultType="java.lang.Long" keyProperty="autoId" order="BEFORE" >
? SELECT LAST_INSERT_ID()
</selectKey>
? insert into User (AutoId, UserId, Mobile, Username, CreateTime, LastModifyTime)
? values (#{autoId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{mobile,jdbcType=VARCHAR},?
? ?#{username,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{lastModifyTime,jdbcType=TIMESTAMP}
? ?)
?</insert>

insert into 語(yǔ)句在語(yǔ)法上是沒(méi)有問(wèn)題的,那縮小排查范圍,就是selectKey的用法可能有問(wèn)題!

三、selectKey 用法再認(rèn)識(shí)

  • resultType:表示的是返回主鍵的類(lèi)型
  • keyProperty:對(duì)應(yīng)的domain 對(duì)象中需要被賦值的屬性,一般是主鍵
  • order:如果設(shè)置為 BEFORE,那么它會(huì)首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語(yǔ)句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語(yǔ)句,然后是 selectKey 元素

四、selectKey用法的坑

SelectKey需要注意order屬性,像MySQL一類(lèi)支持自動(dòng)增長(zhǎng)類(lèi)型的數(shù)據(jù)庫(kù)中,order需要設(shè)置為after才會(huì)取到正確的值,像Oracle這樣取序列的情況,需要設(shè)置為before。

在上面示例的insert用法中,就是order屬性設(shè)置成了BEFORE才導(dǎo)致自增屬性沒(méi)有生效。改成AFTER后,主鍵就開(kāi)始自增了。

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

相關(guān)文章

  • JavaCV實(shí)現(xiàn)獲取視頻每幀并保存

    JavaCV實(shí)現(xiàn)獲取視頻每幀并保存

    這篇文章主要為大家詳細(xì)介紹了JavaCV實(shí)現(xiàn)獲取視頻每幀并保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 深入講解Java的對(duì)象頭與對(duì)象組成

    深入講解Java的對(duì)象頭與對(duì)象組成

    由于Java面向?qū)ο蟮乃枷?在JVM中需要大量存儲(chǔ)對(duì)象,存儲(chǔ)時(shí)為了實(shí)現(xiàn)一些額外的功能,需要在對(duì)象中添加一些標(biāo)記字段用于增強(qiáng)對(duì)象功能,這些標(biāo)記字段組成了對(duì)象頭,下面這篇文章主要給大家介紹了關(guān)于Java對(duì)象頭與對(duì)象組成的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • java實(shí)現(xiàn)登錄之后抓取數(shù)據(jù)

    java實(shí)現(xiàn)登錄之后抓取數(shù)據(jù)

    這篇文章給大家分享了用JAVA實(shí)現(xiàn)在登陸以后抓取網(wǎng)站的數(shù)據(jù)的相關(guān)知識(shí),有興趣的朋友可以測(cè)試參考下。
    2018-07-07
  • springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)的步驟

    springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)的步驟

    這篇文章主要介紹了springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2021-01-01
  • java中的匿名內(nèi)部類(lèi)總結(jié)

    java中的匿名內(nèi)部類(lèi)總結(jié)

    這篇文章主要介紹了 java中的匿名內(nèi)部類(lèi)總結(jié)的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解

    圖的領(lǐng)接矩陣存儲(chǔ)方式是用兩個(gè)數(shù)組來(lái)表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組存儲(chǔ)圖中的邊或弧的信息。本文將為大家重點(diǎn)介紹一下數(shù)據(jù)結(jié)構(gòu)中的圖的鄰接矩陣,快來(lái)跟隨小編一起學(xué)習(xí)吧
    2021-11-11
  • Java中JMM與volatile關(guān)鍵字的學(xué)習(xí)

    Java中JMM與volatile關(guān)鍵字的學(xué)習(xí)

    這篇文章主要介紹了通過(guò)實(shí)例解析JMM和Volatile關(guān)鍵字的學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • JAVA復(fù)制數(shù)組和重置數(shù)組大小操作

    JAVA復(fù)制數(shù)組和重置數(shù)組大小操作

    這篇文章主要介紹了JAVA復(fù)制數(shù)組和重置數(shù)組大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Request與Session的存值取值操作

    Request與Session的存值取值操作

    這篇文章主要介紹了Request與Session的存值取值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot之@Aspect注解解讀

    SpringBoot之@Aspect注解解讀

    這篇文章主要介紹了SpringBoot之@Aspect注解解讀,AOP是面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù),而@Aspect 就是把一個(gè)類(lèi)定義為切面供容器讀取,需要的朋友可以參考下
    2024-01-01

最新評(píng)論