首頁 > 軟體

mybatis 獲取更新(update)記錄的id之<selectKey>用法說明

2022-05-20 19:07:27

獲取更新(update)記錄的id之<selectKey>

問題

用mybatis update 記錄,更新過後想要更新記錄的id 怎麼辦?

平常我門都是更新資料,用更新的條件再查詢一次,得到更新的記錄。這樣我門就進行了兩次資料庫操作,連結了兩次資料庫。增加了介面的處理事件,因為連結資料庫是很耗時的操作。

簡介

其實可以通過 mybatis 的 selectKey 標籤來解決這個問題。

selectKey 這個標籤大家基本上都用過,比如在插入資料的時候,返回插入資料的紀錄。如:

 <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
 </selectKey>
insert into  。。。。此處省略
  • resultType :返回的型別,為簡單型別。
  • order: 在insert into 語句執行後執行。
  • keyProperty : 語句執行結果的 返回目標屬性

SELECT LAST_INSERT_ID() 為查詢主體。

此處用法用法就是當 insert into 執行後 執行 selectKey 的內容將資料庫的最後一個id 查詢出來對映到傳入資料對像的ID 屬性。

解決 獲取update 紀錄的id

假設我門有個 bean 為people

public class People {
private Integer id 
private String name;
private String email;
...
}

現在我門寫一個更新語句,並將更新的紀錄的ID 返回出來。mybatis 語句如下:

通過 People 的name 去更新 People 的email,並獲取被更新紀錄的id。

    <update id="updateByUserName" parameterType="com.test.bean.People">
 <selectKey keyProperty='id' resultType='int' order='BEFORE'>
            SELECT
            (select id FROM people WHERE
             name = #{name})id
            from DUAL
  </selectKey>
        UPDATE people SET
      email=#{email}
        WHERE
       name =#{name}
  </update>

上述程式碼就是通過 selectKey 實現了 通過 People 的name 去更新 People 的email,並獲取被更新紀錄的id。

詳解

 <selectKey keyProperty='id' resultType='int' order='BEFORE'>

此處的 keyProperty=’id’ 是指將查詢出來的id 對映到傳入updateByUserName 的people 的id 。型別為int

因為可能查到name 以後可能會修改name 所以order=’BEFORE’ 要在執行update之前進行查詢,並把id返回出來。

SELECT
    (select id FROM people WHERE
    name = #{name})id
from DUAL 

此 SELECT 就是為了獲取 被更新的 people 的id 外邊包裝一個虛表查詢是當 name = #{name} 查詢不到紀錄時不會報空紀錄,會返回 null ,這個就很關鍵了。

當返回空記錄的時候 mybatis會報錯,說不能轉換成 int 型。

當返回null的時候就會轉換成int 的 0 。不會報錯,代表沒有查到。(是不是很機智?)

下邊的的更新語句就不說了…

   UPDATE people SET
      email=#{email}
        WHERE
       name =#{name}

<selectKey>標籤的含義

MyBatis 標籤

這個標籤主要用於Insert資料時不支援主鍵自動生成的問題

selectKey keyProperty=」m_Id」 order=」AFTER」 resultType=」int」>
select LAST_INSERT_ID()
selectKey>

SelectKey需要注意order屬性。像Mysql一類支援自動增長型別的資料庫中,order需要設定為after才會取到正確的值。

像Oracle這樣取序列的情況,需要設定為before,否則會報錯

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com