需要事务管理器:真正管理事务对象.
* Spring提供了事务管理的模板(工具类.)
第一步:注册事务管理器:
配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 需要注入连接池,通过连接池获得连接 -->
<property name="dataSource" ref="dataSource"/>
</bean>
第二步:注册事务模板类:
<!-- 事务管理的模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
第三步:在业务层注入模板类:(模板类管理事务)
<!-- 业务层类 -->
<bean id="accountService" class="cn.itcast.spring3.demo1.AccountServiceImpl">
<!-- 在业务层注入Dao -->
<property name="accountDao" ref="accountDao"/>
<!-- 在业务层注入事务的管理模板 -->
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
第四步:在业务层代码上使用模板:
Service层接口
package cn.itcast.spring3.demo1;
public interface AccountService {
/**
* 转账的方法
* @param from:从哪转出
* @param to:转入的人
* @param money:转账金额
*/
public void transfer(String from,String to,Double money);
}
Service层实现类
package cn.itcast.spring3.demo1;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
private TransactionTemplate transactionTemplate;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
/**
* 转账的方法
* @param from:从哪转出
* @param to:转入的人
* @param money:转账金额
*/
public void transfer(final String from, final String to, final Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
accountDao.out(from, money);
// int d = 1 / 0;
accountDao.in(to, money);
}
});
}
}
DAO层接口
package cn.itcast.spring3.demo1;
public interface AccountDao {
/**
* 转出的方法
* @param from :转出的人
* @param money :要转账金额
*/
public void out(String from,Double money);
/**
* 转出的方法
* @param to :转入的人
* @param money :要转账金额
*/
public void in(String to,Double money);
}
DAO层实现类
package cn.itcast.spring3.demo1;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
/**
* 转出的方法
* @param from :转出的人
* @param money :要转账金额
*/
public void out(String from, Double money) {
String sql = "update account set money = money - ? where name = ?";
this.getJdbcTemplate().update(sql, money,from);
}
/**
* 转出的方法
* @param to :转入的人
* @param money :要转账金额
*/
public void in(String to, Double money) {
String sql = "update account set money = money + ? where name = ?";
this.getJdbcTemplate().update(sql, money , to);
}
}