Ответ
Без 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.
Когда это уместно: Высоконагруженные системы, сложная аналитика, легаси-код, микросервисы с простой логикой данных.