Sobes.tech
Middle
94
questionbank

Каковы особенности использования ResultSet в JDBC и его конфигурации?

Ответ от нейросети

sobes.tech AI

ResultSet представляет собой таблицу данных, полученную в результате выполнения SQL-запроса.

Основные особенности:

  • Итерация: Позволяет перемещаться по строкам результата с помощью методов next(), previous(), first(), last(), absolute().
  • Получение данных: Предоставляет набор методов get<Тип>() (например, getString(), getInt(), getDate()) для извлечения данных из текущей строки по имени столбца или его индексу.
  • Состояние курсора: Изначально курсорpositioned перед первой строкой.
  • Закрытие: Важно явно закрывать ResultSet, используя close(), чтобы освободить ресурсы. Лучше всего использовать блок try-with-resources.

Конфигурация ResultSet определяется при создании Statement или PreparedStatement и влияет на его поведение:

  • Тип (Type): Определяет возможность перемещения по результату.
    • ResultSet.TYPE_FORWARD_ONLY: Курсор может двигаться только вперед. Наиболее эффективный тип.
    • ResultSet.TYPE_SCROLL_INSENSITIVE: Курсор может свободно перемещаться, но изменения в исходных данных после создания ResultSet не видны.
    • ResultSet.TYPE_SCROLL_SENSITIVE: Курсор может свободно перемещаться, и изменения в исходных данных, произошедшие после создания ResultSet, могут быть видны (зависит от драйвера).
  • Одновременность (Concurrency): Определяет, можно ли изменять данные в ResultSet и сохранять изменения в базе данных.
    • ResultSet.CONCUR_READ_ONLY: Данные только для чтения.
    • ResultSet.CONCUR_UPDATABLE: Позволяет изменять данные в ResultSet и применять эти изменения к базе данных. Требует использования методов update<Тип>(), insertRow(), deleteRow() и updateRow().
  • **Удерживаемость (Holdability) - ** JDBC 3.0+: Определяет, остается ли ResultSet открытым после фиксации транзакции.
    • ResultSet.HOLD_CURSORS_OVER_COMMIT: ResultSet остается открытым.
    • ResultSet.CLOSE_CURSORS_AT_COMMIT: ResultSet закрывается.

Пример создания Statement с заданным типом и одновременностью:

// java
Statement stmt = connection.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, // Тип
    ResultSet.CONCUR_UPDATABLE // Одновременность
);
ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");

Пример использования try-with-resources для автоматического закрытия:

// java
String sql = "SELECT * FROM products WHERE price > ?";
try (PreparedStatement pstmt = connection.prepareStatement(sql);
     ResultSet rs = pstmt.executeQuery()) {

    pstmt.setDouble(1, 100.00);

    while (rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
        double price = rs.getDouble("price");
        System.out.println("ID: " + id + ", Name: " + name + ", Price: " + price);
    }
} catch (SQLException e) {
    e.printStackTrace();
}