摘要
本文深入解析Spring JDBC Template与事务管理的核心技术,结合XML配置与注解方式两种主流方案,通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议,帮助开发者快速掌握Spring在数据层的高效应用。
一、Spring JDBC Template核心功能
JdbcTemplate是Spring框架对原生JDBC的封装,通过简化资源管理(如连接释放、异常处理)和模板化操作,大幅降低数据库开发复杂度。其核心方法包括:
-
execute()
:执行任意SQL(如DDL语句)。 -
update()
:处理增删改操作,支持预编译参数。 -
query()
:执行查询并映射结果集到对象。 -
call()
:调用存储过程。
优势:
-
避免资源泄漏:自动管理数据库连接。
-
统一异常处理:将检查异常转换为非检查异常(
DataAccessException
)。 -
简化代码:减少重复的
try-catch
和资源关闭逻辑。
二、JDBC Template实战:增删改查操作
1. 配置数据源与JdbcTemplate
在Spring.xml
中定义数据源和JdbcTemplate:
<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_db"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
<!-- JdbcTemplate配置 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
2. 增删改查示例
public class UserTest {
@Test
public void testInsert() {
String sql = "INSERT INTO user(username, address) VALUES('李连杰', '上海')";
jdbcTemplate.execute(sql);
}
@Test
public void testUpdate() {
String sql = "UPDATE user SET username='稳杰' WHERE id=?";
int rows = jdbcTemplate.update(sql, 2);
System.out.println("更新行数:" + rows);
}
@Test
public void testQuery() {
String sql = "SELECT * FROM user WHERE address LIKE '%京%'";
List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
users.forEach(System.out::println);
}
}
三、Spring事务管理核心概念
1. 事务的ACID特性
-
原子性(Atomicity):事务内的操作要么全部成功,要么全部回滚。
-
一致性(Consistency):事务前后数据库状态保持一致。
-
隔离性(Isolation):并发事务间互不干扰。
-
持久性(Durability):事务提交后数据永久保存。
2. Spring事务管理接口
-
PlatformTransactionManager
:事务管理器的核心接口。 -
TransactionDefinition
:定义事务属性(传播行为、隔离级别等)。 -
TransactionStatus
:事务运行时状态。
四、基于XML配置实现事务管理
1. 配置事务管理器与AOP
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- AOP配置 -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.qcby.entity.AliPayDaoImpl.transfer(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
2. 事务传播行为与隔离级别
-
传播行为:
-
REQUIRED
(默认):当前存在事务则加入,否则新建。 -
REQUIRES_NEW
:始终新建事务,挂起当前事务。
-
-
隔离级别:
-
DEFAULT
:使用数据库默认级别。 -
READ_COMMITTED
:避免脏读。
-
五、基于注解方式实现事务管理
1. 启用注解驱动
<!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="txManager"/>
2. 使用@Transactional注解
public class AliPayDaoImpl implements AlipayDao { @Override @Transactional( propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class ) public void transfer(String fromA, String toB, int amount) { jdbcTemplate.update("UPDATE alipay SET amount = amount-? WHERE aliname=?", amount, fromA); // 模拟异常 // int a = Integer.parseInt("error"); jdbcTemplate.update("UPDATE alipay SET amount = amount+? WHERE aliname=?", amount, toB); } }
3. 注解配置注意事项
-
方法可见性:
@Transactional
仅对public
方法生效。 -
异常回滚:默认仅回滚
RuntimeException
,需通过rollbackFor
指定其他异常。
六、总结与最佳实践
1. XML vs 注解
场景 | XML配置 | 注解方式 |
---|---|---|
集中管理 | 适合多事务方法统一配置 | 适合分散在代码中的事务声明 |
灵活性 | 修改需重新部署 | 动态调整,无需重启 |
代码侵入性 | 无侵入 | 需在代码中添加注解 |
2. 最佳实践
-
事务粒度:尽量细化到方法级别,避免长事务。
-
异常处理:明确指定
rollbackFor
,避免事务意外提交。 -
性能优化:合理选择隔离级别,避免过度使用
SERIALIZABLE
。
关键词:Spring JDBC Template、事务管理、XML配置、@Transactional、传播行为、隔离级别