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

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)文章

  • Mybatis SQL運(yùn)行流程源碼詳解

    Mybatis SQL運(yùn)行流程源碼詳解

    這篇文章主要介紹了Mybatis SQL運(yùn)行流程源碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中Cglib代理類重寫邏輯詳解

    Java中Cglib代理類重寫邏輯詳解

    這篇文章主要介紹了Java中Cglib代理類重寫邏輯詳解,代理類中只會(huì)維護(hù)NoOp這個(gè)回調(diào)屬性,并不會(huì)生成目標(biāo)類MyService中的noOp所對(duì)應(yīng)的方法,需要的朋友可以參考下
    2023-11-11
  • Idea 解決 Could not autowire. No beans of ''xxxx'' type found 的錯(cuò)誤提示

    Idea 解決 Could not autowire. No beans of ''xxxx'' type found

    這篇文章主要介紹了Idea 解決 Could not autowire. No beans of 'xxxx' type found 的錯(cuò)誤提示,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例

    Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java獲取最后插入MySQL記錄的自增ID值的3種方法

    Java獲取最后插入MySQL記錄的自增ID值的3種方法

    這篇文章介紹了Java獲取最后插入MySQL記錄的自增ID值的3種方法,有需要的朋友可以參考需要
    2013-08-08
  • 關(guān)于JSON解析中獲取不存在的key問題

    關(guān)于JSON解析中獲取不存在的key問題

    這篇文章主要介紹了關(guān)于JSON解析中獲取不存在的key問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • 如何使用java制作假數(shù)據(jù)接口

    如何使用java制作假數(shù)據(jù)接口

    這篇文章主要介紹了如何使用java制作假數(shù)據(jù)接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中HashMap和TreeMap的區(qū)別深入理解

    Java中HashMap和TreeMap的區(qū)別深入理解

    首先介紹一下什么是Map。在數(shù)組中我們是通過數(shù)組下標(biāo)來對(duì)其內(nèi)容索引的,而在Map中我們通過對(duì)象來對(duì)對(duì)象進(jìn)行索引,用來索引的對(duì)象叫做key,其對(duì)應(yīng)的對(duì)象叫做value
    2012-12-12
  • 詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)

    詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)

    這篇文章主要介紹了詳解Spring Kafka中關(guān)于Kafka的配置參數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08

最新評(píng)論

行唐县| 个旧市| 德惠市| 辉县市| 皮山县| 陈巴尔虎旗| 兴海县| 南陵县| 甘南县| 武山县| 酒泉市| 惠州市| 左云县| 岳阳县| 镇雄县| 密山市| 玉屏| 叶城县| 杭锦旗| 唐河县| 贺州市| 屏边| 达拉特旗| 民权县| 遂宁市| 清水县| 黑水县| 盐山县| 锡林浩特市| 保德县| 新龙县| 瑞安市| 城步| 昆明市| 吐鲁番市| 乌拉特前旗| 瓦房店市| 金阳县| 宿松县| 巩义市| 集贤县|