`
mefly
  • 浏览: 150583 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java 插入表记录后得到自增的id (转) (附2种方法代码)

阅读更多

原文

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获得新追加记录的主键值。

这个实现使用了StatementgetGeneratedKeys方法,
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值的3种方法

    在Java编程中,当我们在MySQL数据库中执行插入操作并希望获取新插入记录的自增ID时,有多种方法可以实现这一需求。以下是三种常见的方法,适用于不同的场景。 **方法一:使用PreparedStatement的RETURN_GENERATED_...

    java快速ID自增器

    总结来说,"Java快速ID自增器"是一种解决在Java应用中生成唯一自增ID的策略。它可以是基于Java内置的原子类、数据库序列、分布式ID生成算法,或者是结合数据库和Spring框架的高级应用场景。选择哪种方案取决于具体的...

    jdbc 插入记录并返回自增主键值

    总的来说,Java中的JDBC提供了一种灵活且强大的方式来处理数据库操作,包括插入记录并获取自增主键。正确地使用预编译的`PreparedStatement`可以提高代码的可读性和安全性,同时,通过设置`RETURN_GENERATED_KEYS`...

    mybatis获取自增ID

    在MyBatis中,可以通过在`&lt;insert&gt;`标签中添加`useGeneratedKeys="true"`和`keyProperty`属性来自动获取并填充插入语句后返回的自增ID值。 **示例代码:** ```xml &lt;insert id="insert" parameterType=...

    mysql的插入问题 怎么获得自动增长的ID

    2. **在删除记录后重新插入时ID的变化情况** 3. **不同存储引擎(如MyISAM与InnoDB)下自动增长ID的行为差异** 4. **通过Java程序使用JDBC获取刚插入记录的ID** #### 一、理解自动增长ID的工作原理 在MySQL中,...

    java获取新insert数据自增id的实现方法

    但是,这个过程中存在一个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁”,待获得...

    全局自增ID设计方案

    因此,如何设计一种高效的全局自增ID生成方案成为了一个重要的技术问题。 #### 方案调研与实践 **一、数据库自增ID方案** ##### Flicker方案解析 Flicker提出的解决方案是利用MySQL自身的auto_increment特性来...

    利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    本文将详细讲解如何在MyBatis中利用MySQL的自增主键功能,以便在插入新记录后获取生成的唯一ID。 首先,我们要明白MySQL中的自增主键。自增主键是一种特殊的字段类型(通常是`INT`),每当插入新的记录时,其值会...

    java使用jdbc插入信息时获取id1

    在Java编程中,当我们使用Java Database Connectivity (JDBC) API来执行插入操作时,有时我们需要获取新插入记录的自增主键值。标题"java使用jdbc插入信息时获取id1"指的是在Java程序中,通过JDBC执行SQL插入语句后...

    获取自增ID.docx

    本文详细介绍了在Java环境中如何获取自增ID的三种主要方法:XML配置方法、JDBC方法以及Hibernate方法。每种方法都有其适用场景,开发者可以根据项目的具体需求选择最适合的方案。无论是通过框架还是直接使用JDBC API...

    使用SQL Server 获取插入记录后的ID(自动编号)

    在SQL Server中,获取插入记录后的ID(通常指的是自动编号字段的值)是常见的操作,尤其是在需要关联新插入数据与其他表记录的情况下。本篇文章主要介绍了几种在SQL Server中获取自增ID的方法,针对SQL Server 2000...

    java自动生成ID号的方法

    在Java中,生成ID号的方法有很多种,例如自增序列、UUID、雪花算法等。 1. **UUID(Universally Unique Identifier)**:UUID是一个128位的数字,由时间戳、随机数和节点ID组成,几乎可以确保全局唯一性。在Java中...

    mybatis返回插入的id1

    在 MyBatis 框架中,当我们执行一个插入(insert)操作时,有时需要获取新插入记录的自增主键值,例如数据库中的唯一标识 ID。MyBatis 提供了方便的功能来实现这一需求,这主要涉及到 `keyProperty` 和 `...

    Mongodb自增id实现方法

    MongoDB 不提供内置的自增ID功能,但它允许通过一些策略来实现自增ID,就像在其他数据库系统中一样。本文将探讨如何在MongoDB中实现自增ID,以满足类似的需求。 首先,我们需要创建一个专门用于存储自增ID的集合,...

    MybatisPlus中插入数据获取主键值示例代码

    2. 通过`InsertReturnEntity`方法:如果你需要在插入后立即获取主键值,可以使用`insert`方法的返回值。`insert`方法会返回一个`InsertReturnEntity&lt;T&gt;`对象,其中包含了插入操作的信息,包括主键值。例如: ```...

    mybatis获取自增主键的值

    在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis如何实现这一功能。 1. **自增主键的原理**: 自增主键通常在关系型数据库如MySQL、...

    MySQL表自增id溢出的故障复盘解决

    - 如何在Java中获取MySQL插入记录的自增ID值。 - 如何处理自增id耗尽或超大问题的解决方案。 - 利用MySQL事务和锁机制确保并发插入的安全性。 总之,当面临MySQL自增id溢出问题时,应快速恢复业务并及时调整表结构...

    mysql取得自动增长的主键值

    - **标准方法:** 使用`INSERT`语句插入数据后,可以通过`LAST_INSERT_ID()`函数或`getGeneratedKeys()`方法来获取刚插入记录的自增ID。 - **示例代码:** 下面的Java示例展示了如何使用JDBC API来插入一条记录并...

    mybatis 获取mysql插入记录的自增长字段值.pdf

    这段代码定义了一个名为`insert`的SQL插入语句,其中`keyColumn`指定了主键列`id`,`keyProperty`指定了接收自增长ID的Java属性`id`,而`useGeneratedKeys="true"`启用了获取自增ID的功能。`parameterType`指定了...

Global site tag (gtag.js) - Google Analytics