1. 简介
JdbcTemplate是Spring框架提供的一个简化JDBC操作的工具类,它能让我们避免传统JDBC编程中的繁琐步骤,使数据库操作变得更加简单高效。
2. 基本配置
2.1 Maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
2.2 配置数据源
@Configuration
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
3. 常用操作示例
3.1 查询操作
// 查询单个对象
public User getUser(Long id) {
String sql = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForObject(sql,
new Object[]{id},
(rs, rowNum) -> {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
return user;
});
}
// 查询列表
public List<User> getAllUsers() {
String sql = "SELECT * FROM user";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
return user;
});
}
3.2 更新操作
// 插入数据
public void addUser(User user) {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getAge());
}
// 更新数据
public void updateUser(User user) {
String sql = "UPDATE user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, user.getName(), user.getId());
}
// 删除数据
public void deleteUser(Long id) {
String sql = "DELETE FROM user WHERE id = ?";
jdbcTemplate.update(sql, id);
}
4. 批量操作
public void batchInsert(List<User> users) {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
List<Object[]> batchArgs = users.stream()
.map(user -> new Object[]{user.getName(), user.getAge()})
.collect(Collectors.toList());
jdbcTemplate.batchUpdate(sql, batchArgs);
}
5. 事务管理
@Transactional
public void transferMoney(String fromAccount, String toAccount, BigDecimal amount) {
String sqlDebit = "UPDATE account SET balance = balance - ? WHERE account_no = ?";
String sqlCredit = "UPDATE account SET balance = balance + ? WHERE account_no = ?";
jdbcTemplate.update(sqlDebit, amount, fromAccount);
jdbcTemplate.update(sqlCredit, amount, toAccount);
}
6. 优点总结
- 简化了JDBC操作,减少了样板代码
- 自动进行资源管理,无需手动关闭连接
- 统一的异常处理机制
- 支持批量操作
- 与Spring框架无缝集成
7. 注意事项
- 查询不到数据时会抛出EmptyResultDataAccessException异常
- 使用queryForObject时需要注意结果集必须是单行
- 在进行批量操作时要注意内存使用
- 合理使用事务管理确保数据一致性
8. 总结
JdbcTemplate是一个非常实用的数据库操作工具,它既保留了JDBC的灵活性,又大大简化了开发流程。对于小型项目或需要执行原生SQL的场景,是一个很好的选择。