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».
• почему важно закрывать ресурсы и как try-with-resources в этом помогает (если дошёл до 2-го слоя).