JdbcTemplate — это основное средство доступа к базе данных в Spring Framework, значительно упрощающее работу с JDBC API. Он абстрагирует стандартные JDBC-операции (получение подключения, подготовка стейтментов, обработка исключений, закрытие ресурсов), позволяя разработчику сосредоточиться на SQL-запросах.
Использование:
Настройка Data Source: JdbcTemplate требует сконфигурированный DataSource (например, Commons DBCP, HikariCP), который предоставляет соединения с базой данных.
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
// Пример настройки HikariCP
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setJdbcUrl("jdbc:postgresql://localhost:5432/mydatabase");
dataSource.setUsername("myuser");
dataSource.setPassword("mypassword");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
Внедрение JdbcTemplate: Внедряем JdbcTemplate в наш компонент (например, DAO).
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
// Внедрение через конструктор
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// ... методы работы с базой данных
}
Выполнение запросов: JdbcTemplate предоставляет множество методов для различных типов SQL-операций.
Запросы на получение данных:
queryForObject: для получения одного объекта или значения.
query: для получения списка объектов.
queryForRowSet: для получения SqlRowSet.
public int countUsers() {
String sql = "SELECT COUNT(*) FROM users";
// Запрос на получение одного int значения
return jdbcTemplate.queryForObject(sql, Integer.class);
}
public User findById(Long id) {
String sql = "SELECT id, username, email FROM users WHERE id = ?";
// Запрос на получение одного объекта User
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setEmail(rs.getString("email"));
return user;
});
}
public List<User> findAll() {
String sql = "SELECT id, username, email FROM users";
// Запрос на получение списка User
return jdbcTemplate.query(sql, (rs, rowNum) -> {
return user;
});
}
Запросы на модификацию данных (INSERT, UPDATE, DELETE):
update: возвращает количество затронутых строк.
public int createUser(User user) {
String sql = "INSERT INTO users (username, email) VALUES (?, ?)";
// Вставка данных, возвращает количество затронутых строк (1)
return jdbcTemplate.update(sql, user.getUsername(), user.getEmail());
}
public int updateUser(User user) {
String sql = "UPDATE users SET username = ?, email = ? WHERE id = ?";
// Обновление данных, возвращает количество затронутых строк
return jdbcTemplate.update(sql, user.getUsername(), user.getEmail(), user.getId());
}
public int deleteUser(Long id) {
String sql = "DELETE FROM users WHERE id = ?";
// Удаление данных, возвращает количество затронутых строк
return jdbcTemplate.update(sql, id);
}
}
return user;
});
}
return user;
});
}
}
}
}
Преимущества:
Упрощение кода: Устраняет boilerplate-код JDBC.
Обработка исключений: Преобразует SQLException в иерархию DataAccessException Spring.
Управление ресурсами: Автоматически закрывает подключения, Statement и ResultSet.
Интеграция со Spring: Легко интегрируется с транзакциями Spring.
Гибкость: Сохраняет возможность писать чистый SQL.
Недостатки:
Низкоуровневый: Требует написания SQL-запросов вручную.
Не подходит для сложных отображений: Для сложных маппингов объектов на таблицы предпочтительнее JPA/Hibernate.