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();
}