spring基于注解的声明式事务控制配置

itjavashuai 2020-02-09

配置文件:

<?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        https://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/tx        https://www.springframework.org/schema/tx/spring-tx.xsd        http://www.springframework.org/schema/aop        https://www.springframework.org/schema/aop/spring-aop.xsd        http://www.springframework.org/schema/context        https://www.springframework.org/schema/context/spring-context.xsd">    <!--配置spring创建容器时需要扫描的包-->    <context:component-scan base-package="com.itheima"></context:component-scan>    <!--配置JdbcTemplate-->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!--配置数据源-->    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>        <property name="url" value="jdbc:mysql://localhost:3306/eesy?serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8&amp;useSSL=false"></property>        <property name="username" value="root"></property>        <property name="password" value="123456"></property>    </bean>    <!--spring中基于注解的声明式事务控制配置步骤        1.配置事务管理器        2.开启spring对注解事务的支持        3.在需要事务支持的地方使用@Transactional注解-->    <!--配置事务管理-->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!--开启spring对注解事务的支持-->    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven></beans>service实现类:
package com.itheima.service.impl;import com.itheima.Dao.IAccountDao;import com.itheima.domain.Account;import com.itheima.service.IAccountService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import java.util.List;/** * @Author: lijiahao * @Description: * @Data: Create in 0:16 2020/2/6 * @Modified By: */@Service("accountService")@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//只读型事务的配置public class AccountServiceImpl implements IAccountService {    @Autowired    private IAccountDao accountDao;    public Account findAccountById(Integer accountid) {            return accountDao.findAccountById(accountid);    }    //需要的是读写型事务配置    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)    public void transfer(String sourceName, String targetName, Float money) {        System.out.println("trans......");            //2.1.根据名称查询转出帐户            Account source =  accountDao.findAccountByName(sourceName);            //2.2.根据名称查询转入帐户            Account target = accountDao.findAccountByName(targetName);            //2.3.转出账户减钱            source.setMoney(source.getMoney()-money);            //2.4.转入帐户加钱            target.setMoney(target.getMoney()+money);            //2.5.更新转出账户            accountDao.updateAccount(source);            int i = 1/0;            //2.6.更新转入账户            accountDao.updateAccount(target);    }}dao层实现类:
package com.itheima.Dao.impl;import com.itheima.Dao.IAccountDao;import com.itheima.domain.Account;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.stereotype.Repository;import java.util.List;/** * @Author: lijiahao * @Description: * @Data: Create in 2:32 2020/2/9 * @Modified By: */@Repository("accountDao")public class AccountDaoImpl implements IAccountDao {    @Autowired    private JdbcTemplate jdbcTemplate;    public Account findAccountById(Integer id) {        List<Account> accountList = jdbcTemplate.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class),id);        return accountList.isEmpty()?null:accountList.get(0);    }    public Account findAccountByName(String name) {        List<Account> accountList = jdbcTemplate.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class),name);        if(accountList.isEmpty()){            return null;        }        if(accountList.size()>1){            throw new RuntimeException("结果集不唯一");        }        return accountList.get(0);    }    public void updateAccount(Account account) {        jdbcTemplate.update("update account set name=? ,money=? where id = ?", account.getName(),account.getMoney(),account.getId());    }}实体类:
package com.itheima.domain;import java.io.Serializable;/** * @Author: lijiahao * @Description: 账户的实体类 * @Data: Create in 1:32 2020/2/9 * @Modified By: */public class Account implements Serializable {    private Integer id;    private String name;    private Float money;    @Override    public String toString() {        return "account{" +                "id=" + id +                ", name=‘" + name + ‘\‘‘ +                ", money=" + money +                ‘}‘;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Float getMoney() {        return money;    }    public void setMoney(Float money) {        this.money = money;    }}测试:
package com.itheima.test;import com.itheima.domain.Account;import com.itheima.service.IAccountService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;/** * @Author: lijiahao * @Description: 使用junit测试配置 * @Data: Create in 0:59 2020/2/6 * @Modified By: */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="classpath:bean.xml")public class AccountServiceTest {    @Autowired    private  IAccountService as;    @Test    public void testTransfer(){        as.transfer("aaa", "bbb", 100f);    }}

相关推荐