Spring-day3-JBDC和aop中的事务

一、Spring整合JDBC。

1.Spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术。即JDBCTemplate模板对象。用来操作jdbc。与JbUtils中的QueryRunner类相似。需要导入Spring基础包之外,还需要c3p0连接池的包,mysql驱动的包,以及Spring,jdbc的包

package cn.guanyq.JdbcTemplate;

import java.beans.PropertyVetoException;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcTempolateDemo {
    @Test
    public void test() throws PropertyVetoException{
        ComboPooledDataSource datasource = new ComboPooledDataSource();
        datasource.setDriverClass("com.mysql.jdbc.Driver");
        datasource.setJdbcUrl("jdbc:mysql:///test");
        datasource.setUser("root");
        datasource.setPassword("123");
        //创建对象模板。
        JdbcTemplate jdbctempolate = new JdbcTemplate(datasource);
        String sql="insert into user values(null,'tom')";
        jdbctempolate.update(sql);
        
    }
    
}

2.Spring容器中整合Jdbc

依赖性关系。首先需要将连接池交给Spring容器管理,也就是注册ComboPooledDataSource对象。并注入相关需要的参数,在这里可以用读取外部properties配置文件的方式。然后注入所需要的四个参数。代码如下:

<context:property-placeholder location="classpasth:src下路径"/>

上面代码为读取properties的配置文件。在这里配置文件可以是:

jdbc.ClassDriver=com.mysql.jdbc.Driver
jdbc.Url=jdbc:mysql:///test
jdbc.user=root
jdbc.password=123

注册连接池对象

<bean name="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
       <property name="classDriver" value="${jdbc.ClassDriver}">        
</property> <property name="url" value="${jdbc.Url}">
</property> <property name="password" value="${jdbc.password}">
</property> <property name="user" value="${jdbc.user}">
</property> </bean>

注意要加前缀,以免和关键字重复。

 连接池对象注册之后就需要注册JdbcTempolate,对象。根据依赖性关系,需要给这个模板对象注入datasource对象

然后注册dao层对象。类中的jbdcTempolate需要提供set方法。来注入JdbcTempolate对象。


 

<!-- 读取properties配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 首先 需要将连接池,也就是datasource放入Spring容器 -->
    <bean name="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 创建datasource时需要的配置配置注入 -->
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!-- 将jdbcTempolate对象放入连接池 -->
    <bean name="jdbctempolate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="datasource"></property>
    </bean>
    <!--将Userservice对象放入Spring容器当中 -->
    <bean name="userservice" class="cn.guanyq.service.UserServiceImpl">
    <property name="jdbctempolate" ref="jdbctempolate"></property>
    </bean>

 

二、Spring中的aop事务。

1.代码准备,经典转账操作。

1)编码式管理事务。

public void doTransaction(final Integer from, final Integer to, final Double money) {
        //调用excute方法来管理事务。
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                //减钱 。
                accountDao.decreaseMoney(from, money);
                //出现异常
                //int i=1/0;
                //加钱
                accountDao.increaseMoney(to, money);
            }
        });

 

 

<bean name="accountService" class="cn.guanyq.aop.AccountServiceImpl">
    <property name="accountDao" ref="accountDao"></property>
   <!-- <property name="transactionTemplate" ref="transactionTemplate"></property> --> 
    </bean>
    
    <!-- 编码式事务管理:将事务核心管理器配置到容器 依赖于datasource,名字必须为transactionManager-->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="datasource"></property>
    </bean>
    <!-- 事务管理模板配置到容器 依赖于事务核心管理器-->
    <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
    </bean>

 

2)xml配置

需要再导入tx约束。即事务约束。

3)

<!-- 配置通知  依赖于事务核心管理器。transactionManager -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
      <tx:method name="do*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
      <tx:method name="save*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
      <tx:method name="delete*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
      <tx:method name="delete*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
      <tx:method name="select*" isolation="DEFAULT" read-only="true" propagation="REQUIRED"/>
      </tx:attributes>
    </tx:advice>
    <!-- 将通知织入 -->
    <aop:config>
     <aop:pointcut expression="execution(* cn.guanyq.aop.*ServiceImpl.*(..))" id="pc"/>
     <!-- 配置切面 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    
    </aop:config>

 

posted @ 2018-06-28 13:07  流浪的小蛤蟆  阅读(124)  评论(0)    收藏  举报