亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年09月24日 10:31:17   作者:liaosilzu2007  
這篇文章主要介紹了MyBatis insert語句返回主鍵和selectKey標(biāo)簽方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

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

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

1.主鍵自增的情況

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

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

<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 語句執(zhí)行之前先對(duì)id進(jìn)行賦值。相反的,order還可以設(shè)置成AFTER,表示在INSERT語句執(zhí)行完后,再查詢一次slectKey標(biāo)簽中的語句,并賦值到Javabean的keyProperty的那個(gè)屬性上。

源碼分析

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

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有代碼:

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語句key的生成和返回

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

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

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

2.使用selectKey

<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="AFTER"  keyProperty="userId">
            SELECT LAST_INSERT_ID()        
        </selectKey>
    </insert>

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

<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語句。

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

相關(guān)文章

  • 使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能

    使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能

    這篇文章主要介紹了使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 一文搞懂Java克隆及深拷貝與淺拷貝的區(qū)別

    一文搞懂Java克隆及深拷貝與淺拷貝的區(qū)別

    在編程中,通常通過實(shí)現(xiàn)Cloneable接口和重寫clone方法來實(shí)現(xiàn)對(duì)象的克隆,然而,需要注意的是克隆操作可能存在深拷貝和淺拷貝的區(qū)別,在使用時(shí)需要根據(jù)實(shí)際需求選擇合適的克隆方式,本文就給大家詳細(xì)講講什么是克隆以及深拷貝與淺拷貝的區(qū)別,需要的朋友可以參考下
    2023-08-08
  • 小伙熬夜用Java重現(xiàn)經(jīng)典超級(jí)馬里奧代碼實(shí)例

    小伙熬夜用Java重現(xiàn)經(jīng)典超級(jí)馬里奧代碼實(shí)例

    這篇文章主要介紹了Java重現(xiàn)經(jīng)典超級(jí)馬里奧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring?IoC容器Bean作用域的singleton與prototype使用配置

    Spring?IoC容器Bean作用域的singleton與prototype使用配置

    這篇文章主要為大家介紹了Spring?IoC容器Bean作用域的singleton與prototype使用配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • java實(shí)現(xiàn)CSV 字段分割

    java實(shí)現(xiàn)CSV 字段分割

    這篇文章主要介紹了java實(shí)現(xiàn)CSV 字段分割的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    本文深入探討了SpringBoot中的事件驅(qū)動(dòng)架構(gòu),特別是通過Spring事件機(jī)制實(shí)現(xiàn)組件解耦和系統(tǒng)擴(kuò)展性增強(qiáng),介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 基于線程、并發(fā)的基本概念(詳解)

    基于線程、并發(fā)的基本概念(詳解)

    下面小編就為大家?guī)硪黄诰€程、并發(fā)的基本概念(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java設(shè)計(jì)模式中組合模式應(yīng)用詳解

    Java設(shè)計(jì)模式中組合模式應(yīng)用詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問具有一致性。本文將通過示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下
    2022-11-11
  • Java 多線程并發(fā)編程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 多線程并發(fā)編程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java 多線程并發(fā)編程的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05

最新評(píng)論