TransactionTemplate
采用与Spring中别的 模板 同样的方法,如 JdbcTemplate
和 HibernateTemplate
。它使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来,不再有大量的try/catch/finally/try/catch代码块。同样,和别的模板类一样,TransactionTemplate
类的实例是线程安全的。
必须在事务上下文中执行的应用代码看起来像这样:(注意使用 TransactionCallback
可以有返回值)
Object result = tt.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { updateOperation1(); return resultOfUpdateOperation2(); } });
如果不需要返回值,更方便的方式是创建一个 TransactionCallbackWithoutResult
的匿名类,如下:
tt.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { updateOperation1(); updateOperation2(); } });
回调方法内的代码可以通过调用 TransactionStatus
对象的 setRollbackOnly()
方法来回滚事务。
想要使用 TransactionTemplate
的应用类必须能访问一个 PlatformTransactionManager
(典型情况下通过依赖注入提供)。
1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 3.3.3.1. 直接量 -->
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/ywdb</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
2.
package com.yw.test16;
public class User
{
private int id;
private String name;
private int age;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
3.
package com.yw.test16;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class Test01
{
//编程式事务管理最大的缺点:侵入代码
//好处:细粒度化
private static TransactionCallbackWithoutResult tcwr=new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus status)
{
DataSource ds=(DataSource)ctx.getBean("dataSource");
JdbcTemplate jt=new JdbcTemplate(ds);
jt.execute("insert into user(name,age) values('zhan5',10)");
jt.execute("insert into user(name,age) values('zhan6','a10')");
}
};
private static TransactionCallback tc= new TransactionCallback(){
@SuppressWarnings("unchecked")
@Override
public Object doInTransaction(TransactionStatus status)
{
DataSource ds=(DataSource)ctx.getBean("dataSource");
JdbcTemplate jt=new JdbcTemplate(ds);
jt.execute("insert into user(name,age) values('zhan7',10)");
jt.execute("insert into user(name,age) values('zhan8','10')");
List list=jt.query("select * from user", new RowMapper(){@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException
{
User user=new User();
user.setId(Integer.valueOf(String.valueOf(rs.getObject(1))));
user.setName(String.valueOf(rs.getObject(2)));
user.setAge(Integer.valueOf(String.valueOf(rs.getObject(3))));
return user;
}}) ;
System.out.println("list="+list);
return list;
}
} ;
private static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml", Test01.class);
public static void main(final String[] args) throws Exception
{
// FooService fooService = (FooService) ctx.getBean("fooService");
// fooService.insertFoo(new Foo());
//初始化事务模板
// Object obj=ctx.getBean("txManager");
// System.out.println(obj);//org.springframework.jdbc.datasource.DataSourceTransactionManager@1eb3319f
// PlatformTransactionManager transactionManager=(PlatformTransactionManager)obj;
PlatformTransactionManager transactionManager=(PlatformTransactionManager)ctx.getBean("txManager");
//直接使用TransactionTemplate实现类进行事务管理
TransactionTemplate tt=new TransactionTemplate(transactionManager);
System.out.println("tt="+tt);
//进行事务
try
{
//
// tt.execute(tcwr);
@SuppressWarnings("unchecked")
Object obj=tt.execute(tc);
System.out.println("obj="+obj);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
4.运行