MYSQL, mybatis 如何使用自增主键

Java中使用MyBatis获取数据库自增主键值的方法 本文还有配套的精品资源,点击获取 简介:主键自增是数据库设计的关键,自动生成唯一标识符。在使用MyBatis框架进行Java开发时,需要设置特定属性以获取由数据库(如MySQL、SQLite、PostgreSQL)自动生成的主键值。通过在MyBatis映射文件中设置 useGeneratedKeys="true" 和 keyProperty="prop... 阅读详情

通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键。本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值:

  1. 通过JDBC2.0提供的insertRow()方式
  2. 通过JDBC3.0提供的getGeneratedKeys()方式
  3. 通过SQL select LAST_INSERT_ID()函数
  4. 通过SQL @@IDENTITY 变量
  5. mybatis如何操作自增key.

1. 通过JDBC2.0提供的insertRow()方式

自jdbc2.0以来,可以通过下面的方式执行。

Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  // 创建Statement
                                java.sql.ResultSet.CONCUR_UPDATABLE);
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(                                                // 创建demo表
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    rs = stmt.executeQuery("SELECT priKey, dataField "                 // 检索数据
       + "FROM autoIncTutorial");
    rs.moveToInsertRow();                                              // 移动游标到待插入行(未创建的伪记录)
    rs.updateString("dataField", "AUTO INCREMENT here?");              // 修改内容
    rs.insertRow();                                                    // 插入记录
    rs.last();                                                         // 移动游标到最后一行
    int autoIncKeyFromRS = rs.getInt("priKey");                        // 获取刚插入记录的主键preKey
    rs.close();
    rs = null;
    System.out.println("Key returned for inserted row: "
        + autoIncKeyFromRS);
}  finally {
    // rs,stmt的close()清理
}

 

优点:早期较为通用的做法 

缺点:需要操作ResultSet的游标,代码冗长。

2. 通过JDBC3.0提供的getGeneratedKeys()方式

Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_UPDATABLE);  
    // ...
    // 省略若干行(如上例般创建demo表)
    // ...
    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')",
            Statement.RETURN_GENERATED_KEYS);                      // 向驱动指明需要自动获取generatedKeys!
    int autoIncKeyFromApi = -1;
    rs = stmt.getGeneratedKeys();                                  // 获取自增主键!
    if (rs.next()) {
        autoIncKeyFromApi = rs.getInt(1);
    }  else {
        // throw an exception from here
    } 
    rs.close();
    rs = null;
    System.out.println("Key returned from getGeneratedKeys():"
        + autoIncKeyFromApi);
}  finally { ... }

 

这种方式只需要2个步骤:

 

1. 在executeUpdate时激活自动获取key;

2.调用Statement的getGeneratedKeys()接口
优点:

1. 操作方便,代码简洁

2. jdbc3.0的标准

3. 效率高,因为没有额外访问数据库

 

这里补充下,

a.在jdbc3.0之前,每个jdbc driver的实现都有自己获取自增主键的接口。在mysql jdbc2.0的driver org.gjt.mm.mysql中,getGeneratedKeys()函数就实现在org.gjt.mm.mysql.jdbc2.Staement.getGeneratedKeys()中。这样直接引用的话,移植性会有很大影响。JDBC3.0通过标准的getGeneratedKeys很好的弥补了这点。

b.关于getGeneratedKeys(),官网还有更详细解释:OracleJdbcGuide

3. 通过SQL select LAST_INSERT_ID()

 

Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement();
    // ...
    // 省略建表
    // ...
    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')");
    int autoIncKeyFromFunc = -1;
    rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");             // 通过额外查询获取generatedKey
    if (rs.next()) {
        autoIncKeyFromFunc = rs.getInt(1);
    }  else {
        // throw an exception from here
    } 
    rs.close();
    System.out.println("Key returned from " +
                       "'SELECT LAST_INSERT_ID()': " +
                       autoIncKeyFromFunc);
}  finally {...}

这种方式没什么好说的,就是额外查询一次函数LAST_INSERT_ID().

优点:简单方便

缺点:相对JDBC3.0的getGeneratedKeys(),需要额外多一次数据库查询。

 

补充:

1. 这个函数,在mysql5.5手册的定义是:“returns a BIGINT (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.”。文档点此

2. 这个函数,在connection维度上是“线程安全的”。就是说,每个mysql连接会有个独立保存LAST_INSERT_ID()的结果,并且只会被当前连接最近一次insert操作所更新。也就是2个连接同时执行insert语句时候,分别调用的LAST_INSERT_ID()不会相互覆盖。举个栗子:连接A插入表后LAST_INSERT_ID()返回100,连接B插入表后LAST_INSERT_ID()返回101,但是连接A重复执行LAST_INSERT_ID()的时候,始终返回100,而不是101。这个可以通过监控mysql连接数和执行结果来验证,这里不详述实验过程。

3. 在上面那点的基础上,如果在同一个连接的前提下同时执行insert,那可能2次操作的返回值会相互覆盖。因为LAST_INSERT_ID()的隔离程度是连接级别的。这点,getGeneratedKeys()是可以做的更好,因为getGeneratedKeys()是statement级别的。同个connection的多次statement,getGeneratedKeys()是不会被相互覆盖。

4. 通过SQL SELECT @@IDENTITY

这个方式和LAST_INSERT_ID()效果是一样的。官网文档如此表述:“This variable is a synonym for the last_insert_id variable. It exists for compatibility with other database systems. You can read its value with SELECT @@identity, and set it using SET identity.” 文档点此

 

重要补充:

无论是SELECT LAST_INSERT_ID()还是SELECT @@IDENTITY,对于一条insert语句插入多条记录,永远只会返回第一条插入记录的generatedKey.如:

INSERT INTO t VALUES
    -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
LAST_INSERT_ID(), @@IDENTITY都只会返回'Mary'所在的那条记录的generatedKey

5. 在mybatis里面如何获得自增key?

  例子如下:首先设置 useGeneratedKeys="true",然后指定自增key的id, keyProperty="id"

<!--    public void addEmp(Employee employee);-->
<!--paramterType可以省略
获取自增主键的值:
    mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGeneratedKeys();
    useGeneratedKeys="true";使用自增主键获取主键值策略
    keyPeoperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
-->
<insert id="addEmp" parameterType="com.mybatis.bean.Employee"
    useGeneratedKeys="true" keyProperty="id">
    insert into tbl_employee(last_name,email,gender)
    values(#{lastName},#{email},#{gender})
</insert>

使用例子:如何得到返回的id 

//测试添加
Employee employee = new Employee(null, "jerry4",null, "1");
mapper.addEmp(employee);
System.out.println(employee.getId());

小结

所以,最好还是通过JDBC3 提供的getGeneratedKeys()函数来获取insert记录的主键。不但简单,而且效率高。

 

在mybatis中,就有相关设置: 

<insert id="save" parameterType="MappedObject" useGeneratedKeys="true" keyProperty="id">
</insert>

可参考mybatis文档:sqlmap-xml

http://blog.youkuaiyun.com/ultrani/article/details/9351573

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL) 本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。 阅读详情

相关推荐

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

Mybatis设置主键自增

一、 mysql数据库的主键自增(int类型的主键) 1 创建一个表,设置表的id(此id必须是int类型),设置为auto_increment自增类型 2 映射文件配置如下: <insert id="insertUser" parameterType="com.dahuici.zyb.entity.User" useGeneratedKeys="true" keyProperty="id"> insert into user(name,sex,age) values(#{na

Airuiliya520的博客 9960

华为昇腾服务器npu中安装paddle,pytorch等环境,训练代码迁移适配等问题记录

参考文档:https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/npu/README_cn.md

qq_29220369的博客 4112

MyBatis基本用法-主键自增

MyBatis基本用法-主键自增

qq_41177135的博客 4169

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程)

一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu

学习随笔 9万+

Mybatis 获取自增主键

一、MySQL 获取自增主键 若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后,将这个值封装给 JavaBean 的哪个属性。 <insert id="addEmp" databaseId="mysql" parameterType="employee" useGeneratedKeys="

dingd1234的博客 9756

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

解决oracle及Mysql数据库在mybatis中主键自增问题(创建序列等方法)2021

mybatis解决主键自增问题 最近,小编刚实习,说一下在工作中遇到的问题,其中就有mybatis解决主键自增的问题 在oracle数据库中 1、创建序列 在oracle中没有像mysql一样可以使用 AUTO_INCREMENT id int(11) NOT NULL AUTO_INCREMENT 所以需要用到序列,首先在数据库中新建序列 创建序列 CREATE SEQUENCE DHDC_PS_ID_SEQ INCREMENT BY 1 - 每次加几个

dhaixuexi_1的博客 1502

MacBook Air老本重装系统

手里的这个本子型号是A1466,cpu i5,4G内存,硬盘ssd 120G。 重装系统可以在原系统上升级到更新版本,或者用U盘安装。 先确定,这个本子可以安装什么系统。 最权威的信息当然是apple的官网,地址:https://support.apple.com/zh-cn/HT211683 在“检查兼容性”中,可以依次检查每个系统兼容的硬件型号。Mojave是A1466能安装的最高版本。 确认兼容性后,下一步就是下载安装文件。还是这个页面稍下面一点可以找到。 这里告诉用户文件可以在什

bigwood99的博客 2万+

搞定ESD(七):静电放电问题典型案例分析(二)

静电放电噪声耦合的方式主要是:传导耦合与辐射耦合,辐射耦合主要以磁场耦合、 电场耦合为主要形式。电场耦合发生的主要条件是:静电放电高频在参考地平面寄生电感中产生电平波动,平行于参考地平面上的较长信号布线就很容易通过分布电容发生电场耦合。根据高速信号回流路径的特性可知,其回流路径是贴近信号布线下方,或者信号两侧,若信号回流路径跨分割后,环路面积会随之增大;信号环路面积大从EMI角度看其空间辐射更强,从EMS角度看则更容易耦合外部噪声干扰(雷击浪涌、EFT、ESD、RS)。

记得诚 2801

mybatis mysql自增主键_mybatis 自增主键配置

mybatis 自增主键配置mybatis自增主键配置(?)mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。不返回自增主键值如果考虑到插入数据的主键不作为其他表插入数据的外键使用,...

weixin_29092787的博客 1231

Modbus通信从入门到精通_2_Modbus TCP通信详解及仿真(搭建ModbusTCP仿真环境:创建虚拟PLC并进行ModbusTCP通讯;寄存器与PLC中映射关系;适合理解如何编写上位机)

LocalPort”是PLC的端口,最终的设置如下图所示:(相关的设置都可以查看帮助文档)P#DB1.DBX0.0 BYTE28是以指针形式表示的DB1的DBX0.0开始(在使用的西门子Modbus tcp的程序块中设置的“MB_HOLD_REG”输出寄存器),其有28个字节(28个字节对应14个寄存器),4001是第一个寄存器,往后数14个即可。在上面的基础上,增加一个“DB1”的“组对象”,同时将“MW0”的组对象禁止(双击组对象,“Active”取消勾选),启动之后发现无法连接。

分享学习成长历程,Winter is coming! 1万+

mysql + mybatis 实现主键自增

一, mybatis 对应的特定表 (Customer) 的配置 1, 代码 &lt;insert id="insertSelective" parameterType="Customer" keyProperty="customerid" useGeneratedKeys="true" &gt; insert into im_customer &lt;tri...

呵呵喝何何 3990

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

mybatis配置id自增mysql_mybatis 自增主键配置

mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是OracleSequece 和MySQL自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。不返回自增主键值如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。oracleSequence 配置...

weixin_39838302的博客 2275

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

mybatis mysql自增主键_mybatis mysql 主键自增加怎么配置

mybatis自增主键配置:mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。1、不返回自增主键值:如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。Oracle Sequence 配置TEST_USERSEQ_...

weixin_31842715的博客 1103

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

mybatis返回MySQL自增主键

此博客内容参考 芋道源码 的博客。帮博主贴个地址:http://www.iocoder.cn/ 获取MySQL的自增主键有以下两种方式 // 方式一,使用 useGeneratedKeys + keyProperty 属性 <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id"&g...

Let_me_tell_you的博客 829

Mybatis 获取自增主键值(Mysql,Oracle)

本文转自:https://blog.youkuaiyun.com/yamadeee/article/details/83997122 在某些场景下,我们需要使用mybatis返回生成的主键值。Mybatis在insert和update标签中就提供了这种功能。 <insert id=”indetifyId” useGeneratedKeys=”true” keyProperty=”id” keyC...

代码君的博客 1526

mybatis+mysql insert时返回自增主键

mybatis+mysql insert时返回自增主键 mysqlmybatisinsert返回自增主键  使用mybatis执行insert操作时,需要返回自增主键  网上清一色的答案,  useGeneratedKeys设置为true  keyProperty设置为实体类主键字段,如下:  Xml代码    &lt;insert id="add" parameterType="Enti...

Jaylon Wang的专栏 1万+

MyBatis中mysql 插入数据并返回自增主键和非自增主键的方式

mysql 插入数据并返回自增主键和非自增主键的方式 MyBatis的insert操作,如何在插入数据的同时返回主键呢?分为两种情况,一种情况是该主键是自增主键,另一种情况是该主键非自增,接下来对两种情况详细解释。 mysql支持自增主键,而Oracle不支持自增主键,在JDBC中可以使用getGeneratedKeys()方法获得自增主键。 获取自增主键的值 CompetitionMapper.java中的接口 int createCompetition(Competition competition

suitianshuang 3590

mybatis plus如何让id自增_mybatis mysql 主键自增加怎么配置

展开全部mybatis自增主键配置:mybatis进行插入操作时,如果表的主键是自增的,针对不同的32313133353236313431303231363533e78988e69d8331333337396330数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。1、不返回自增主键值:如果考虑到插...

weixin_39779467的博客 2914

mysql mybatis 自增_MyBatis基础篇之如何获取自增主键的值(MySQL)

一、前言使用MyBatis进行插入操作的时候,如果表的主键是自增的,针对不同的数据库相应的操作也不同。我们在实际开发中无非是两种情况比较多,一种是Oracle sequence,另外一种就是MySQL自增主键。本文主要应用于MySQL数据库,针对返回自增主键和不返回自增主键两种情况通过案例说明。二、案例♦搭建工程MyBatisMySQLIDDemo,具体搭建步骤可以参考♦新建一张数据库表t_use...

weixin_39610468的博客 385

mysql自增主键和mybatis自增主键不一致问题(已解决):

mysql自增主键和mybatis自增主键不一致问题(已解决): 在插入数据前,先进行查询主键 <insert id="insertSelective"> <selectKey keyProperty="zxywzj" resultType="Integer"> select LAST_INSERT_ID() </selectKey> insert into tb_name (<include refid="i

qq_43473129的博客 1416

探索: mybatis在mysql中自增主键是如何赋值

今写代码的时候突然好奇.mybatis在mysql中自增主键是如何赋值的? mybatis在mysql自增主键使用: useGeneratedKeys=true 表示将自增主键返回给keyProperty="id",参考 https://www.cnblogs.com/nuccch/p/9069644.html 验证代码: &lt;!-- mysql新增 : mysql自增主键使用:...

hhj13978064496的博客 1208

MyBatis实现MySQL和Oracle的主键自增设置

MyBatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在MyBatis中对于自增主键的配置。 1、MySQL主键自增设置 方法一: <insert id="insert" parameterType="Person" useGeneratedKeys="true" key...

riemann_的博客 1491

mybatis mysql 主键自增

1.mybitis xml配置 keyProperty="userId" useGeneratedKeys="true"> keyProperty是Java对象的属性 useGeneratedKeys 取值范围true|false 默认值是:false。 含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。

u010682199的专栏 1457
上一篇: nginx worker_connections exceed 1024 修改
下一篇: A股芯片股龙头股,
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值