mybatis?獲取更新(update)記錄的id之<selectKey>用法說明
獲取更新(update)記錄的id之<selectKey>
問題
用mybatis update 記錄,更新過后想要更新記錄的id 怎么辦?
平常我門都是更新數(shù)據(jù),用更新的條件再查詢一次,得到更新的記錄。這樣我門就進行了兩次數(shù)據(jù)庫操作,鏈接了兩次數(shù)據(jù)庫。增加了接口的處理事件,因為鏈接數(shù)據(jù)庫是很耗時的操作。
簡介
其實可以通過 mybatis 的 selectKey 標簽來解決這個問題。
selectKey 這個標簽大家基本上都用過,比如在插入數(shù)據(jù)的時候,返回插入數(shù)據(jù)的紀錄。如:
?<selectKey resultType="int" order="AFTER" keyProperty="id"> ? ? ? ? ? ? SELECT LAST_INSERT_ID() ?</selectKey> insert into ?。。。。此處省略
resultType
:返回的類型,為簡單類型。order
: 在insert into 語句執(zhí)行后執(zhí)行。keyProperty
: 語句執(zhí)行結(jié)果的 返回目標屬性
SELECT LAST_INSERT_ID() 為查詢主體。
此處用法用法就是當 insert into 執(zhí)行后 執(zhí)行 selectKey 的內(nèi)容將數(shù)據(jù)庫的最后一個id 查詢出來映射到傳入數(shù)據(jù)對像的ID 屬性。
解決 獲取update 紀錄的id
假設(shè)我門有個 bean 為people
public class People { private Integer id? private String name; private String email; ... }
現(xiàn)在我門寫一個更新語句,并將更新的紀錄的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 實現(xiàn)了 通過 People 的name 去更新 People 的email,并獲取被更新紀錄的id。
詳解
?<selectKey keyProperty='id' resultType='int' order='BEFORE'>
此處的 keyProperty=’id’ 是指將查詢出來的id 映射到傳入updateByUserName 的people 的id 。類型為int
因為可能查到name 以后可能會修改name 所以order=’BEFORE’ 要在執(zhí)行update之前進行查詢,并把id返回出來。
SELECT ? ? (select id FROM people WHERE ? ? name = #{name})id from DUAL?
此 SELECT 就是為了獲取 被更新的 people 的id 外邊包裝一個虛表查詢是當 name = #{name} 查詢不到紀錄時不會報空紀錄,會返回 null ,這個就很關(guān)鍵了。
當返回空記錄的時候 mybatis會報錯,說不能轉(zhuǎn)換成 int 型。
當返回null的時候就會轉(zhuǎn)換成int 的 0 。不會報錯,代表沒有查到。(是不是很機智?)
下邊的的更新語句就不說了…
? ?UPDATE people SET ? ? ? email=#{email} ? ? ? ? WHERE ? ? ? ?name =#{name}
<selectKey>標簽的含義
MyBatis 標簽
這個標簽主要用于Insert數(shù)據(jù)時不支持主鍵自動生成的問題
selectKey keyProperty=”m_Id” order=”AFTER” resultType=”int”> select LAST_INSERT_ID() selectKey>
SelectKey需要注意order屬性。像Mysql一類支持自動增長類型的數(shù)據(jù)庫中,order需要設(shè)置為after才會取到正確的值。
像Oracle這樣取序列的情況,需要設(shè)置為before,否則會報錯
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java SpringBoot啟動指定profile的8種方式詳解
這篇文章主要介紹了spring boot 如何指定profile啟動的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09