1. 程式人生 > >mysql數據庫新插入數據,需要立即獲取最新插入的id

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

線程安全 ica tar 主表 主鍵 database ger bat pty

在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);

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