ResultSet
Результат SELECT-запроса: курсор, который по одной перебирает строки таблицы.
Доступно с: Java 1.1
Синтаксис
public interface ResultSet extends AutoCloseableПримеры
Строки результата в список записей. next() переходит к следующей строке и возвращает false, когда строки кончились:
import java.sql.*;
record Product(int id, String title, double price) {}
void main() throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:");
Statement st = conn.createStatement()) {
st.executeUpdate("CREATE TABLE products (id INTEGER, title TEXT, price REAL)");
st.executeUpdate("INSERT INTO products VALUES (1, 'Tea', 3.5), (2, 'Coffee', 4.2)");
List<Product> products = new ArrayList<>();
try (ResultSet rs = st.executeQuery("SELECT id, title, price FROM products ORDER BY id")) {
while (rs.next()) {
products.add(new Product(rs.getInt("id"), rs.getString("title"), rs.getDouble("price")));
}
}
products.forEach(IO::println);
}
}Результат:
Product[id=1, title=Tea, price=3.5]
Product[id=2, title=Coffee, price=4.2]getInt() возвращает 0 для NULL. Отличить его помогают wasNull() и getObject(), который возвращает null:
import java.sql.*;
void main() throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:");
Statement st = conn.createStatement()) {
st.executeUpdate("CREATE TABLE users (name TEXT, age INTEGER)");
st.executeUpdate("INSERT INTO users VALUES ('Anna', NULL)");
try (ResultSet rs = st.executeQuery("SELECT age FROM users")) {
rs.next();
IO.println(rs.getInt("age"));
IO.println(rs.wasNull());
IO.println(rs.getObject("age"));
}
}
}Результат:
0
true
nullПримечания
Курсор сначала стоит перед первой строкой, поэтому next() вызывают до чтения данных. Столбцы читают по имени (getString("title")) или по номеру, начиная с 1. По умолчанию курсор идёт только вперёд. ResultSet закрывается вместе со своим Statement, но надёжнее закрывать его явно через try. Даты читают через getObject(column, LocalDate.class).
См. также
- PreparedStatement — Заранее подготовленный SQL-запрос с параметрами ?. Защищает от SQL-инъекций.
- DriverManager.getConnection() — Открывает соединение с базой данных по JDBC-адресу.
- record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().
Вопросы и ответы по теме
В учебнике
- Основы JDBC — Работа с базой данных из Java через JDBC — что такое драйвер, подключение DriverManager.getConnection, Statement для команд SQL и чтение строк через ResultSet на примере SQLite.