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

最佳答案

如果它是自动生成的 key ,则可以为此使用 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之后直接使用RETURNING子句或SELECT CURRVAL(sequencename)(或这样做的任何特定于DB的语法)调用INSERT,以获得最后生成的 key 。另请参见this answer

09-10 08:42
查看更多