通过Java实现获取表的自增主键值

 更新时间:2023年06月15日 15:20:59   作者:从未止步..  
这篇文章主要为大家详细介绍了如何通过Java实现获取表的自增主键值,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下

获取自增主键

在 Java 程序中,使用 JDBC 插入记录到 MySQL 数据库时,可以通过以下步骤获取自增主键的值:

第一步:在 PreparedStatement 对象中添加 Statement.RETURN_GENERATED_KEYS 常量作为参数,表示希望获取自动生成的主键

代码如下所示:

PreparedStatement stmt = connection.prepareStatement("INSERT INTO user VALUES (?,?,?)", Statement.RETURN_GENERATED_KEYS);
stmt.setInt(1, 2);
stmt.setString(2, "李四");
stmt.setString(3, "11000");
stmt.executeUpdate();

第二步: 调用 PreparedStatement 对象的 getGeneratedKeys() 方法获取 ResultSet,getGeneratedKeys() 是 JDBC 中的一个方法,它用于获取执行 SQL 语句后所生成的键,例如主键值、自增长键等。

该方法返回一个 ResultSet 对象,其中包含了所生成的键的信息,源码如下所示:

需要注意的是,在某些情况下,执行 SQL 操作并不一定能够返回生成的键,这可能是因为数据库不支持生成键,或者 SQL 语句中没有生成键的选项。

代码如下所示:

ResultSet rs = stmt.getGeneratedKeys();

第三步:从 ResultSet 中获取自动生成的主键值

(rs.next()) {
            int id = rs.getInt(1);
            System.out.println("Inserted with ID: " + id);
 }

注意,ResultSet 中的第一个列就是自动生成的主键列,使用 getInt(1) 或 getLong(1) 方法获取该列的值。

完整代码示例:

package Test;
import java.sql.*;
public class myjdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost:3306/创建的数据库名";
        String username="root";
        String password="你的数据库密码";
        Connection connection= DriverManager.getConnection(url,username,password);
        //添加常量参数
        PreparedStatement stmt = connection.prepareStatement("INSERT INTO 你的数据表名 VALUES (?,?,?)", Statement.RETURN_GENERATED_KEYS);
        stmt.setInt(1, 2);
        stmt.setString(2, "李四");
        stmt.setString(3, "11000");
        stmt.executeUpdate();
        //获取ResultSet
        ResultSet rs = stmt.getGeneratedKeys();
        //获得常量值
        if (rs.next()) {
            int id = rs.getInt(1);
            System.out.println("Inserted with ID: " + id);
        }
    }
}

获取自增主键值的前提条件是:在数据表中必须存在自增主键。如果不存在自增主键,那么将无法获取自增主键的值。

最后补充一下什么是生成键?

生成键

数据库中的生成键(Generated Key)是指在插入一条新记录时,由数据库自动生成的主键值或唯一标识符。

它通常与自增长列(Auto Increment Column)或序列(Sequence)相关联,用于确保插入的新记录具有唯一的标识符。

常见的生成键类型包括:

1. 自增长键(Auto Increment Key):在每次插入数据时,自动递增的唯一整数值。在 MySQL 中使用 `AUTO_INCREMENT` 关键字实现自增长键。

2. 序列(Sequence):由一个计数器提供唯一整数值的对象。在 Oracle、PostgreSQL 和 SQL Server 等数据库中支持序列。

3. UUID 键(Universally Unique Identifier Key):全球唯一标识符,使用随机数生成。在 MySQL 中使用 `UUID()` 函数实现 UUID 键。

在使用 JDBC 操作数据库时,可以通过 ResultSet 的方法 getGeneratedKeys() 获取生成键的值。

如果新的记录具有自动生成键,或者原始记录的所有生成键已返回,则此方法返回一个 ResultSet 对象,其中包含代表生成键的值的一列,通常情况下,这个值是一个整数,可以通过 getInt(1) 或者 getLong(1) 方法获取主键值。

判断数据库是否支持生成键的方法

在 JDBC 中,我们可以通过 DatabaseMetaData 获取数据库的元数据信息,进而判断该数据库是否支持生成键。

具体实现步骤如下:

第一步:

//获取当前数据库连接的 DatabaseMetaData 对象。
DatabaseMetaData metaData = connection.getMetaData();

可以通过 getDatabaseProductName() 方法获取数据库的名称,再结合不同的数据库驱动的实现方式,来判断该数据库是否支持生成键。

例如,在 MySQL 数据库中,可以使用 supportsGetGeneratedKeys() 方法来判断是否支持生成键。如果该方法的返回值为 true,则说明该数据库支持生成键。

完整代码如下:

package Test;
import java.sql.*;
public class myjdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost:3306/wjr";
        String username="root";
        String password="112899";
        Connection connection= DriverManager.getConnection(url,username,password);
        DatabaseMetaData metaData = connection.getMetaData();
        boolean supportsGeneratedKeys = metaData.supportsGetGeneratedKeys();
        if (supportsGeneratedKeys) {
            System.out.println("该数据库支持生成键");
        } else {
            System.out.println("该数据库不支持生成键");
        }
    }
}

到此这篇关于通过Java实现获取表的自增主键值的文章就介绍到这了,更多相关Java表的自增主键值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中@ConfigurationProperties的用法解析

    Spring中@ConfigurationProperties的用法解析

    这篇文章主要介绍了Spring中@ConfigurationProperties的用法解析,传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java config的注解,特别是spring boot,基本都是清一色的java config,需要的朋友可以参考下
    2023-11-11
  • IDEA 卡住buid(编译)不动的解决办法

    IDEA 卡住buid(编译)不动的解决办法

    这篇文章主要介绍了IDEA 卡住buid(编译)不动的解决办法(适用于maven和gradle)及定位思路,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java设计模式:组合模式

    Java设计模式:组合模式

    这篇文章主要介绍了快速理解Java设计模式中的组合模式,具有一定参考价值,需要的朋友可以了解下,希望能够给你带来帮助
    2021-09-09
  • SpringMVC拦截器快速掌握下篇

    SpringMVC拦截器快速掌握下篇

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2022-08-08
  • 深入理解ContextClassLoader加载器

    深入理解ContextClassLoader加载器

    这篇文章主要介绍了深入理解ContextClassLoader加载器,Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题,需要的朋友可以参考下
    2023-10-10
  • Java VisualVM监控远程JVM(详解)

    Java VisualVM监控远程JVM(详解)

    下面小编就为大家带来一篇Java VisualVM监控远程JVM(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 详解SpringBoot如何正确解析日期格式

    详解SpringBoot如何正确解析日期格式

    这篇文章主要介绍了SpringBoot如何正确解析日期格式,文中给出了两种解决方案,通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • Java System.exit()退出程序方式

    Java System.exit()退出程序方式

    这篇文章主要介绍了Java System.exit()退出程序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot中实现Druid前端监控界面自动登录功能

    SpringBoot中实现Druid前端监控界面自动登录功能

    这篇文章主要介绍了SpringBoot中实现Druid前端监控界面自动登录功能,需要的朋友可以参考下
    2024-08-08
  • response对象的使用(实例讲解)

    response对象的使用(实例讲解)

    下面小编就为大家带来一篇response对象的使用(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论