色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

詳解mysql插入數(shù)據(jù)后返回自增ID的七種方法

瀏覽:2日期:2023-10-07 12:27:14
引言

mysql 和 oracle 插入的時候有一個很大的區(qū)別是:

oracle 支持序列做 id; mysql 本身有一個列可以做自增長字段。

mysql 在插入一條數(shù)據(jù)后,如何能獲得到這個自增 id 的值呢?

一:使用 last_insert_id()

SELECT LAST_INSERT_ID();

1. 每次 mysql 的 query 操作在 mysql 服務(wù)器上可以理解為一次“原子”操作, 寫操作常常需要鎖表, 這里的鎖表是 mysql 應(yīng)用服務(wù)器鎖表不是我們的應(yīng)用程序鎖表。

2. 因?yàn)?LAST_INSERT_ID 是基于 Connection 的,只要每個線程都使用獨(dú)立的 Connection 對象,LAST_INSERT_ID 函數(shù) 將返回該 Connection 對 AUTO_INCREMENT列 最新的 insert or update* 作生成的第一個 record 的ID。這個值不能被其它客戶端(Connection)影響,保證了你能夠找回自己的 ID 而不用擔(dān)心其它客戶端的活動,而且不需要加鎖。使用單INSERT 語句插入多條記錄, LAST_INSERT_ID 返回一個列表。 3. LAST_INSERT_ID 是與 table 無關(guān)的,如果向表 a 插入數(shù)據(jù)后,再向表 b 插入數(shù)據(jù),LAST_INSERT_ID 會改變。

二:使用 max(id)

如果不是頻繁的插入我們也可以使用這種方法來獲取返回的id值

select max(id) from user;

這個方法的缺點(diǎn)是不適合高并發(fā)。如果同時插入的時候返回的值可能不準(zhǔn)確。

三:創(chuàng)建一個存儲過程

在存儲過程中調(diào)用先插入再獲取最大值的操作。

DELIMITER $$DROP PROCEDURE IF EXISTS `test` $$CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name varchar(100),out oid int)BEGIN insert into user(loginname) values(name); select max(id) from user into oid; select oid;END $$DELIMITER ;call test(’gg’,@id);四:使用 @@identity

select @@IDENTITY

@@identity 是表示的是最近一次向具有 identity 屬性(即自增列)的表插入數(shù)據(jù)時對應(yīng)的自增列的值,是系統(tǒng)定 義的全局變量。一般系統(tǒng)定義的全局變量都是以@@開頭,用戶自定義變量以@開頭。比如有個表 A,它的自增列是 id,當(dāng)向 A 表插入一行數(shù)據(jù)后,如果插入數(shù)據(jù) 后自增列的值自動增加至 101,則通過select @@identity得到的值就是 101。使用@@identity的前提是在進(jìn)行 insert 操作后,執(zhí)行 select @@identity 的時候連接沒有關(guān)閉,否則得到的將是 NULL 值。

五:是使用 getGeneratedKeys()

Connection conn = ;Serializable ret = null;PreparedStatement state = .;ResultSet rs=null;try { state.executeUpdate(); rs = state.getGeneratedKeys(); if (rs.next()) { ret = (Serializable) rs.getObject(1); } } catch (SQLException e) {}return ret;

總結(jié):在 mysql 中做完插入之后獲取 id 在高并發(fā)的時候是很容易出錯的。另外 last_insert_id 雖然是基于 session 的但是不知道為什么沒有測試成功。

六:selectkey:

其實(shí)在 ibtias 框架里使用 selectkey 這個節(jié)點(diǎn),并設(shè)置 insert 返回值的類型為 integer,就可以返回這個 id 值。

SelectKey 在Mybatis中是為了解決 Insert 數(shù)據(jù)時不支持主鍵自動生成的問題,他可以很隨意的設(shè)置生成主鍵的方式。

不管 SelectKey 有多好,盡量不要遇到這種情況吧,畢竟很麻煩。

詳解mysql插入數(shù)據(jù)后返回自增ID的七種方法

SelectKey 需要注意 order 屬性:

Mysql 一類支持自動增長類型的數(shù)據(jù)庫中,order 需要設(shè)置為 after 才會取到正確的值。 Oracle 這樣取序列的情況,需要設(shè)置為 before,否則會報錯。

xml 的例子:

<insert parameterType='map'> insert into table1 (name) values (#{name}) <selectKey resultType='java.lang.Integer' keyProperty='id'> SELECT LAST_INSERT_ID() AS id </selectKey> </insert>

上面 xml 的傳入?yún)?shù)是 map,selectKey 會將結(jié)果放到入?yún)?shù) map 中。用 POJO 的情況一樣,但是有一點(diǎn)需要注意的是,keyProperty 對應(yīng)的字段在 POJO 中必須有相應(yīng)的 setter 方法,setter 的參數(shù)類型還要一致,否則會報錯。

注解的形式:

@Insert('insert into table2 (name) values(#{name})') @SelectKey(statement='call identity()', keyProperty='nameId', before=false, resultType=int.class) int insertTable2(Name name); 方法七:使用<insert 中的useGeneratedKeys 和 keyProperty 兩個屬性

1.在Mybatis Mapper文件中添加屬性 “useGeneratedKeys”和“keyProperty”,其中 keyProperty 是 Java 對象的屬性名,而不是表格的字段名。

<insert parameterType='Spares' useGeneratedKeys='true' keyProperty='id'> insert into system(name) values(#{name}) </insert>

2.Mybatis 執(zhí)行完插入語句后,自動將自增長值賦值給對象 systemBean 的屬性id。因此,可通過 systemBean 對應(yīng)的 getter 方法獲取!

int count = systemService.insert(systemBean); int id = systemBean.getId(); //獲取到的即為新插入記錄的ID

【注意事項(xiàng)】

1.Mybatis Mapper 文件中,“useGeneratedKeys” 和 “keyProperty” 必須添加,而且 keyProperty 一定得和 java 對象的屬性名稱一直,而不是表格的字段名。

2. java Dao中的 Insert 方法,傳遞的參數(shù)必須為 java 對象,也就是 Bean,而不能是某個參數(shù)。

到此這篇關(guān)于詳解mysql插入數(shù)據(jù)后返回自增ID的七種方法的文章就介紹到這了,更多相關(guān)mysql插入返回自增ID內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 国产亚洲视频在线播放大全 | 国产a一级毛片午夜剧院 | 亚洲国产毛片 | 一区二区三区四区产品乱码伦 | 国产成人高清视频在线观看免费97 | 国产婷婷成人久久av免费高清 | 加勒比heyzo 加勒比久久综合 | 黄色美女一级片 | 国产国语高清在线视频二区 | 国产高清成人mv在线观看 | 免费一级毛片在线播放欧美 | 国内精品小视频 | 欧美激情伦妇在线观看 | 粉嫩jk制服美女啪啪 | 在线观看免费精品国产 | 国产a∨一区二区三区香蕉小说 | 久久99国产精品一区二区 | 成年大片免费视频播放手机不卡 | 亚洲欧美日韩久久精品第一区 | 爱爱客影院在线影院gf发现 | 久草视频在线看 | 深夜福利国产福利视频 | 久久青草免费免费91线频观看 | 成人国产在线24小时播放视频 | 一区二区三区四区视频在线观看 | 最新精品亚洲成a人在线观看 | 国产视频自拍一区 | 亚洲第一狼人区 | free性丰满白嫩白嫩的hd | 国产精品欧美激情在线播放 | 欧美日韩免费播放一区二区 | 在线播放精品一区二区啪视频 | 国产成人看片免费视频观看 | 欧美日韩一区二区三区久久 | 成年人在线视频免费观看 | 美女和男人免费网站视频 | 久久精品全国免费观看国产 | 德国女人一级毛片免费 | 一级毛片一级毛片一级毛片 | 亚洲国内自拍 | 国产日产欧美a级毛片 |