mysql數據庫新插入數據,需要立即獲取最新插入的id


在MySQL中,使用auto_increment類型的id字段作為表的主鍵。通常的做法,是通過“select max(id) from tablename”的做法,但是顯然這種做法需要考慮並發的情況,需要在事務中對主表以“X鎖“,待獲得max(id)的值以后,再解鎖。  
 
這種做法需要的步驟比較多,有些麻煩,而且並發性也不好。有沒有更簡單的做法呢?答案之一是通過select LAST_INSERT_ID()這個操作。乍一看,它和select max(id)很象,但實際上它是線程安全的。也就是說它是基於 數據庫連接的,基於數據庫連接是什么意義呢?舉例說明:  
 
(1)、在連接1中向A表插入一條記錄,A表包含一個auto_increment類型的id。
 
(2)、在連接2中向A表再插入一條記錄。
 
(3)、結果:在連接1中執行select LAST_INSERT_ID()得到的結果和連接2中執行select LAST_INSERT_ID()的結果是不同的;而在兩個連接中執行select max(id)的結果是相同的。

對於mysql表中主鍵設置我自動增長,當我們插入一條記錄的時候,id會自動增長,而我們又想得到這個id ,用於另一張表的插入,我們怎樣獲取這個id呢?有的人通過max(id) 來獲取,這樣是不合理的,如果另外一個人恰巧在你執行select max(id)獲取之前,插入一條記錄,那么它的id就變了。而mysql又不存在鎖表的功能,所以我們可以通過LAST_INSERT_ID 來獲取。

對於mybatis

 1 <!-- 新增應用 -->
 2     <insert id="addApplication" parameterType="com.bxy.entity.application.Application"
 3         useGeneratedKeys="true" keyProperty="id">
 4         insert into vrv_application_list
 5         (
 6         appname,
 7         apptype,
 8         iconpath,
 9         filepath,
10         filesize,
11         pic1
12         )
13         values
14         (
15         #{appname},
16         #{apptype},
17         #{iconpath},
18         #{filepath},
19         #{filesize},
20         #{pic1}
21         )
22         <selectKey resultType="java.lang.Integer" order="AFTER"
23             keyProperty="id">
24             SELECT LAST_INSERT_ID()
25         </selectKey>

通過上面的方式,我就把最新插入的一條id,綁定返回到我的實體Application上了,前提是你的Application實體里一定有id這個屬性。不然會報錯。 
當然如果你的parameterType=”java.util.Map” 的話,也是可以的,就不需要做什么多余的,會自動綁定到Map上 ,例如:

 1 <!-- 添加消息 -->
 2     <insert id="addMessage" parameterType="java.util.Map"
 3         useGeneratedKeys="true" keyProperty="id">
 4         insert into vrv_push_message_tab
 5         (
 6         type,
 7         title,
 8         message,
 9         create_id,
10         create_time,
11         force_open
12         )
13         values
14         (
15         #{type},
16         #{title},
17         #{message},
18         #{create_id},
19         now(),
20         #{force_open}
21         )
22         <selectKey resultType="java.lang.Integer" order="AFTER"
23             keyProperty="id">
24             SELECT LAST_INSERT_ID()
25         </selectKey>
26     </insert>

在java代碼里只需要通過下面的方式獲取就可以了

1 int id = addMessage(map);

 


免責聲明!

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



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