Как получить идентификатор вставки в JDBC?

Я хочу INSERT запись в базе данных (который является Microsoft SQL Server в моем случае), использующий JDBC в Java. В то же время я хочу получить идентификатор вставки. Как я могу достигнуть этого использования JDBC API?

366
задан Aurgho Bhattacharjee 28 October 2017 в 17:51
поделиться

1 ответ

Если это автоматически сгенерированный ключ, вы можете использовать для этого оператор # getGeneratedKeys () . Вам нужно вызвать его в том же операторе , который используется для 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 (имя последовательности) (или любой другой специфичный для БД синтаксис) непосредственно после INSERT в той же транзакции, чтобы получить последний сгенерированный ключ. См. Также этот ответ .

622
ответ дан 23 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: