Использовали ли вы нативный SQL (JDBC) в Java-приложениях?

Ответ

Да, в дополнение к ORM (Hibernate/JPA). Нативный SQL через JDBC необходим для:

  • Сложных аналитических запросов, оптимизации производительности.
  • Массовых операций (batch updates).
  • Работы со специфичными функциями СУБД.
  • Написания миграций.

Пример выполнения запроса с использованием JDBC и try-with-resources:

String sql = "SELECT id, name, email FROM users WHERE registration_date > ?";
String url = "jdbc:postgresql://localhost:5432/mydb";

// try-with-resources гарантирует закрытие ресурсов
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
     PreparedStatement stmt = conn.prepareStatement(sql)) {

    stmt.setDate(1, java.sql.Date.valueOf("2024-01-01")); // Безопасная подстановка параметра

    try (ResultSet rs = stmt.executeQuery()) {
        while (rs.next()) {
            Long id = rs.getLong("id");
            String name = rs.getString("name");
            // Обработка результата
        }
    }
} catch (SQLException e) {
    // Логирование и обработка исключения
    throw new DataAccessException("Database error", e);
}

Почему PreparedStatement? Он предотвращает SQL-инъекции и повышает производительность за счет кэширования плана запроса.

Когда использовать: ORM для стандартных CRUD-операций и нативный SQL — для сложной, оптимизированной логики работы с данными.

Ответ 18+ 🔞

А, ну это же классика, блядь! Ну слушай, как есть. Вот ты тут с этими своими ORM-ами, Hibernate-ами изгаляешься, сущности мапишь, а потом — бац! — и оказывается, что жизнь, она, сука, сложнее.

Так вот, нативный SQL через JDBC — это как запасной парашют, или, хуле, как лом в багажнике. Для ORM он — как родной брат-алкаш: вроде и стыдно, но иногда без него нихуя не решить.

Нахуя он нужен, спросишь? Да элементарно, Ватсон!

  • Сложные запросы, где у Hibernate ебёт крышу. Ну там, аналитика какая-нибудь, оконные функции, рекурсивные CTE. ORM на таком или сдохнет, или нагенерует такой пиздец в виде SQL, что база взвоет.
  • Когда надо овердохуища строк обновить. UPDATE table SET field = ? WHERE ... — и пошло-поехало пачкой. Через ORM ты будешь каждую сущность вычитывать, в память тащить, поле менять и потом по одной сохранять. Это пиздец как долго и ресурсоёбно, поверь.
  • Фичи специфичные, от базы. Хочешь использовать pg_trgm для поиска или какие-нибудь гео-функции? ORM часто такое не умеет, либо умеет через жопу. А тут — взял и написал на чистом SQL, что в голову взбредёт.
  • Миграции. Ну это вообще святое. Ты ж не будешь через Hibernate схемы баз данных менять? Это пиздец какой-то, ядрёна вошь.

Смотри, как это выглядит без этих твоих ORM-ных соплей, на чистом JDBC:

String sql = "SELECT id, name, email FROM users WHERE registration_date > ?";
String url = "jdbc:postgresql://localhost:5432/mydb";

// try-with-resources — гениальная хуйня, сама всё закроет
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
     PreparedStatement stmt = conn.prepareStatement(sql)) {

    stmt.setDate(1, java.sql.Date.valueOf("2024-01-01")); // Вот! Никаких инъекций, всё чисто!

    try (ResultSet rs = stmt.executeQuery()) {
        while (rs.next()) {
            Long id = rs.getLong("id");
            String name = rs.getString("name");
            // ... и дальше делай с ними что хошь
        }
    }
} catch (SQLException e) {
    // А тут не просто 'e.printStackTrace()', а нормально обработай, а то потом будешь искать, почему всё падает
    throw new DataAccessException("Database error", e);
}

Видишь этот PreparedStatement? Это святое, блядь. Он тебя от SQL-инъекций спасёт (эти долбоёбы, которые пытаются через форму логина базу снести) и базу не будет каждый раз ебать, перестраивая план запроса.

Так когда что юзать? Да просто, как два пальца обоссать.

  • ORM (Hibernate/JPA) — для всей этой рутинной хуйни: CRUD, простые связи, когда тебе лень SQL писать. Быстро и удобно.
  • Нативный SQL (JDBC) — когда задача не вписывается в рамки ORM, когда нужна скорость, хитрость или работа с нативными фичами базы. Когда понимаешь, что ORM тут только всё усложнит и замедлит.

Короче, умный человек должен уметь и то, и другое. А иначе ты как тот Герасим из рассказа — силён, но немой, и сказать ничего не можешь, кроме «Му-му», когда надо объяснить базе, чего ты от неё хочешь.