Ответ
Да, в дополнение к 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 тут только всё усложнит и замедлит.
Короче, умный человек должен уметь и то, и другое. А иначе ты как тот Герасим из рассказа — силён, но немой, и сказать ничего не можешь, кроме «Му-му», когда надо объяснить базе, чего ты от неё хочешь.