如何通过java程序获取表的自增主键值?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 如何通过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("该数据库不支持生成键");
        }
    }
}

将唯一的UUID标识符设置为对象的id:

package com.wjr;
import lombok.Data;
import java.util.UUID;  
@Data
public class User {
    private UUID id;
     private String name;
     private String password;
     public User(String name,String password){
         this.name=name;
         this.password=password;
         this.id = UUID.randomUUID();//调用UUID的方法获取唯一的标识符
     }
    public static void main(String[] args) {
        User user=new User("张三","123456");
        System.out.println(user);
     }
}

输出如下所示:

User(id=2175c6b2-fd24-4f8a-8187-dd566f3ded26, name=张三, password=123456)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
224 2
|
5月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
367 98
|
6月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
261 0
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
291 2
利用java8 的 CompletableFuture 优化 Flink 程序
|
XML 存储 JSON
Java程序部署
Java程序部署
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
238 4
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
278 3
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
413 0
|
传感器 安全 算法
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。