有時候插入記錄以後須要使用到插入記錄的主鍵,一般是再查詢一次來獲取主鍵,可是MyBatis插入記錄時能夠設置成返回主鍵id,簡化操做,方法大體有兩種。java
對應實體類:數據庫
1 public class User { 2 private int userId; 3 private String userName; 4 private int userAge; 5 }
對應DAO類:app
1 public interface UserMapper { 2 int save(User user); 3 }
方法1、使用useGeneratedKeys屬性。spa
1 <insert id="save" useGeneratedKeys="true" keyProperty="userId" keyColumn="id"> 2 INSERT INTO user (id, name, age) 3 VALUES (UUID(), #{userName}, #{userAge}) 4 </insert>
該方法只支持主鍵非自增的狀況。只須要在插入的方法標籤上,添加useGeneratedKeys、keyProperty、keyColumn三個屬性。code
useGeneratedKeys:true,表示容許獲取自增主鍵。對象
keyProperty:表示實體對象中主鍵的屬性名稱。blog
keyColumn:表示數據庫中主鍵的字段名稱。get
使用的時候,就正常調用這個方法就好,會將返回的主鍵存入參數User實體的userId屬性中(詳見最後說明)。class
方法2、使用selectKey標籤。配置
(1)主鍵自增的狀況。
1 <insert id="save"> 2 <selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer"> 3 SELECT LAST_INSERT_ID() 4 </selectKey> 5 INSERT INTO user (name, age) 6 VALUES (#{userName}, #{userAge}) 7 </insert>
(2)主鍵非自增的狀況。
1 <insert id="save"> 2 <selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String"> 3 SELECT UUID() 4 </selectKey> 5 INSERT INTO user (id, name, age) 6 VALUES (#{userId}, #{userName}, #{userAge}) 7 </insert>
在插入的方法標籤裏,加入selectKey標籤,對應屬性說明以下:
keyProperty:表示實體對象中主鍵的屬性名稱。
order:表示該標籤執行的前後,值分爲BEFORE、AFTER。主鍵自增的狀況下使用AFTER,在插入操做後獲取到主鍵;主鍵非自增的狀況下使用BEFORE,在插入操做前獲取到主鍵。
resultType:主鍵的類型。
使用的時候,就正常調用這個方法就好,會將返回的主鍵存入參數User實體的userId屬性中(詳見最後說明)。
3、總結
方法一寫起來比較簡潔,可是不支持主鍵非自增的狀況。方法二則相對靈活,能夠根據主鍵是否自增進行對應的配置。且在主鍵非自增狀況下,主鍵是能夠根據本身需求進行調整的,即SELECT UUID()這句,能夠調整以下:
1 SELECT upper(replace(UUID(), '-', ''))
PS:save方法的返回值是插入所影響的行數,並非主鍵;主鍵的返回方式,兩種方法是同樣的,都是經過傳入參數User實體的userId屬性來獲取,以下:
1 public void save() { 2 User user = new User(); 3 user.setUserName("peter"); 4 user.setUserAge(20); 5 int rs = userMapper.save(user); 6 System.out.println("插入主鍵爲:" + user.getUserId()); 7 System.out.println("插入影響行數:" + rs); 8 }