📅  最后修改于: 2023-12-03 15:20:13.170000             🧑  作者: Mango
Spring JDBC 为使用 JDBC 提供了更加简化且颗粒度更细的操作,同时还支持基于数据库的事务处理。
在开始之前,需要确认已经完成以下准备工作:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
Spring JDBC 支持各种数据源,例如连接池、驱动程序管理的连接和 JNDI。
在 Spring 配置文件中配置数据源,示例使用 HikariCP 连接池:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="maximumPoolSize" value="10"/>
<property name="idleTimeout" value="30000"/>
</bean>
Spring 的核心组件 JdbcTemplate 是 JDBC API 的抽象层之一,可以极大地简化 JDBC 代码。
在使用 JdbcTemplate 之前,需要将数据源注入 JdbcTemplate 中:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
使用 JdbcTemplate 进行查询操作:
public List<User> findAllUsers() {
return jdbcTemplate.query("SELECT * FROM users", new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
return user;
}
});
}
此处使用了 RowMapper 接口实现了自定义的对象映射。
使用 JdbcTemplate 进行插入操作:
public int addUser(User user) {
return jdbcTemplate.update("INSERT INTO users(name, age) VALUES(?, ?)",
user.getName(), user.getAge());
}
使用 JdbcTemplate 进行更新操作:
public int updateUser(User user) {
return jdbcTemplate.update("UPDATE users SET name = ?, age = ? WHERE id = ?",
user.getName(), user.getAge(), user.getId());
}
使用 JdbcTemplate 进行删除操作:
public int deleteUser(Long id) {
return jdbcTemplate.update("DELETE FROM users WHERE id = ?", id);
}
Spring 的事务管理是透明的,即数据访问层不需要专门处理事务。
在 Spring 配置文件中配置事务管理器:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
在 Service 层方法上使用 @Transactional 注解即可执行事务:
@Transactional
public void batchUpdate(List<User> users) {
for (User user : users) {
jdbcTemplate.update("UPDATE users SET name = ?, age = ? WHERE id = ?",
user.getName(), user.getAge(), user.getId());
}
}
Spring JDBC 简化了 JDBC 的操作,提升了开发效率和代码质量。同时,Spring 的事务管理也为数据访问提供了很好的支持。