电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

oracle 支持序列做 id; mysql 本身有一個(gè)列可以做自增長(zhǎng)字段。

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

一:使用 last_insert_id()

SELECT LAST_INSERT_ID();

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

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

二:使用 max(id)

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

select max(id) from user;

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

三:創(chuàng)建一個(gè)存儲(chǔ)過(guò)程

在存儲(chǔ)過(guò)程中調(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ù)時(shí)對(duì)應(yīng)的自增列的值,是系統(tǒng)定 義的全局變量。一般系統(tǒng)定義的全局變量都是以@@開(kāi)頭,用戶自定義變量以@開(kāi)頭。比如有個(gè)表 A,它的自增列是 id,當(dāng)向 A 表插入一行數(shù)據(jù)后,如果插入數(shù)據(jù) 后自增列的值自動(dòng)增加至 101,則通過(guò)select @@identity得到的值就是 101。使用@@identity的前提是在進(jìn)行 insert 操作后,執(zhí)行 select @@identity 的時(shí)候連接沒(méi)有關(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ā)的時(shí)候是很容易出錯(cuò)的。另外 last_insert_id 雖然是基于 session 的但是不知道為什么沒(méi)有測(cè)試成功。

六:selectkey:

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

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

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

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

SelectKey 需要注意 order 屬性:

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

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 會(huì)將結(jié)果放到入?yún)?shù) map 中。用 POJO 的情況一樣,但是有一點(diǎn)需要注意的是,keyProperty 對(duì)應(yīng)的字段在 POJO 中必須有相應(yīng)的 setter 方法,setter 的參數(shù)類型還要一致,否則會(huì)報(bào)錯(cuò)。

注解的形式:

@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 兩個(gè)屬性

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

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

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

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

【注意事項(xiàng)】

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

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

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

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
主站蜘蛛池模板: 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 胃口福饺子加盟官网_新鲜现包饺子云吞加盟 - 【胃口福唯一官网】 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 | 天然鹅卵石滤料厂家-锰砂滤料-石英砂滤料-巩义东枫净水 | 健康管理师报考条件,考试时间,报名入口—首页 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 聚合氯化铝价格_聚合氯化铝厂家_pac絮凝剂-唐达净水官网 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 直流大电流电源,燃料电池检漏设备-上海政飞 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 深圳成考网-深圳成人高考报名网| 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 |