Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.