Автор оригинала: 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 .