spring(JDBC)事務配置
阿新 • • 發佈:2019-01-29
實現原理:
採用spring AOP技術實現
spring事務的架構
事務的定義
事務的狀態
說明:通過spring的事務處理架構,再通過配置檔案具體的實現事務的類,就可以讓
spring容器知道是什麼樣的技術來操作資料庫,通過對事務狀態的判斷,通過事務的
定義就可以知道具體的目標方法採用什麼樣的事務策略來處理了。
/**
* dao 介面定義
* @author w7
*
*/
public interface StudentDao {
public void saveStudent(String sql);
}
/**
* dao介面實現
*
* 繼承JdbcDaoSupport ,使用jdbc模板程式設計
* @author w7
*
*/
public class StudentDaoImpl extends JdbcDaoSupport implements StudentDao{
public void saveStudent(String sql) {
this.getJdbcTemplate().execute(sql);
}
}
/**
* service 介面定義
* @author w7
*
*/
public interface StudentService {
public void saveStudent();
}
/**
* service 介面實現
* @author w7
*
*/
public class StudentServiceImpl implements StudentService{
//dao
private StudentDao studentDao;
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
//事務測試
public void saveStudent() {
this.studentDao.saveStudent("insert into person(name,age) values('1',1)" );
// int a = 1/0;
this.studentDao.saveStudent("insert into person(name,age) values('2',2)");
}
}
//spring 事務配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--
引入dataSource
把dao層和service層的類匯入進來
-->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<!--
資料庫連線源
-->
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--
dao物件
-->
<bean id="studentDao" class="com.itheima09.spring.jdbc.transaction.dao.StudentDaoImpl">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--
service物件
-->
<bean id="studentService" class="com.itheima09.spring.jdbc.transaction.service.StudentServiceImpl">
<property name="studentDao">
<ref bean="studentDao"/>
</property>
</bean>
<!--
事務管理器
告訴spring容器要採用什麼樣的技術處理事務
使用哪個技術,則例項化 哪個技術的事務管理器
-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--
配置宣告的事務策略
id 唯一標示
transaction-manager 事務管理器
事務策略理解:
1.spring事務的結構
2.spring事務的定義
1.事務的傳播
2.事務的隔離
3.事務的只讀
3.事務的狀態
-->
<tx:advice id="tx" transaction-manager="transactionManager">
<tx:attributes>
<!--
以save開頭的方法,
propagation :採用的傳播屬性是預設值,
isolation:隔離機制是預設值,
read-only:是讀寫事務
-->
<tx:method
name="save*"
propagation="REQUIRED"
isolation="DEFAULT"
read-only="false"/>
</tx:attributes>
</tx:advice>
<!--
AOP配置
-->
<aop:config>
<aop:pointcut
expression="execution(* com.itheima09.spring.jdbc.transaction.service.*.*(..))"
id="perform"/>
<!--
直接配置事務的通知
-->
<aop:advisor advice-ref="tx" pointcut-ref="perform"/>
</aop:config>
</beans>
@Test
public void testStudent(){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService =
(StudentService)context.getBean("studentService");
//事務測試
studentService.saveStudent();
}