spring鏈接jdbc-事務

一、新建項目,名爲transactionExample
二、導入jar包
導入了spring中的全部jar包和另外兩個jar包:
clipboard.png
三、applicationContext.xmljava

<?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:util="http://www.springframework.org/schema/util"
         xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop" 
       xsi:schemaLocation=" 
         http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd 
         http://www.springframework.org/schema/util  
         http://www.springframework.org/schema/util/spring-util-3.0.xsd
           http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/aop 
         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
         ">
     

<!-- 使用jdbc做爲持久方案,僅僅是獲得鏈接 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    <property name="url" value="jdbc:mysql://localhost:3306/book" />  
    <property name="username" value="root" />  
    <property name="password" value="sll" /> 
</bean>

<bean id="jdbcDaoSupport" class="dao.JdbcDaoSupport" abstract="true">
    <property name="dataSource" ref="dataSource"></property>    
</bean>

<!-- 定義jdbcTemplateDao的bean -->
<bean id="jdbcTemplateDao" class="dao.JdbcTemplateDao" parent="jdbcDaoSupport">    
</bean>

<!-- 定義jdbcTemplateService的bean -->
<bean id="jdbcTemplateService" class="service.JdbcTemplateService">
    <property name="jdbcTemplateDao">
        <ref bean="jdbcTemplateDao"/>
    </property>
</bean>


<!-- 配置jdbc事務管理器 -->
<bean id="jdbcTxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- 對domain這個方法實現事務 -->
<tx:advice id="txAdvice" transaction-manager="jdbcTxManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
    </tx:attributes>
</tx:advice>

<!-- 事務控制位置 -->
<aop:config expose-proxy="true">  
    <aop:pointcut id="serviceOperation"  
        expression="execution(* service.*.service.*(..))" />  
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />  
</aop:config> 

</beans>

四、JdbcTemplateService.java
service方法中含有save、update的delete三個方法。在save方法以後,程序出錯,因此事務會回滾,以前的save操做會失效,不會保存到數據庫中。mysql

public class JdbcTemplateService {
    
    private JdbcTemplateDao jdbcTemplateDao; 
    
    public void domain(){
        jdbcTemplateDao.save();
        int i = 2/0;//這裏出錯了,事務會回滾,以前的save無效
        jdbcTemplateDao.update();
        jdbcTemplateDao.delete();
    }

    public JdbcTemplateDao getJdbcTemplateDao() {
        return jdbcTemplateDao;
    }

    public void setJdbcTemplateDao(JdbcTemplateDao jdbcTemplateDao) {
        this.jdbcTemplateDao = jdbcTemplateDao;
    }
}

5.JdbcTemplateDao.java
在這裏須要注意的是,jdbc默認是一個語句一個事務,因此,當要實現spring配置的事務的時候,須要加上conn.setAutoCommit(false);不然回滾操做會失效。spring

public class JdbcTemplateDao extends JdbcDaoSupport{
    
    private PreparedStatement pre = null;
    private Connection conn;
    
    //異常向上層拋出
    public void save() {
        String insertSql = "insert into user values(?,?)";
        try {
            conn = getDataSource().getConnection();
            conn.setAutoCommit(false);
            pre = conn.prepareStatement(insertSql);
            pre.setString(1, "hahaha");
            pre.setString(2, "happy");
            pre.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public void delete(){
        ...
    }
    public void update(){
        ...
    }
}

六、JdbcDaoSupport.java
原本JdbcDaoSupport 這個類應該是原本就存在的,可是當我在JdbcTemplateDao.java中繼承了JdbcDaoSupport.java這個類以後,獲得的DataSource老是爲空,因此我另寫了一個JdbcDaoSupport.java,裏面有set和get方法,這樣就能正確地獲得DataSource的值。sql

public class JdbcDaoSupport {
    
    private DriverManagerDataSource driverManagerDataSource;

    public DriverManagerDataSource getDataSource() {
        return driverManagerDataSource;
    }

    public void setDataSource(DriverManagerDataSource driverManagerDataSource) {
        this.driverManagerDataSource = driverManagerDataSource;
    }
}

七、測試類數據庫

/**
 * 用於測試的main函數
 * @author Administrator
 *
 */
public class test {

    /**
     * @param args
     * @throws SQLException 
     * @throws SQLException 
     */
    public static void main(String[] args){
        String[] configLocations = new String[] {"applicationContext.xml"};
        //應該引入spring的jar包
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
        JdbcTemplateService j = ctx.getBean(JdbcTemplateService.class);
        j.domain();
    }

}
相關文章
相關標籤/搜索