Spring(十三)转账实例

创建表

表结构如下:
Spring(十三)转账实例_第1张图片
sql代码:

create database jdbctest;
use jdbctest;
create table account(
  id int primary key auto_increment,
  username varchar(50),
  money int
);
insert into account(username,money) values('jack','10000');
insert into account(username,money) values('rose','10000');

导入jar包

  • 核心4+1 (beans,core,expression,context+commons.logging)
  • aop (aopalliance,spring-aop,aspectj,spring-aspectj)
  • 数据库(dbcp,tx,,jdbc)
  • 驱动(mysql)
  • 连接池(c3p0,pool)

Spring(十三)转账实例_第2张图片

dao层

主要包含两种事务,即进账和出账。

public interface AccountDao {
    public void in(String inner,Integer money);
    public void out(String outter,Integer money);
}
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
    //进账
    @Override
    public void in(String inner, Integer money) {
        this.getJdbcTemplate().update(
                "update account set money=money+? where username=?", money,
                inner);

    }
    //出账
    @Override
    public void out(String outter, Integer money) {
        this.getJdbcTemplate().update(
                "update account set money=money-? where username=?", money,
                outter);
    }

}

service层

只包含转账事务。

public class AccountService {
    private AccountDao accountDao;
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }
    /**
     * 
     * @param outter 转账人
     * @param inner  收账人
     * @param money  转账金额
     */
    public void transfer(String outter,String inner,Integer money){
        accountDao.in(inner, money);
        //断电测试
    //  int i=1/0;
        accountDao.out(outter, money);
    }
}

spring配置


<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: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/tx 
                            http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    <bean id="dataSourceId" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver">property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/jdbctest">property>
        <property name="user" value="root">property>
        <property name="password" value="123">property>
    bean>
    
    <bean id="accountDaoId" class="com.scx.transferaccounts.AccountDaoImpl">
        <property name="dataSource" ref="dataSourceId">property>
    bean>
    
    <bean id="accountServiceId" class="com.scx.transferaccounts.AccountService">
        <property name="accountDao" ref="accountDaoId">property>
    bean>

    
        
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSourceId">property>
        bean>
        
        <tx:advice id="txAdvice" transaction-manager="txManager">
            <tx:attributes>
                <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT"/>
            tx:attributes>
        tx:advice>
        
        <aop:config>
            <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.scx.transferaccounts.AccountService.*(..))"/>
        aop:config>
beans>

测试

测试内容为jack向rose转账1000元。

public class Test {
    @org.junit.Test
    public void test(){
        String xmlPath="com/scx/transferaccounts/applicationContext.xml";
        ApplicationContext aContext=new ClassPathXmlApplicationContext(xmlPath);
        AccountService service=(AccountService) aContext.getBean("accountServiceId");
        service.transfer("jack", "rose", 1000);
    }
}

测试结果
Spring(十三)转账实例_第3张图片
测试结果和预料一致。
当我们把service层的模拟断电代码取消注释

public void transfer(String outter,String inner,Integer money){
        accountDao.in(inner, money);
        //断电测试
        int i=1/0;
        accountDao.out(outter, money);
    }

再次测试:命令窗口提示出现除0异常
Spring(十三)转账实例_第4张图片

查看数据库转账是否成功
Spring(十三)转账实例_第5张图片
结果和上次一致,并未出现钱丢失。断电,转账失败。由spring代理维护。

你可能感兴趣的:(Spring框架,java)