package cn.muke.spring.demo1; /** * 转账案例的DAO层的接口 */ public interface AccountDao { /** * @param out:转出账号 * @param money:转账金额 */ public void outMoney(String out,Double money); /** * @param in:转入账号 * @param money:转入金额 */ public void inMoney(String in,Double money); }
package cn.muke.spring.demo1; import org.springframework.jdbc.core.support.JdbcDaoSupport; /** * 转账案例的DAO层的实例类 */ public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { public void outMoney(String out, Double money) { String sql="update account set money=money-? where name=?"; this.getJdbcTemplate().update(sql,money,out); } public void inMoney(String in, Double money) { String sql="update account set money=money+? where name=?"; this.getJdbcTemplate().update(sql,money,in); } }
package cn.muke.spring.demo1; /** * 转账案例的业务层接口. */ public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money:转出金额 */ public void transfer(String out,String in,Double money); }
package cn.muke.spring.demo1; 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 AccountServiceImpl implements AccountService{ //注入转账的DAO的类 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } //注入事务管理的模板; private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } /** * @param out :转出账号 * @param in :转入账号 * @param money:转出金额 */ public void transfer(final String out,final String in,final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.outMoney(out,money); int i=1/0; accountDao.inMoney(in,money); } }); /* accountDao.outMoney(out,money); int i=1/0; accountDao.inMoney(in,money);*/ } }
package cn.muke.spring.demo1; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; /** * 转账案例的测试类 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringDemo1 { //测试业务层类: @Resource(name = "accountService") private AccountService accountService; @Test public void demo1(){ accountService.transfer("aaa","bbb",200d); } }
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/aop/spring-tx.xsd"> <!--引入外部的属性文件--> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置C3P0的连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置业务层--> <bean id="accountService" class="cn.muke.spring.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <!--注入事务管理的模板--> <property name="transactionTemplate" ref="transactionTemplate"/> </bean> <!--配置DAO的类--> <bean id="accountDao" class="cn.muke.spring.demo1.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理的模板:Spring为了简化事务管理的代码而提供的类--> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean> </beans>