一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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
主站蜘蛛池模板: 四虎精品免费视频 | 欧美日韩视频在线第一区二区三区 | 日韩一区二区三区四区五区 | 国内精品哆啪啪 | 国产日本久久久久久久久婷婷 | 午夜在线观看免费完整直播网页 | 嫩草影院久久99 | 女人张开腿让男人桶爽 | 996热视频| 大团圆免费阅读全文 | 欧美a一片xxxx片与善交 | 国产传媒天美果冻 | 扒开女人下面 | 日韩精品高清自在线 | 四虎影视e456fcom四虎影视 | voyeur 中国女厕 亚洲女厕 | 久久婷婷电影网 | jj视频免费看 | 99国产热| videos欧美肥婆 | 东北疯狂xxxxbbbb中国 | 国产一区二区视频在线播放 | 91看片淫黄大片.在线天堂 | 天堂男人在线 | 热久久亚洲 | 好大~好爽~再进去一点 | 干妞网免费视频 | 无人区乱码区1卡2卡三卡在线 | 天天综合五月天 | tobu8在线观看免费高清 | 国产一区二区三区在线看片 | 天天做天天爱天天爽综合网 | 91麻豆精东果冻天美传媒老狼 | 久久91精品国产91 | 亚洲久草 | 免费看男女做好爽好硬视频 | 国产精品微拍 | poren18美女| 好奇害死猫在线观看 | 俺去俺来也在线www色官网 | 黑白配高清hd在线视频 |