1. 程式人生 > >spring(JDBC)事務配置

spring(JDBC)事務配置

實現原理
採用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();
    }