Рубрики
Без рубрики

Возврат сгенерированных ключей в JDBC

Узнайте, как возвращать автоматически сгенерированные ключи только с помощью JDBC

Автор оригинала: Mona Mohamadinia.

1. Обзор

В этом кратком руководстве мы увидим, как мы можем получить последние автоматически сгенерированные ключи с помощью чистого JDBC.

2. Настройка

Чтобы иметь возможность выполнять SQL-запросы, мы будем использовать базу данных в памяти H2 .

Для нашего первого шага давайте добавим его зависимость Maven:


    com.h2database
    h2
    1.4.200

Кроме того, мы будем использовать очень простую таблицу всего с двумя столбцами:

public class JdbcInsertIdIntegrationTest {

    private static Connection connection;

    @BeforeClass
    public static void setUp() throws Exception {
        connection = DriverManager.getConnection("jdbc:h2:mem:generated-keys", "sa", "");
        connection
          .createStatement()
          .execute("create table persons(id bigint auto_increment, name varchar(255))");
    }

    @AfterClass
    public static void tearDown() throws SQLException {
        connection
          .createStatement()
          .execute("drop table persons");
        connection.close();
    }

    // omitted
}

Здесь мы подключаемся к базе данных generated-keys | in-memory и создаем в ней таблицу с именем persons .

3. Флаг Возврата Сгенерированных ключей

Один из способов получить ключи после автоматической генерации-это передать Один из способов получить ключи после автоматической генерации-это передать к подготовленное заявление() метод:

String QUERY = "insert into persons (name) values (?)";
try (PreparedStatement statement = connection.prepareStatement(QUERY, Statement.RETURN_GENERATED_KEYS)) {
    statement.setString(1, "Foo");
    int affectedRows = statement.executeUpdate();
    assertThat(affectedRows).isPositive();

    // omitted
} catch (SQLException e) {
    // handle the database related exception appropriately
}

После подготовки и выполнения запроса мы можем вызвать метод getGeneratedKeys() в Подготовленном операторе , чтобы получить идентификатор:

try (ResultSet keys = statement.getGeneratedKeys()) {
    assertThat(keys.next()).isTrue();
    assertThat(keys.getLong(1)).isGreaterThanOrEqualTo(1);
}

Как показано выше, сначала мы вызываем метод next () , чтобы переместить курсор результата. Затем мы используем метод getLong () , чтобы получить первый столбец и одновременно преобразовать его в long .

Кроме того, можно также использовать ту же технику с обычным оператором s:

try (Statement statement = connection.createStatement()) {
    String query = "insert into persons (name) values ('Foo')";
    int affectedRows = statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
    assertThat(affectedRows).isPositive();

    try (ResultSet keys = statement.getGeneratedKeys()) {
        assertThat(keys.next()).isTrue();
        assertThat(keys.getLong(1)).isGreaterThanOrEqualTo(1);
    }
}

Кроме того, стоит упомянуть, что мы широко используем try-with-resources , чтобы позволить компилятору убирать за нами.

4. Возвращаемые столбцы

Как оказалось, мы также можем попросить JDBC вернуть определенные столбцы после выполнения запроса . Для этого нам просто нужно передать массив имен столбцов:

try (PreparedStatement statement = connection.prepareStatement(QUERY, new String[] { "id" })) {
    statement.setString(1, "Foo");
    int affectedRows = statement.executeUpdate();
    assertThat(affectedRows).isPositive();

    // omitted
}

Как показано выше, мы говорим JDBC вернуть значение столбца id после выполнения данного запроса. Как и в предыдущем примере, мы можем получить id позже:

try (ResultSet keys = statement.getGeneratedKeys()) {
    assertThat(keys.next()).isTrue();
    assertThat(keys.getLong(1)).isGreaterThanOrEqualTo(1);
}

Мы также можем использовать тот же подход с простым оператором s:

try (Statement statement = connection.createStatement()) {
    int affectedRows = statement.executeUpdate("insert into persons (name) values ('Foo')", 
      new String[] { "id" });
    assertThat(affectedRows).isPositive();

    try (ResultSet keys = statement.getGeneratedKeys()) {
        assertThat(keys.next()).isTrue();
        assertThat(keys.getLong(1)).isGreaterThanOrEqualTo(1);
    }
}

5. Заключение

В этом кратком руководстве мы увидели, как мы можем получить сгенерированные ключи после выполнения запроса с помощью чистого JDBC.

Как обычно, все примеры доступны на GitHub .