原文
http://www.sthelse.com/2010/07/java-to-insert-in-the-main-table-record-id-from-the-table-for-the-main-table-as-a-foreign-key.html#comment-2264
在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。
这里面有个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?
答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:
1、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。
2、在连接2中向A表再插入一条记录。
3、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。
其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同的会话。
注:使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!
当然,我们还可以使用另一种更加便捷的方法:在JDBC追加记录后,使用API获得新追加记录的主键值。
这个实现使用了Statement的getGeneratedKeys方法,
当Statement追加了一条记录后,可以直接调用getGeneratedKeys方法获得新追加记录的key。
测试程序如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class GetGenerateKey {
public static void main(String[] args) throws Exception {
create();
}
public static void create()throws Exception {
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
Statement st = conn.createStatement();
String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)";
st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = st.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
System.out.println ("生成记录的key为 :" + id);
}
st.close();
conn.close();
}
}
程序运行结果:
生成记录的key为 :9
数据库的记录为:
1 |
+----+----------+------------+-------+ |
2 |
| id | name | birthday | money | |
3 |
+----+----------+------------+-------+ |
4 |
| 9 | beck | 1949-10-01 | 60 | |
5 |
+----+----------+------------+-------+ |
总结:这个API方法提供的好处就是不用重新再执行一次查询获得新记录的key值。减少了工作量和服务器的负担。
注意点,在执行executeUpdate方法的时候,要指定返回生成key的选项。
===========================================================
2种方法的java 代码
// 用这种方法能得到插入自增的id 很好用
PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
for (int i = 0; i < pars.length; i++) {
pstmt.setObject(i+1, pars[i]);
}
pstmt.executeUpdate();
long autoIncKeyFromApi = -1;
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
}
return autoIncKeyFromApi;
qRunner.update(conn,sql.toString(),pars);
Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1));
分享到:
相关推荐
在Java编程中,当我们在MySQL数据库中执行插入操作并希望获取新插入记录的自增ID时,有多种方法可以实现这一需求。以下是三种常见的方法,适用于不同的场景。 **方法一:使用PreparedStatement的RETURN_GENERATED_...
总结来说,"Java快速ID自增器"是一种解决在Java应用中生成唯一自增ID的策略。它可以是基于Java内置的原子类、数据库序列、分布式ID生成算法,或者是结合数据库和Spring框架的高级应用场景。选择哪种方案取决于具体的...
总的来说,Java中的JDBC提供了一种灵活且强大的方式来处理数据库操作,包括插入记录并获取自增主键。正确地使用预编译的`PreparedStatement`可以提高代码的可读性和安全性,同时,通过设置`RETURN_GENERATED_KEYS`...
在MyBatis中,可以通过在`<insert>`标签中添加`useGeneratedKeys="true"`和`keyProperty`属性来自动获取并填充插入语句后返回的自增ID值。 **示例代码:** ```xml <insert id="insert" parameterType=...
2. **在删除记录后重新插入时ID的变化情况** 3. **不同存储引擎(如MyISAM与InnoDB)下自动增长ID的行为差异** 4. **通过Java程序使用JDBC获取刚插入记录的ID** #### 一、理解自动增长ID的工作原理 在MySQL中,...
但是,这个过程中存在一个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁”,待获得...
因此,如何设计一种高效的全局自增ID生成方案成为了一个重要的技术问题。 #### 方案调研与实践 **一、数据库自增ID方案** ##### Flicker方案解析 Flicker提出的解决方案是利用MySQL自身的auto_increment特性来...
本文将详细讲解如何在MyBatis中利用MySQL的自增主键功能,以便在插入新记录后获取生成的唯一ID。 首先,我们要明白MySQL中的自增主键。自增主键是一种特殊的字段类型(通常是`INT`),每当插入新的记录时,其值会...
在Java编程中,当我们使用Java Database Connectivity (JDBC) API来执行插入操作时,有时我们需要获取新插入记录的自增主键值。标题"java使用jdbc插入信息时获取id1"指的是在Java程序中,通过JDBC执行SQL插入语句后...
本文详细介绍了在Java环境中如何获取自增ID的三种主要方法:XML配置方法、JDBC方法以及Hibernate方法。每种方法都有其适用场景,开发者可以根据项目的具体需求选择最适合的方案。无论是通过框架还是直接使用JDBC API...
在SQL Server中,获取插入记录后的ID(通常指的是自动编号字段的值)是常见的操作,尤其是在需要关联新插入数据与其他表记录的情况下。本篇文章主要介绍了几种在SQL Server中获取自增ID的方法,针对SQL Server 2000...
在Java中,生成ID号的方法有很多种,例如自增序列、UUID、雪花算法等。 1. **UUID(Universally Unique Identifier)**:UUID是一个128位的数字,由时间戳、随机数和节点ID组成,几乎可以确保全局唯一性。在Java中...
在 MyBatis 框架中,当我们执行一个插入(insert)操作时,有时需要获取新插入记录的自增主键值,例如数据库中的唯一标识 ID。MyBatis 提供了方便的功能来实现这一需求,这主要涉及到 `keyProperty` 和 `...
MongoDB 不提供内置的自增ID功能,但它允许通过一些策略来实现自增ID,就像在其他数据库系统中一样。本文将探讨如何在MongoDB中实现自增ID,以满足类似的需求。 首先,我们需要创建一个专门用于存储自增ID的集合,...
2. 通过`InsertReturnEntity`方法:如果你需要在插入后立即获取主键值,可以使用`insert`方法的返回值。`insert`方法会返回一个`InsertReturnEntity<T>`对象,其中包含了插入操作的信息,包括主键值。例如: ```...
在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis如何实现这一功能。 1. **自增主键的原理**: 自增主键通常在关系型数据库如MySQL、...
- 如何在Java中获取MySQL插入记录的自增ID值。 - 如何处理自增id耗尽或超大问题的解决方案。 - 利用MySQL事务和锁机制确保并发插入的安全性。 总之,当面临MySQL自增id溢出问题时,应快速恢复业务并及时调整表结构...
- **标准方法:** 使用`INSERT`语句插入数据后,可以通过`LAST_INSERT_ID()`函数或`getGeneratedKeys()`方法来获取刚插入记录的自增ID。 - **示例代码:** 下面的Java示例展示了如何使用JDBC API来插入一条记录并...
这段代码定义了一个名为`insert`的SQL插入语句,其中`keyColumn`指定了主键列`id`,`keyProperty`指定了接收自增长ID的Java属性`id`,而`useGeneratedKeys="true"`启用了获取自增ID的功能。`parameterType`指定了...