介紹
對於某些特殊需求:得到剛剛插入數據的主鍵值,以便對剛剛生成的數據做處理
那么,如何得到剛插入的主鍵值呢有兩種大的方向。
第一是在數據庫獲得通過自帶方法。在數據插入之后輸入“select @@indentity”通常需要結合存儲過程,比較復雜。
第二是在后台插入時獲得。這里我們主要說后台剛插入時得到主鍵值。
詳細
后台數據插入時獲得主鍵值也分為兩種情況:支持主鍵自增數據庫和不支持主鍵自增。
一、對於支持自動生成主鍵的數據庫,如Mysql、sqlServer,可以通過 Mybatis元素useGeneratedKeys返回當前插入數據主鍵值到輸入類中。
具體應用
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" parameterType="com.kq.domain.IdentityTest"> insert into identity_test(name) values(#{name,jdbcType=VARCHAR}) </insert>
- 1
- 2
- 3
- 4
- 5
當執行此條插入語句以后,實體類IdentityTest中的Id會被當前插入數據的主鍵自動填充。
二、對於不支持自動生成主鍵的數據庫。Oracle、DB2等,可以用元素selectKey 回當前插入數據主鍵值到輸入類中。(同時生成一個自定義的隨機主鍵)
具體應用
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" parameterType="com.kq.domain.IdentityTest"> <selectKey keyProperty="id" resultType="String" order="BEFORE"> SELECT REPLACE(UUID(),'-','') </selectKey> insert into identity_test(name) values(#{name,jdbcType=VARCHAR}) </insert>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
當執行此條插入語句以后,實體類IdentityTest中的Id也會被當前插入數據的主鍵自動填充。
補充
selectKey 元素描述:
屬性 | 描述 |
---|---|
keyProperty | selectKey 語句結果應該被設置的目標屬性。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
keyColumn | 匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
resultType | 結果的類型。MyBatis 通常可以推算出來,但是為了更加確定寫上也不會有什么問題。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串。如果希望作用於多個生成的列,則可以使用一個包含期望屬性的 Object 或一個 Map。 |
order | 這可以被設置為 BEFORE 或 AFTER。如果設置為 BEFORE,那么它會首先選擇主鍵,設置 keyProperty 然后執行插入語句。如果設置為 AFTER,那么先執行插入語句,然后是 selectKey 元素 - 這和像 Oracle 的數據庫相似,在插入語句內部可能有嵌入索引調用。 |
statementType | MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型,分別代表 PreparedStatement 和 CallableStatement 類型。 |