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

本文内容纲要:spring基于注解的声明式事务控制配置

配置文件:

<?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&characterEncoding=utf8&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);

}

}

本文内容总结:spring基于注解的声明式事务控制配置

原文链接:https://www.cnblogs.com/lijiahaoAA/p/12288417.html

以上是 spring基于注解的声明式事务控制配置 的全部内容, 来源链接: utcz.com/z/296238.html

回到顶部