需要事务管理器:真正管理事务对象.
* 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); } }