如何在JDBC中获取插入ID?

2022-08-31 04:36:27

我想在数据库中(在我的情况下是Microsoft SQL Server)中使用Java中的JDBC进行记录。同时,我想获取插入 ID。如何使用 JDBC API 实现此目的?INSERT


答案 1

如果它是自动生成的密钥,则可以使用 Statement#getGeneratedKeys() 来实现此目的。您需要将其调用与用于 .首先需要使用 Statement.RETURN_GENERATED_KEYS 创建语句,以通知 JDBC 驱动程序返回密钥。StatementINSERT

下面是一个基本示例:

public void create(User user) throws SQLException {
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
                                      Statement.RETURN_GENERATED_KEYS);
    ) {
        statement.setString(1, user.getName());
        statement.setString(2, user.getPassword());
        statement.setString(3, user.getEmail());
        // ...

        int affectedRows = statement.executeUpdate();

        if (affectedRows == 0) {
            throw new SQLException("Creating user failed, no rows affected.");
        }

        try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
            if (generatedKeys.next()) {
                user.setId(generatedKeys.getLong(1));
            }
            else {
                throw new SQLException("Creating user failed, no ID obtained.");
            }
        }
    }
}

请注意,您依赖于 JDBC 驱动程序来确定它是否有效。目前,大多数最新版本都可以工作,但是如果我是正确的,Oracle JDBC驱动程序仍然有点麻烦。MySQL和DB2已经支持它很长时间了。PostgreSQL不久前开始支持它。我不能评论MSSQL,因为我从未使用过它。

对于 Oracle,您可以直接在同一事务中调用 带有子句或 a(或任何特定于数据库的语法)来执行此操作,以获取上次生成的密钥。另请参阅此答案CallableStatementRETURNINGSELECT CURRVAL(sequencename)INSERT


答案 2
  1. 创建生成的列

    String generatedColumns[] = { "ID" };
    
  2. 将此归因列传递到您的语句

    PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);
    
  3. 使用对象获取生成键 on 语句ResultSet

    ResultSet rs = stmtInsert.getGeneratedKeys();
    
    if (rs.next()) {
        long id = rs.getLong(1);
        System.out.println("Inserted ID -" + id); // display inserted record
    }
    

推荐