您的位置:首页 > 编程语言 > Java开发

Spring声明式事务管理(基于注解方式实现)

2017-08-23 20:45 921 查看
----------------------siwuxie095

  

  

  

  

  

  

  

  

Spring 声明式事务管理(基于注解方式实现)

  

  

以转账为例

  

  

1、导入相关jar 包(共
10 个包)

  

(1)导入核心 jar 包和日志相关的 jar 包

  



  

  

  

(2)导入JdbcTemplate 的 jar 包

  



  

  

  

(3)导入MySQL 的 JDBC 驱动包

  



  

  

mysql-connector-java下载链接:

  

https://dev.mysql.com/downloads/connector/j/

  

  

  

(4)导入 AOP 的 jar 包

  



  

  

  

  

2、在MySQL 中手动创建数据库和表

  

数据库名:tx_db,表名:account,字段:id、name、money

  



  

  

手动添加数据,用作测试

  



  

  

  

  

3、具体步骤

  

(1)配置事务管理器

  

<!--
配置事务管理器 -->

<beanid="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<!--

在 DataSourceTransactionManager
源代码中有

属性 dataSource
和其 set
方法,所以可以注入

-->

<propertyname="dataSource"ref="dataSource"/>

</bean>

  

  

  

(2)配置事务注解

  

<!--
配置事务注解,即开启事务注解
-->

<tx:annotation-driventransaction-manager="transactionManager"/>

  

  

  

(3)在使用事务的类上添加注解:@Transactional

  

「使用事务的类一般在业务层」

  

  

  

  

4、具体实现

  

  

编写一个Dao 类

  

AccountDao.java:

  

package com.siwuxie095.dao;

  

import org.springframework.jdbc.core.JdbcTemplate;

  

public class AccountDao {

  

private JdbcTemplate jdbcTemplate;

 

publicvoid setJdbcTemplate(JdbcTemplate jdbcTemplate)
{

this.jdbcTemplate = jdbcTemplate;

}

 

 

/**

*
转出

*/

publicvoid lessMoney(String from,
int money) {

String sql="update account set money=money-? where name=?";

jdbcTemplate.update(sql, money, from);

}

 

 

/**

*
转入

*/

publicvoid moreMoney(String to,
int money) {

String sql="update account set money=money+? where name=?";

jdbcTemplate.update(sql, money, to);

}

 

}

  

  

  

(2)编写一个Service 类

  

AccountService.java:

  

package com.siwuxie095.service;

  

import org.springframework.transaction.annotation.Transactional;

  

import com.siwuxie095.dao.AccountDao;

  

//
在使用事务的类上添加注解:@Transactional

@Transactional

public class AccountService {

  

private AccountDao accountDao;

 

publicvoid setAccountDao(AccountDao accountDao)
{

this.accountDao = accountDao;

}

 

 

/**

*
转账

*/

publicvoid transfer(String from,String to,int
money) {

 

accountDao.lessMoney(from, money);

 

//
即便中间出现了什么异常,也会进行回滚

//
如:int num=10/0;

 

accountDao.moreMoney(to, money);

 

}

 

}

  

  

  

(3)在配置文件中进行配置

  

applicationContext.xml:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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

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/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

 

 

<!--
配置内置连接池 -->

<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>

<!--

jdbc:mysql:///tx_db
是 jdbc:mysql://localhost:3306/tx_db
的简写

-->

<propertyname="url"value="jdbc:mysql:///tx_db"/>

<propertyname="username"value="root"/>

<propertyname="password"value="8888"/>

</bean>

 

 

 

<!--
配置事务管理器 -->

<beanid="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<!--

在 DataSourceTransactionManager
源代码中有

属性 dataSource
和其 set
方法,所以可以注入

-->

<propertyname="dataSource"ref="dataSource"/>

</bean>

 

 

<!--
配置事务注解,即开启事务注解
-->

<tx:annotation-driventransaction-manager="transactionManager"/>

 

 

 

<!--
配置对象并注入属性 -->

<beanid="accountService"class="com.siwuxie095.service.AccountService">

<propertyname="accountDao"ref="accountDao"></property>

</bean>

 

<beanid="accountDao"class="com.siwuxie095.dao.AccountDao">

<propertyname="jdbcTemplate"ref="jdbcTemplate"></property>

</bean>

 

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">

<!--

在 JdbcTemplate
源代码中有属性 dataSource

和其 set
方法,所以可以注入

-->

<propertyname="dataSource"ref="dataSource"></property>

</bean>

  

  

</beans>

  

  

  

(4)编写一个测试类

  

TestDemo.java:

  

package com.siwuxie095.test;

  

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

  

import com.siwuxie095.service.AccountService;

  

public class TestDmo {

  

/**

*
手动加上 @Test
以进行单元测试(将自动导入 JUnit 4
的 jar
包)

*

*
选中方法名,右键->Run As->JUint Test

*/

@Test

publicvoid testService() {

 

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

AccountService accountService=(AccountService) context.getBean("accountService");

 

accountService.transfer("小白",
"小黑",
1000);

}

 

}

  

  

  

  

  

  

  

  

  

  

  

【made by siwuxie095】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: