在一種場景下需要剛剛插入數據的ID,如果數據少可以先看數據庫,記下ID,但數據很多,假設一萬個用戶並發,每個用戶都插入自己的ID,就很難記下來。
下面給定一個場景:
User user = new User("張三","123456",new Date());//此時user沒有id
userDao.insertUser(user);
sqlSession.commit();//此時數據已經插入到數據庫中,數據庫中有id,但user依然沒有id
System.out.println(user.getId());//沒有id
//則無法得知插入的數據是哪一條,如果后續程序需要此id,則出現bug!
在MyBatis中有兩種解決方案:
方案一:用last_insert_id() 函數,查詢剛插入的id
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into user(username,password,access) values (#{username},#{password},#{access})
</insert>
keyProperty="id" 拿到當前新數據的id給到方法的參數的那個屬性
resultType="int" 返回的id類型
order="AFTER" 在插入語句執行之后執行
select last_insert_id() 是在獲取當前事務的最近一次插入的數據的id 下圖是驗證:
方案二:useGenerateKeys 和 keyProperty屬性
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into user(username,password,access) values (#{username},#{password},#{access})
</insert>
//useGeneratedKeys="true" 是否使用了主鍵自增
兩個方案沒有本質的區別,推薦用第二種方案,第二種只是簡單而已。
下面可以來測試一下:
下圖可以看到id還沒有值
跟進:得到了id,並存入了User。