mysql获取新增加id_mysql数据库新插入数据,需要立即获取最新插入的id

在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

3 useGeneratedKeys="true" keyProperty="id">

4 insert into vrv_application_list5 (6 appname,7 apptype,8 iconpath,9 filepath,10 filesize,11 pic112 )13 values14 (15 #{appname},16 #{apptype},17 #{iconpath},18 #{filepath},19 #{filesize},20 #{pic1}21 )22

23 keyProperty="id">

24 SELECT LAST_INSERT_ID()25

通过上面的方式,我就把最新插入的一条id,绑定返回到我的实体Application上了,前提是你的Application实体里一定有id这个属性。不然会报错。

当然如果你的parameterType=”java.util.Map” 的话,也是可以的,就不需要做什么多余的,会自动绑定到Map上 ,例如:

1

2

3 useGeneratedKeys="true" keyProperty="id">

4 insert into vrv_push_message_tab5 (6 type,7 title,8 message,9 create_id,10 create_time,11 force_open12 )13 values14 (15 #{type},16 #{title},17 #{message},18 #{create_id},19 now(),20 #{force_open}21 )22

23 keyProperty="id">

24 SELECT LAST_INSERT_ID()25

26

在java代码里只需要通过下面的方式获取就可以了

1 int id = addMessage(map);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java将数据添加到MySQL数据库,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Java开发环境和MySQL数据库,并且已经正确设置了相关的驱动程序。 2. 在Java代码中,使用JDBC(Java Database Connectivity)连接到MySQL数据库。您可以使用以下代码片段建立连接: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Main { public static void main(String[] args) { Connection connection = null; String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; try { connection = DriverManager.getConnection(url, username, password); System.out.println("成功连接到数据库!"); } catch (SQLException e) { System.out.println("连接数据库时出现错误:" + e.getMessage()); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { System.out.println("关闭数据库连接时出现错误:" + e.getMessage()); } } } } } ``` 请确保将`your_database_name`替换为您要连接的数据库名称,并将`your_username`和`your_password`替换为您的MySQL用户名和密码。 3. 连接成功后,您可以使用SQL INSERT语句向数据库中的表添加数据。例如,假设您有一个名为`users`的表,其中包含`id`和`name`列,您可以使用以下代码将数据插入到表中: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) { Connection connection = null; String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; try { connection = DriverManager.getConnection(url, username, password); System.out.println("成功连接到数据库!"); String insertQuery = "INSERT INTO users (id, name) VALUES (?, ?)"; PreparedStatement statement = connection.prepareStatement(insertQuery); // 设置参数 statement.setInt(1, 1); // 设置id statement.setString(2, "John"); // 设置name // 执行插入操作 int rowsInserted = statement.executeUpdate(); if (rowsInserted > 0) { System.out.println("成功插入数据到表中!"); } statement.close(); } catch (SQLException e) { System.out.println("连接数据库插入数据时出现错误:" + e.getMessage()); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { System.out.println("关闭数据库连接时出现错误:" + e.getMessage()); } } } } } ``` 这段代码将在`users`表中插入一行数据,其中`id`为1,`name`为"John"。 请确保将`your_database_name`、`your_username`和`your_password`替换为正确的值,并根据您的表结构进行相应的更改。 以上代码提供了一个基本的示例,您可以根据自己的需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值