Вопрос-ответ

How to get the insert ID in JDBC?

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

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

Переведено автоматически
Ответ 1

Если это автоматически сгенерированный ключ, то вы можете использовать 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 driver по-прежнему испытывает некоторые проблемы с этим. MySQL и DB2 уже давно поддерживают его. PostgreSQL начал поддерживать его не так давно. Я не могу прокомментировать MSSQL, поскольку я никогда им не пользовался.

Для Oracle вы можете вызвать предложение a CallableStatement with a RETURNING или a SELECT CURRVAL(sequencename) (или любой другой специфичный для БД синтаксис для этого) непосредственно после INSERT в той же транзакции, чтобы получить последний сгенерированный ключ. Смотрите также этот ответ.

Ответ 2

  1. Создать сгенерированный столбец


    String generatedColumns[] = { "ID" };

  2. Передайте этот генетизированный столбец в свой оператор


    PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);

  3. Используйте ResultSet object для извлечения сгенерированных ключей в инструкции on


    ResultSet rs = stmtInsert.getGeneratedKeys();

    if (rs.next()) {
    long id = rs.getLong(1);
    System.out.println("Inserted ID -" + id); // display inserted record
    }

Ответ 3

При возникновении ошибки "Неподдерживаемая функция" во время использования Statement.RETURN_GENERATED_KEYS попробуйте следующее:

String[] returnId = { "BATCHID" };
String sql = "INSERT INTO BATCH (BATCHNAME) VALUES ('aaaaaaa')";
PreparedStatement statement = connection.prepareStatement(sql, returnId);
int affectedRows = statement.executeUpdate();

if (affectedRows == 0) {
throw new SQLException("Creating user failed, no rows affected.");
}

try (ResultSet rs = statement.getGeneratedKeys()) {
if (rs.next()) {
System.out.println(rs.getInt(1));
}
rs.close();
}

Где BATCHID - автоматически сгенерированный идентификатор.

Ответ 4

Я запускаю Microsoft SQL Server 2008 R2 из однопоточного приложения на основе JDBC и извлекаю последний идентификатор без использования свойства RETURN_GENERATED_KEYS или какого-либо PreparedStatement . Выглядит примерно так:

private int insertQueryReturnInt(String SQLQy) {
ResultSet generatedKeys = null;
int generatedKey = -1;

try {
Statement statement = conn.createStatement();
statement.execute(SQLQy);
} catch (Exception e) {
errorDescription = "Failed to insert SQL query: " + SQLQy + "( " + e.toString() + ")";
return -1;
}

try {
generatedKey = Integer.parseInt(readOneValue("SELECT @@IDENTITY"));
} catch (Exception e) {
errorDescription = "Failed to get ID of just-inserted SQL query: " + SQLQy + "( " + e.toString() + ")";
return -1;
}

return generatedKey;
}

В этом сообщении в блоге хорошо выделены три основных параметра SQL Server "last ID":
http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-inserted-in-the-sql-server/ - два других пока не понадобились.

java sql jdbc