Ответ
Без ORM-фреймворков работа с БД в Java ведется на более низком уровне, в основном через JDBC (Java Database Connectivity) или его удобные обертки.
1. Чистый JDBC: Это стандартный API, требующий ручного управления всеми аспектами.
// 1. Регистрация драйвера (часто происходит автоматически)
// Class.forName("com.mysql.cj.jdbc.Driver");
// 2. Установка соединения и работа с ресурсами в try-with-resources
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
String sql = "SELECT id, name, email FROM users WHERE active = ?";
try (Connection connection = DriverManager.getConnection(url, user, password);
PreparedStatement statement = connection.prepareStatement(sql)) {
// 3. Установка параметров (защита от SQL-инъекций)
statement.setBoolean(1, true);
// 4. Выполнение запроса и обработка ResultSet
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
// Маппинг на объект вручную
User user = new User(id, name, email);
// ... обработка user
}
}
} catch (SQLException e) {
// Обработка ошибок БД
e.printStackTrace();
}
// 5. Ресурсы (Connection, Statement, ResultSet) закрыты автоматически
2. Упрощение с помощью JdbcTemplate (Spring Framework):
Spring предоставляет класс JdbcTemplate, который берет на себя управление ресурсами и обработку исключений.
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findActiveUsers() {
String sql = "SELECT id, name, email FROM users WHERE active = true";
// JdbcTemplate сам закрывает Connection и Statement
return jdbcTemplate.query(sql, (resultSet, rowNum) ->
new User(
resultSet.getLong("id"),
resultSet.getString("name"),
resultSet.getString("email")
)
);
}
}
Преимущества подхода без ORM:
- Полный контроль: Точное управление выполняемыми SQL-запросами.
- Производительность: Минимальные накладные расходы, отсутствие генерации сложного SQL "под капотом".
- Простота: Для очень простых проектов или специфичных запросов.
Недостатки:
- Boilerplate-код: Много рутинных операций (соединение, подготовка запроса, маппинг).
- Риск ошибок: Легко забыть закрыть ресурсы или обработать исключения.
- Слабая типизация: SQL-запросы в виде строк, ошибки обнаруживаются в runtime.
Когда это уместно: Высоконагруженные системы, сложная аналитика, легаси-код, микросервисы с простой логикой данных.
Ответ 18+ 🔞
Да ты посмотри, какой цирк начинается, когда ORM-фреймворков нету! Прям как в каменном веке, блядь, с палкой-копалкой к базе лезешь. Основной инструмент — это JDBC, ядрёна вошь, или какие-то обёртки над ним, если совсем совесть есть.
1. Чистый JDBC, ёпта: Это когда ты сам себе и сантехник, и электрик, и уборщица. Всё руками, сука.
// 1. Драйвер этот... (иногда сам встаёт, как проснётся)
// Class.forName("com.mysql.cj.jdbc.Driver");
// 2. Открываем соединение и молимся, чтобы не упало
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
String sql = "SELECT id, name, email FROM users WHERE active = ?";
try (Connection connection = DriverManager.getConnection(url, user, password);
PreparedStatement statement = connection.prepareStatement(sql)) {
// 3. Подставляем параметры, чтобы нас не взломали через SQL-инъекцию, как последних лохов
statement.setBoolean(1, true);
// 4. Гоняем курсор туда-сюда и выковыриваем данные
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
// Вручную, блядь, лепим объект из того, что вытащили
User user = new User(id, name, email);
// ... делаем что-то с этим user
}
}
} catch (SQLException e) {
// А вот тут обычно пиздец и случается
e.printStackTrace();
}
// 5. Ресурсы закрылись сами, потому что try-with-resources — это единственная светлая мысль во всём этом
2. Немного цивилизации с JdbcTemplate (от Spring):
Это как взять того же дикаря, но дать ему уже заточенную палку. Управление ресурсами и исключениями — уже не твоя головная боль.
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findActiveUsers() {
String sql = "SELECT id, name, email FROM users WHERE active = true";
// JdbcTemplate сам всё закроет, благородный делец
return jdbcTemplate.query(sql, (resultSet, rowNum) ->
new User(
resultSet.getLong("id"),
resultSet.getString("name"),
resultSet.getString("email")
)
);
}
}
Чем это, блядь, хорошо:
- Контроль нахуй: Ты как бог — сам пишешь каждый SQL, знаешь, что летит в базу.
- Скорость: Никаких тебе ORM-овских наворотов, которые запрос в три экрана сгенерируют. Всё честно и быстро.
- Прямолинейность: Для задач в стиле «взял-вывел» или для легаси-монстров — самое то.
Чем это, сука, плохо:
- Писанины овердохуища: Connection, Statement, ResultSet, маппинг... Каждый раз одно и то же, волнение ебать.
- Проёбы на ровном месте: Закрыть ресурс забыл — получи утечку. В строке SQL опечатку сделал — узнаешь только в рантайме, когда всё ебнется.
- Типизация хуйня: SQL — это строка, компилятор её не проверит. Жди сюрпризов.
Когда так жить: Когда база пляшет под твою дудку в высоконагруженной системе, когда пишешь адские аналитические запросы или просто поддерживаешь старый код, где про ORM только в книжках читали.