Ответ
Имею практический опыт работы с JDBC (Java Database Connectivity) — низкоуровневым Java API для взаимодействия с реляционными базами данных. Он предоставляет стандартный интерфейс для выполнения SQL-запросов, обработки результатов и управления транзакциями.
Основные операции, которые выполнял:
- Установка соединения: Использование
DriverManagerилиDataSource(предпочтительнее) для полученияConnection. - Выполнение запросов: Работа с
Statement,PreparedStatement(для параметризованных запросов, защищает от SQL-инъекций) иCallableStatement(для хранимых процедур). - Обработка результатов: Итерация по
ResultSetдля извлечения данных. - Управление транзакциями: Явный контроль с помощью
commit()иrollback(), настройка уровней изоляции. - Работа с метаданными: Использование
DatabaseMetaDataиResultSetMetaData.
Пример подключения к PostgreSQL и выполнения запроса:
// Использование try-with-resources для автоматического закрытия ресурсов
String url = "jdbc:postgresql://localhost:5432/mydb";
String sql = "SELECT id, name FROM users WHERE active = ?";
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setBoolean(1, true); // Установка параметра
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.printf("ID: %d, Name: %s%n", id, name);
}
}
} catch (SQLException e) {
// Обработка ошибок (логирование, проброс исключения)
e.printStackTrace();
}
Для production-приложений: использовал пулы соединений (HikariCP — самый быстрый) для эффективного управления подключениями и фреймворки более высокого уровня, такие как Spring Data JPA или MyBatis, которые абстрагируют рутинную работу с JDBC.
Ответ 18+ 🔞
А, JDBC, говоришь? Ну это ж классика, блядь, как лыжи в гараже — старые, деревянные, но иногда без них нихуя не поедешь. Это тот самый голый, волосатый API, где ты сам, как обдолбанный таксист, рулишь каждым подключением к базе, каждым запросом, каждым результатом. Никаких тебе волшебных ORM-поршней, только чистый SQL и твои кривые руки.
Что я с этой хренью делал? Да всё, что положено настоящему пацану-кодеру, который не боится запачкать руки в SQL-грязи:
- Соединение открывал: Через
DriverManager, а потом, когда поумнел, черезDataSource— это как перейти с самокруток на нормальные сигареты, удобнее и надёжнее. - Запросы швырял:
Statementдля простого дерьма,PreparedStatement— святое дело, чтобы тебя не взломали через SQL-инъекцию каким-нибудь' OR '1'='1, иCallableStatement, когда надо было дернуть хранимую процедуру, которую писал какой-то олдскульный дядька-админ. - Результаты выгребал: Бегал курсором по
ResultSet, как крыса по лабиринту, вытаскивая данные методомgetInt(),getString(). Скука, блядь, смертная. - Транзакции крутил: Сам ручками делал
commit()иrollback(), если что-то пошло не так. Чувствовал себя богом, который решает — быть данным в базе или не быть. Пока не забывал сделатьsetAutoCommit(false), а то потом охуевал, почему ничего не откатывается. - Метаданные ковырял: Через
DatabaseMetaDataпытался понять, а что, блядь, эта база вообще из себя представляет. Редко, но метко.
Вот, смотри, как это выглядело в коде, на примере Постгреса. Весь этот цирк с закрытием ресурсов:
// Адрес базы — наш храм, куда мы стучимся
String url = "jdbc:postgresql://localhost:5432/mydb";
// Наш священный SQL, с дыркой для параметра
String sql = "SELECT id, name FROM users WHERE active = ?";
// try-with-resources — наш спаситель, чтобы не забыть закрыть connection, а то сожрёт все ресурсы
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
PreparedStatement stmt = conn.prepareStatement(sql)) {
// Затыкаем дырку в запросе значением. Индекс 1, потому что SQL считает с единицы, ёпта!
stmt.setBoolean(1, true);
// Выполняем и получаем курсор с результатами
try (ResultSet rs = stmt.executeQuery()) {
// Гоняем этот курсор, пока строки не кончатся
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.printf("ID: %d, Name: %s%n", id, name);
}
}
} catch (SQLException e) {
// А тут ловим всё, что упадёт: и "таблицы нет", и "пароль не тот". Красота!
e.printStackTrace();
}
Но это, конечно, для учебников и пет-проектов. Для продакшена, где нагрузка — овердохуища, так делать — себя не уважать. Тут уже подключаются пулы соединений, типа HikariCP — штука быстрая, как удар током. А чтобы вообще не ебаться с этим низкоуровневым шаманством, все нормальные люди берут Spring Data JPA или MyBatis. Они эту всю JDBC-макаронину прячут под капот, а тебе дают красивую ложку в виде репозиториев и ORM. Но знать, как эта макаронина внутри устроена — обязательно, а то потом в проблемах будешь, как слепой крот, тыкаться.