使用Spring(16)使用TransactionTemplate进行Spring编程式事务管理

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.运行




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值