Если это автоматически сгенерированный ключ, вы можете использовать для этого 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 относительно того, работает ли он. В настоящее время большинство последних версий будут работать, но, если я прав, драйвер JDBC Oracle все еще несколько проблематичен с этим. MySQL и DB2 уже поддерживали это целую вечность. PostgreSQL начал поддерживать его не так давно. Я не могу комментировать MSSQL, так как никогда не использовал его.
Для Oracle вы можете вызывать CallableStatement
с предложением RETURNING
или SELECT CURRVAL(sequencename)
(или с любым специфичным для этого синтаксисом DB) непосредственно после INSERT
в той же транзакции, чтобы получить последний сгенерированный ключ. Смотри также этот ответ .