您的位置:首页 > 编程语言 > Java开发

Spring 开发第一步(四)Spring与JDBC事务

2014-11-03 15:47 288 查看
Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源、hibernate数据源、JPA数据源等等)。在此基础上使用各种对应的Template来提供各种事务操作的方法。JDBC对应的是org.springframework.jdbc.datasource.DataSourceTransactionManager和org.springframework.transaction.support.TransactionTemplate.

在Spring容器中,datasource、manager、template的注入顺序应该是, datasource->manager->template->使用者(例如dao)

相关配置和代码举例(来自于《spring in action 3rd》)

<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitter" resource-ref="true" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"
p:transactionManager-ref="transactionManager"/>
<bean id="jdbcTemplateDao" class="com.spitter.test.JdbcTemplateDao"
p:dataSource-ref="dataSource" p:txTemplate-ref="transactionTemplate"/>


以上配置与书上有些许不同,但道理是一样的,而且个人觉得上面的配置更能体现出注入顺序。

private TransactionTemplate txTemplate;
public void setTxTemplate(TransactionTemplate txTemplate){
this.txTemplate = txTemplate;
}

public void saveCity(String code , String name){
SimpleJdbcTemplate jdbc = getSimpleJdbcTemplate();
jdbc.update("insert into ta_ds_test(city_code, city_name) values(?,?)", code,name);
}
public void saveCityInTransaction(final String code , final String name){
txTemplate.execute(new TransactionCallback<Void>(){
@Override
public Void doInTransaction(TransactionStatus arg0) {
try{
saveCity(code,name);
}catch(RuntimeException e){
arg0.setRollbackOnly();
throw e;
}
return null;
}
});
}


TransactionCallback是一个interface,上面的execute方法传入了一个TransactionCallback的具体实现的实例,有点绕。
实际上,这等同于:先定义一个类,该类实现了TransactionCallback接口,在其中override了doInTransaction()方法, 然后new 出来这个类的一个实例,再将这个实例传给exectue方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: