問題定義:我們對某個數據執行了插入數據的操作之后,需要將主鍵返回,例如:訂單支付完成了,這時候我們要把待支付表中對應的數據移除
但是,如何才能准確快速的移除呢?我們希望能在添加的時候將主鍵得到,以便后面的移除操作更加方便。
1、自增主鍵情況下插入數據獲取自增主鍵值
mybatis為我們提供了一個方法,能夠插入數據時獲取自動生成的值,並且把取的值賦值給實體類的某一屬性
設置方法:
要求:主鍵必須是自增的
<insert id = "insert" useGeneratedKeys = "true" keyProperty = "id">
SQL語句
</insert>
useGeneratedKeys = true //是否返回自增主鍵值
keyProperty = "xxx" //將值賦給哪個屬性,這個屬性是方法參數中的
2、主鍵非自增的情況下獲取主鍵值
一般我們使用<selectKey>來實現。一個<insert>塊中只能有一個<selectKey>
下面我們了解一下selectKey中的屬性
resultType:這個我們就不用解釋了,返回類型
order:它有兩個取值:1、BEFORE在添加之前查詢 2、AFTER在添加之后查詢 //這兩個都是全大寫
keyProperty:將取值賦值給方法參數,如果方法參數是實體類,一般賦值給實體類的字段
keyColumn:對應表的列名
一個selectKey中必須要有 resultType,order,keyProperty
after示例:查詢最后一次添加的主鍵
<insert id = "insertEmp"> <selectKey resultType = "integer" order = "AFTER" keyProperty = "eid" >
select last_insert_id() //查詢最后一次添加的主鍵,mysql函數 </selectKey> insert into dept(id,deptname) values(#{id},#{deptname}) </insert>
before示例:假設Id不是自增長,我們希望在insert之前獲取mysql的UUID添加到數據表作為主鍵Id
<insert id = "insertDept"> <selectKey resultType = "string" order = "BEFORE" keyProperty = "id"> select uuid() as id </selectKey> insert into dept(id,name) values(#{id},#{name}) </insert>
3、keyColumn作用
問題定義:有時候我們希望keyProperty返回的個數超過1的時候,能不能插入數據的時候返回多個值
1、把selectKey的結果賦值給keyProperty的各個屬性
2、賦值規則:keyProperty和keColumn的列數相對應:1對1,2對2...
<insert id="xxx"> <selectKey resultType="com.entity.Dept" order="BEFORE" keyProperty="id,name" keyColumn="cid,cname"> select cid,cname from Category limit 1; </selectKey> insert into dept(id,name) values (#{id},#{name}) </insert> <!-- 代碼解釋:從Category中查詢出cid,cname 賦值在方法參數中,然后添加到dept表-->