Я хочу INSERT
запись в базе данных (который является Microsoft SQL Server в моем случае), использующий JDBC в Java. В то же время я хочу получить идентификатор вставки. Как я могу достигнуть этого использования JDBC API?
Если это автоматически сгенерированный ключ, вы можете использовать для этого оператор # 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
в той же транзакции, чтобы получить последний сгенерированный ключ. См. Также этот ответ .