1.介紹
我們在項目開發(fā)中往往會有這樣的應用場景赊窥,對于某些特殊需求:得到剛剛插入數(shù)據(jù)的主鍵值爆惧,以便對剛剛生成的數(shù)據(jù)做處理。
那么锨能,如何得到剛插入的主鍵值呢扯再?有兩種大的方向:
第一是在數(shù)據(jù)庫獲得通過自帶方法。在數(shù)據(jù)插入之后輸入“select @@indentity”通常需要結合存儲過程址遇,比較復雜熄阻。
第二是在后臺插入時獲得。
這里我們主要說后臺剛插入時得到主鍵值倔约。
2.MyBatis獲取自動生成的主鍵值
對于上面說的后臺插入獲取值秃殉,會分為兩種情況:支持主鍵自增數(shù)據(jù)庫和不支持主鍵自增。
(1)對于支持自動生成主鍵的數(shù)據(jù)庫浸剩,如Mysql钾军、sqlServer,可以通過 Mybatis元素useGeneratedKeys返回當前插入數(shù)據(jù)主鍵值到輸入類中绢要。
具體應用
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id"
parameterType="com.atguigu.domain.IdentityTest">
insert into identity_test(name)
values(#{name,jdbcType=VARCHAR})
</insert>
當執(zhí)行此條插入語句以后吏恭,實體類IdentityTest中的Id會被當前插入數(shù)據(jù)的主鍵自動填充。
(2)對于不支持自動生成主鍵的數(shù)據(jù)庫Oracle袖扛、DB2等砸泛,可以用元素selectKey 回寫當前插入數(shù)據(jù)主鍵值到輸入類中(同時生成一個自定義的隨機主鍵)十籍。
具體應用
<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>
當執(zhí)行此條插入語句以后,實體類IdentityTest中的Id也會被當前插入數(shù)據(jù)的主鍵自動填充唇礁。
selectKey 元素描述:
屬性 | 描述 |
---|---|
keyProperty | selectKey 語句結果應該被設置的目標屬性勾栗。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表盏筐。 |
keyColumn | 匹配屬性的返回結果集中的列名稱围俘。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表琢融。 |
resultType | 結果的類型界牡。MyBatis 通常可以推算出來漾抬,但是為了更加確定寫上也不會有什么問題宿亡。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串纳令。如果希望作用于多個生成的列挽荠,則可以使用一個包含期望屬性的 Object 或一個 Map。 |
order | 這可以被設置為 BEFORE 或 AFTER平绩。如果設置為 BEFORE圈匆,那么它會首先選擇主鍵,設置 keyProperty 然后執(zhí)行插入語句捏雌。如果設置為 AFTER跃赚,那么先執(zhí)行插入語句,然后是 selectKey 元素 - 這和像 Oracle 的數(shù)據(jù)庫相似性湿,在插入語句內部可能有嵌入索引調用纬傲。 |
statementType | MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型窘奏,分別代表 PreparedStatement 和 CallableStatement 類型嘹锁。 |