激情久久久_欧美视频区_成人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
主站蜘蛛池模板: aa级黄色片| 久久精品欧美电影 | 九九久久视频 | 久久艳片 | 香蕉在线看 | 午夜视频大全 | 精品一区二区三区免费 | 精品一区二区在线播放 | 91九色丨porny丨国产jk | 国产精品亚洲精品日韩已方 | 91看片www| 亚州综合一区 | 中文字幕在线播放视频 | 一级毛片免费一级 | 国产精品久久久久久久久久大牛 | 免费网站看毛片 | 国产男女爽爽爽爽爽免费视频 | 日韩av在线播放一区 | 91久久99热青草国产 | 久久99亚洲精品久久99果 | 欧美视频国产精品 | 精品久久久久久久久久久aⅴ | www.69色 | 污黄视频在线观看 | 毛片大全在线观看 | 91精品国啪老师啪 | 久久久久国产精品久久久久 | 日本在线观看高清完整版 | 午夜精品久久久久久毛片 | 欧美福利视频一区二区三区 | 国产麻豆交换夫妇 | 国产精品热 | 久久精品av | av懂色| 成年人在线免费 | 成人激情视频网站 | 日韩黄在线观看 | 蜜桃视频在线播放 | 看片一区二区三区 | 天天操天天插 | 免费毛片随便看 |