MySQL 插入数据后返回自增id的方法

本文对比了在MySQL中获取刚插入记录的主键ID的不同方法,指出使用SELECT LAST_INSERT_ID()的优势,尤其是在高并发场景下。
不推荐方法:
INSERT INTO tim_test(`name`)values("tim");
SELECT max(id) from tim_test;
首先性能较低,且在高并发情况下,返回的值是不正确的。

推荐方法:
SELECT LAST_INSERT_ID();
因为LAST_INSERT_ID是基于Connection的,只要每个线程使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update生成的第一个record的ID,这个值不会被其它客户端(Connection)影响,保证了能够找回自己的ID而不影响其它客户端的活动,而且不需要加锁。

注意:
上面有句:insert tim_test(name)values("1"),("2"),("3");批量插入的语句,此时,执行SELECT返回的主键ID是本次连接的第一个插入的主键ID的值,因此是2,而不是一组列表

MyBatis中MySQL insert返回主键值的方法有两种:
1、insert按如下修改,主键值包装在了参数对象里边,通过user.getId()获取:
<insert id="insert" parameterType="user" keyProperty="id" useGeneratedKeys="true">
2、插入selectKey标签,获取同上
<insert id="insert" parameterType="com.mmall.pojo.ApprovalProcess" >
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into a (name, type)
    values(#{name}, #{type})
  </insert>
在使用 MySQL 数据库时,插入记录后获取自 ID 是常见的需求之一。MySQL 提供了多种方式来实现这一目标,以下是几种常用的方法。 ### 使用 `LAST_INSERT_ID()` 函数 `LAST_INSERT_ID()` 是 MySQL 提供的一个内置函数,用于返回最近一次插入操作中生成的自 ID 值。这个函数在一个连接会话中是线程安全的,因此可以放心使用而不用担心其他客户端的影响。 #### 示例 SQL 语句: ```sql INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com'); SELECT LAST_INSERT_ID(); ``` 这段 SQL 代码首先向 `users` 表中插入了一条记录,然后通过 `SELECT LAST_INSERT_ID();` 获取刚刚插入记录的自 ID [^2]。 ### 在 Java 中使用 `Statement.RETURN_GENERATED_KEYS` 如果你正在使用 Java 编写应用程序,并且希望通过 JDBC 操作 MySQL 数据库,可以通过设置 `Statement.RETURN_GENERATED_KEYS` 来获取自动生成的主键值。 #### 示例 Java 代码: ```java String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; try (PreparedStatement pstmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { pstmt.setString(1, "李四"); pstmt.setString(2, "lisi@example.com"); int affectedRows = pstmt.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Creating user failed, no rows affected."); } try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) { if (generatedKeys.next()) { System.out.println("Generated key: " + generatedKeys.getLong(1)); } else { throw new SQLException("Creating user failed, no ID obtained."); } } } ``` 在这个例子中,我们创建了一个带有 `Statement.RETURN_GENERATED_KEYS` 参数的 `PreparedStatement` 实例,执行完插入操作后,调用 `getGeneratedKeys()` 方法来获取结果集,进而得到自 ID [^3]。 ### 使用 MyBatis 框架 对于使用 MyBatis 框架的开发者来说,MyBatis 提供了 `<selectKey>` 元素来处理这种情况。可以在插入语句之后立即查询 `LAST_INSERT_ID()` 并将其映射到实体类的属性中。 #### 示例 XML 映射文件配置: ```xml <insert id="insertUser"> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> ``` 这里定义了一个名为 `insertUser` 的插入操作,在插入数据之后,会执行 `<selectKey>` 标签内的 SQL 查询,将最新的自 ID 赋值给 `User` 对象的 `id` 属性 [^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值