mysql數據庫新插入數據,需要立即獲取最新插入的id
阿新 • • 發佈:2018-07-08
線程安全 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" 23keyProperty="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