Карта / JDBC / Connection, Statement, ResultSet

Connection, Statement, ResultSet

JDBC — базовый API Java для общения с реляционной базой данных, напрямую, без ORM-обёрток вроде Hibernate. Три главных интерфейса:

Connection conn = DriverManager.getConnection(url, user, password);   // соединение с БД

Statement stmt = conn.createStatement();                                // объект для выполнения SQL
ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");        // результат запроса

while (rs.next()) {                  // переход к следующей строке результата
    int id = rs.getInt("id");
    String name = rs.getString("name");
    System.out.println(id + ": " + name);
}

rs.close();
stmt.close();
conn.close();   // обязательно закрыть — иначе соединение "утечёт"

Connection — собственно соединение с базой. Statement — выполняет SQL-запросы через это соединение. ResultSet — таблица результата, по которой “ходишь” построчно через next().

Копнуть глубже

ResultSet — это курсор, а не вся таблица сразу в памяти. next() сдвигает указатель на следующую строку и подгружает данные по мере чтения — это экономит память при больших результатах, не нужно загружать миллион строк целиком.

Закрывать ресурсы обязательно, иначе соединения “утекают” (connection leak), и рано или поздно пул соединений (см. тему «Пулы (Hikari)») исчерпается. На практике используют try-with-resources (см. тему «try-with-resources»), чтобы это происходило автоматически:

try (Connection conn = DriverManager.getConnection(url, user, password);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT id, name FROM users")) {
    while (rs.next()) { ... }
}   // все три закроются автоматически, даже при исключении

Обычный Statement небезопасен для пользовательского ввода — для этого есть PreparedStatement, разобран отдельно в теме «PreparedStatement».

🎤 Закрыл тему, если можешь объяснить:
• роли Connection, Statement и ResultSet;
• почему важно закрывать ресурсы и как try-with-resources в этом помогает (если дошёл до 2-го слоя).