jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_transaction
jdbc.username=root
jdbc.password=root
log4j.properties文件:
log4j.rootLogger=WARN, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
方法一:
AccountDao.java:
package cn.muke.spring.demo4;
public interface AccountDao {
public void outMoney(String out,Double money);//轉出
public void inMoney(String in,Double money);//轉入
}
AccountDaoImpl.java:
package cn.muke.spring.demo4;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{
public void outMoney(String out, Double money) {//轉出,帳號和金額
String sql="update account set money=money-? where name=?";
this.getJdbcTemplate().update(sql,money,out);
}
public void inMoney(String in, Double money) {//轉入
String sql="update account set money=money+? where name=?";
this.getJdbcTemplate().update(sql,money,in);
}
}
AccountService.java:
package cn.muke.spring.demo4;
public interface AccountService {
public void transfer(String out,String in,Double i);
}
AccountServiceImpl.java:
package cn.muke.spring.demo4;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
//事務管理器註解
//可在註解添加傳播行爲等配置信息
/*
* Transactional註解中的屬性:
* propagation :傳播行爲
* isolation :事務的隔離級別
* readOnly :只讀
* rollbackFor :發生什麼異常回滾
* noRollbackFor:發生什麼異常不回回
* */
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)
public class AccountServiceImpl implements AccountService {
//注入轉賬的Dao類
//提供set方法
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao=accountDao;
}
public void transfer(String out,String in,Double money) {
// in:轉入帳號 out:轉出帳號 money:轉帳金額
accountDao.outMoney(out, money);
/*int i=1/0;*/
accountDao.inMoney(in, money);
}
}
TestAccount.java:
package cn.muke.spring.demo4;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/*
* Spring聲明式事務管理
* */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext4.xml")
public class TestAccount4 {//方式3:基於註解的事務管理方式
@Resource(name="accountService")
private AccountService accountService;
@Test
public void demo1(){
accountService.transfer("aaa", "bbb", 100d);
}
}
applicationContext4.xml
<?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:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context.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">
<!-- 引入外部屬性文件 (jdbc)-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置C3P0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置業務層 -->
<bean id="accountService" class="cn.muke.spring.demo4.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<!-- 配置Dao層 -->
<bean id="accountDao" class="cn.muke.spring.demo4.AccountDaoImpl">
<!-- 將jdbc配置注入Dao層 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 開啓事務註解功能 -->
<!-- 開啓之後只需要在所需要用到的類上加上註解@Transactional就好 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
方法二:
AccountDao.java:
package cn.muke.spring.demo3;
public interface AccountDao {
public void outMoney(String out,Double money);//轉出
public void inMoney(String in,Double money);//轉入
}
AccountDaoImpl.java:
package cn.muke.spring.demo3;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{
public void outMoney(String out, Double money) {//轉出,帳號和金額
String sql="update account set money=money-? where name=?";
this.getJdbcTemplate().update(sql,money,out);
}
public void inMoney(String in, Double money) {//轉入
String sql="update account set money=money+? where name=?";
this.getJdbcTemplate().update(sql,money,in);
}
}
AccountService.java:
package cn.muke.spring.demo3;
public interface AccountService {
public void transfer(String out,String in,Double i);
}
AccountServiceImpl.java:
package cn.muke.spring.demo3;
public class AccountServiceImpl implements AccountService {
//注入轉賬的Dao類
//提供set方法
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao=accountDao;
}
public void transfer(String out,String in,Double money) {
// in:轉入帳號 out:轉出帳號 money:轉帳金額
accountDao.outMoney(out, money);
/*int i=1/0;*/
accountDao.inMoney(in, money);
}
}
TestAccount3.java:
package cn.muke.spring.demo3;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/*
* Spring聲明式事務管理
* */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class TestAccount3 {//方式2:基於AspectJ的XML的方式
@Resource(name="accountService")
private AccountService accountService;
@Test
public void demo1(){
accountService.transfer("aaa", "bbb", 100d);
}
}
applicationContext3.xml:
<?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:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context.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">
<!-- 引入外部屬性文件 (jdbc)-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置C3P0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置業務層 -->
<bean id="accountService" class="cn.muke.spring.demo3.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<!-- 配置Dao層 -->
<bean id="accountDao" class="cn.muke.spring.demo3.AccountDaoImpl">
<!-- 將jdbc配置注入Dao層 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事務的通知(事務的增強) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation :事務傳播行爲
isolation :事務隔離級別
read-only :只讀
rollback-for :發生哪些異常回滾
no-rollback-for :發生哪些異常不回滾
timeout :過期信息
-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入點: -->
<aop:pointcut expression="execution(* cn.muke.spring.demo3.AccountService+.*(..))" id="pointcut1"/>
<!-- 配置切面 -->
<!-- advisor在pointcut1切入點上執行txAdvice的動作 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
</beans>