Какой у вас опыт работы с JDBC (Java Database Connectivity)?

Ответ

Имею практический опыт работы с JDBC (Java Database Connectivity) — низкоуровневым Java API для взаимодействия с реляционными базами данных. Он предоставляет стандартный интерфейс для выполнения SQL-запросов, обработки результатов и управления транзакциями.

Основные операции, которые выполнял:

  1. Установка соединения: Использование DriverManager или DataSource (предпочтительнее) для получения Connection.
  2. Выполнение запросов: Работа с Statement, PreparedStatement (для параметризованных запросов, защищает от SQL-инъекций) и CallableStatement (для хранимых процедур).
  3. Обработка результатов: Итерация по ResultSet для извлечения данных.
  4. Управление транзакциями: Явный контроль с помощью commit() и rollback(), настройка уровней изоляции.
  5. Работа с метаданными: Использование 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-грязи:

  1. Соединение открывал: Через DriverManager, а потом, когда поумнел, через DataSource — это как перейти с самокруток на нормальные сигареты, удобнее и надёжнее.
  2. Запросы швырял: Statement для простого дерьма, PreparedStatement — святое дело, чтобы тебя не взломали через SQL-инъекцию каким-нибудь ' OR '1'='1, и CallableStatement, когда надо было дернуть хранимую процедуру, которую писал какой-то олдскульный дядька-админ.
  3. Результаты выгребал: Бегал курсором по ResultSet, как крыса по лабиринту, вытаскивая данные методом getInt(), getString(). Скука, блядь, смертная.
  4. Транзакции крутил: Сам ручками делал commit() и rollback(), если что-то пошло не так. Чувствовал себя богом, который решает — быть данным в базе или не быть. Пока не забывал сделать setAutoCommit(false), а то потом охуевал, почему ничего не откатывается.
  5. Метаданные ковырял: Через 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. Но знать, как эта макаронина внутри устроена — обязательно, а то потом в проблемах будешь, как слепой крот, тыкаться.