如何通过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)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从未止步..

谢谢你的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值