В каких случаях оправдано использование чистого JDBC вместо ORM (например, Hibernate) для CRUD-операций?

Ответ

Использование чистого JDBC вместо ORM оправдано в узких сценариях, где его преимущества перевешивают недостатки в виде boilerplate-кода.

Когда JDBC предпочтительнее:

  1. Критическая производительность: Для высоконагруженных операций, где накладные расходы ORM (генерация SQL, отслеживание состояния объектов, кэширование) неприемлемы. Прямой контроль над SQL и PreparedStatement позволяет делать тонкую оптимизацию.
  2. Сложные запросы и отчеты: Когда требуются многотабличные JOIN, оконные функции или специфические оптимизации СУБД, которые сложно или неэффективно выразить через ORM.
  3. Легковесные приложения: В микросервисах или утилитах, где подключение полноценного ORM избыточно.
  4. Работа с legacy-схемой: Со сложной, не нормализованной или плохо документированной схемой БД, которую сложно отобразить на объектную модель.

Пример простого CRUD на JDBC:

public User findById(long id) throws SQLException {
    String sql = "SELECT id, name FROM users WHERE id = ?";
    try (Connection conn = dataSource.getConnection();
         PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setLong(1, id);
        try (ResultSet rs = ps.executeQuery()) {
            if (rs.next()) {
                return new User(rs.getLong("id"), rs.getString("name"));
            }
        }
    }
    return null;
}

Вывод: Для типичных CRUD-операций в enterprise-приложениях ORM (JPA/Hibernate) является стандартом, так как повышает скорость разработки, безопасность (защита от SQL-инъекций) и поддерживаемость. JDBC — это инструмент для специфических, оптимизированных сценариев.

Ответ 18+ 🔞

А, слушай, вот эта тема про голый JDBC против этих ваших ORM — это ж классический спор, как "палка-копалка против экскаватора". Ну, то есть, понятно, что экскаватор — это мощь, это комфорт, это нихуя не надо делать самому. Но иногда, блядь, нужно аккуратненько лопаткой поковыряться, а не всю стройплощадку разъебывать ковшом.

Так вот, когда эта самая "лопатка" (она же JDBC) реально нужна?

  1. Когда производительность — это пиздец как важно. ORM — он же не дурак, он там под капотом накрутит кучу всего: объекты отслеживает, кэши гоняет, SQL рожает. А иногда тебе надо, блядь, просто взять и впендюрить один хитрожопый запрос, чтобы он летал как фанера над Парижем. Тут голый PreparedStatement — твой лучший друг, чувак. Полный контроль, ноль накладных расходов.
  2. Когда запросы — хуй запутаешь. Ну, там, отчеты ебаные с десятком JOIN'ов, оконные функции, какие-то специфические приколы от PostgreSQL или Oracle. Попробуй это в Hibernate красиво запихни — или запрос получится дохуя сложный, или производительность сядёт. А на чистом SQL ты просто пишешь, что думаешь. Прям как есть.
  3. Когда приложение — лёгкое, как пёрышко. Микросервис какой-нибудь, который раз в час тыкнулся в базу. Тащить за собой всю эту ORM-махину с зависимостями — это как на велосипедную прогулку с собой генератор брать. Нахуя?
  4. Когда база — старый, ебучий легаси-зоопарк. Такое, знаешь, наследие "гениальных" архитекторов: таблицы называются TBL_34_A, связи через три левых поля, документации — ноль. Отображать эту пиздопроебищну на нормальные Java-классы — тот ещё геморрой. Проще, блядь, написать прямой запрос и не ебать себе мозг.

Ну, и чтобы не быть голословным, смотри, как это выглядит в коде. Просто, но, блядь, честно:

public User findById(long id) throws SQLException {
    String sql = "SELECT id, name FROM users WHERE id = ?";
    try (Connection conn = dataSource.getConnection();
         PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setLong(1, id);
        try (ResultSet rs = ps.executeQuery()) {
            if (rs.next()) {
                return new User(rs.getLong("id"), rs.getString("name"));
            }
        }
    }
    return null;
}

Видишь? Никакой магии. Взял, выполнил, получил. Руками. Но и написал, и понял, что написал.

Так что, вывод-то какой? Для 95% обычных корпоративных приложений, где нужно тупо CRUD'ить данные — ORM (тот же JPA/Hibernate) это святое, ёпта. Он спасёт тебе кучу времени, нервов и защитит от кривых рук (и SQL-инъекций). А голый JDBC — это как скальпель хирурга: инструмент для ювелирной, точечной работы, когда стандартные методы уже не катят. Выбирай по ситуации, а не потому что "ой, Hibernate — это для слабаков".