Получить значение поля автоинкремента в транзакции

Я использую H2DB для небольшой базы данных. Я вставляю несколько записей в таблицу с автоматическим приращением поля jj для идентификатора первичного ключа. Для каждой записи я хочу знать значение ID-поля после вставки, т.е. перед фиксацией. Как мне получить это значение?

1 ответ

Короче:

  • использование Statement.RETURN_GENERATED_KEYS в качестве второго параметра при подготовке оператора вставки
  • получить ResultSet из заявления после вставки с .getGeneratedKeys()
  • получить сгенерированный идентификатор из ResultSet

Это также должно работать при использовании транзакций.

Следующий пример демонстрирует это:

try {
    // register driver
    Class.forName("org.h2.Driver");
    // open connection, in-memory database
    Connection conn = DriverManager.getConnection("jdbc:h2:mem:");
    conn.setAutoCommit(false);
    // create table
    PreparedStatement createSample = conn.prepareStatement("CREATE TABLE sample (id int not null auto_increment, txt varchar(128))");
    createSample.executeUpdate();
    createSample.close();
    // prepare insert statement
    PreparedStatement insertStatement = conn.prepareStatement("INSERT INTO sample (txt) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
    // dummy list with texts
    List<String> dummyTexts = Arrays.asList("Entry A", "Entry B", "Entry C", "Entry D", "Entry E");
    // insert data
    for (String dummyText : dummyTexts) {
        insertStatement.setString(1, dummyText);
        insertStatement.executeUpdate();
        // get generated key
        ResultSet generatedKeys = insertStatement.getGeneratedKeys();
        if ((generatedKeys != null) && (generatedKeys.next())) {
            int generatedKey = generatedKeys.getInt(1);
            System.out.println("generated key " + generatedKey + " for entry '" + dummyText + "'");
        }
    }
    // commit
    conn.commit();
    insertStatement.close();
    // select data
    PreparedStatement selection = conn.prepareStatement("SELECT id, txt FROM sample");
    ResultSet selectionResult = selection.executeQuery();
    while (selectionResult.next()) {
        System.out.println("id: " + selectionResult.getInt(1) + ", txt: '" + selectionResult.getString(2) + "'");
    }
    selectionResult.close();
    selection.close();
    // close connection
    conn.close();
} catch (Exception ex) {
    ex.printStackTrace();
}
Другие вопросы по тегам