国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - MyBatis insert語句返回主鍵和selectKey標簽方式

MyBatis insert語句返回主鍵和selectKey標簽方式

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

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

insert語句返回主鍵和selectKey標簽

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

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

1.主鍵自增的情況

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

?
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":使用自動生成的主鍵
  • keyProperty:指定主鍵是(javaBean的)哪個屬性。

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獲取主鍵

對于Oracle數據庫,當要用到自增字段時,需要用到Sequence,假設我們現在已經創建了一個名字為SEQ_ADMIN的 Sequence,在MyBatis中的映射文件中可以結合selectKey標簽使用。

?
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 語句執行之前先對id進行賦值。相反的,order還可以設置成AFTER,表示在INSERT語句執行完后,再查詢一次slectKey標簽中的語句,并賦值到Javabean的keyProperty的那個屬性上。

源碼分析

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

?
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,表示執行前處理,對應mapper里面的selectKey中的order="BEFORE"屬性,先執行查詢key,并設置到參數對象中。

在各個聲明處理器中,update有代碼:

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

processAfter,表示執行后處理,對應mapper里面的selectKey中的order="AFTER"屬性,表示執行后,再查一遍key,設置到參數對象中。

MyBatis insert語句key的生成和返回

1.使用數據庫自帶的生成器

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

mybatis會獲取數據庫自動生成的列,并把值賦值給傳入參數的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>

插入語句執行后selectKey語句,并把返回值塞進傳入參數的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>

先執行selectKey,并把返回值賦值給傳入參數的userId屬性,然后執行insert語句。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

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

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

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

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

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

    Java使用SAX解析xml的示例

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

    大行者10067412021-08-30
主站蜘蛛池模板: 久久久久久久国产精品 | 亚洲区视频 | 日韩在线免费观看视频 | av激情在线 | 成人精品动漫一区二区三区 | www.久久.com| 久久精品电影 | 国产精品亚洲一区 | 高清一区二区在线观看 | www日本视频 | 综合色视频 | 污污的免费网站 | 久久久久久亚洲一区二区三区蜜臀 | 国产亚洲一区二区三区 | 精品国产一区二区三区久久久 | 爱爱av网站| 日韩国产精品一区二区三区 | 日韩高清av | av亚洲在线 | 成人国产精品久久久 | 欧美人成在线 | 久久国产精品一区二区 | 日韩午夜激情视频 | 美女视频黄色 | 五月婷婷综合激情网 | 久久亚洲精品国产精品紫薇 | 一区二区国产精品 | 久久久久久久久久国产 | 亚洲精品久久久久久国产精华液 | 免费精品 | 亚洲网站在线 | 成人网av | 国内精品视频一区 | 欧美 亚洲 一区 | 国产精品久久久久久久久久免费动 | 国产精品国产成人国产三级 | 成人午夜在线播放 | 日韩成人在线网 | 国产精彩视频 | 久久综合九九 | 可以在线观看的av网站 |