java - JDBC中如何获取插入ID?

标签 java sql jdbc insert-id

我想使用 Java 中的 JDBC 在数据库(在我的例子中是 Microsoft SQL Server)中INSERT一条记录。同时我想获取插入ID。如何使用 JDBC API 实现此目的?

最佳答案

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

这是一个基本示例:

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,您可以使用 RETURNING 子句或 SELECT CURRVAL(sequencename)(或任何特定于数据库的语法)调用 CallableStatement这样做)直接在同一事务中的 INSERT 之后获取最后生成的 key 。另请参阅this answer .

关于java - JDBC中如何获取插入ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47044026/

相关文章:

MYSQL SELECT 列中 ""之间的多个值

mysql - 使用聚合函数连接两个表

database - JMeter JDBC 请求采样器上的断言

java - Java中使用参数实例化变量

java - 在Java Scanner中让keyboardIn.nextInt()忽略 '$'符号而不改变.nextInt的最佳方法是什么?

Java SSH 登录时更改密码

java.sql.SQLException : Invalid value for getShort() - ' '

java - Java 和 Swing 中的跨平台按钮排序

mysql - 寻找 MySQL 默认昨天日期

java - 如何处理java sql异常:exhausted result set