MyBatis中id回填的兩種方式


在一種場景下需要剛剛插入數據的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。

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM