如何在 JDBC 中获取插入 ID?

新手上路,请多包涵

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

原文由 Satya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果它是自动生成的密钥,那么您可以为此使用 Statement#getGeneratedKeys() 。您需要在与 Statement 相同的 INSERT 上调用它。您首先 需要 使用 Statement.RETURN_GENERATED_KEYS 创建语句来通知 JDBC 驱动程序返回密钥。

这是一个基本示例:

 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,您可以在 — 之后直接调用 CallableStatement INSERT RETURNING 子句或 SELECT CURRVAL(sequencename) (或任何特定于 DB 的语法) --- 在同一事务中获取最后生成的密钥。另请参阅 此答案

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

  1. 创建生成列
   String generatedColumns[] = { "ID" };

  1. 将此生成的列传递给您的声明
   PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);

  1. 使用 ResultSet 对象获取 Statement 上的 GeneratedKeys
    ResultSet rs = stmtInsert.getGeneratedKeys();

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

原文由 Harsh Maheswari 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题