zoukankan      html  css  js  c++  java
  • Spring 在xml配置里配置事务

    事先准备:
    配置数据源对象
    用<bean>实例化各个业务对象。

    1.配置事务管理器。

    <bean id="transactionManager" class="org.springframework.jdbc.datasourceManager">
      <property name="datasource" ref="datasource"></property>
    </bean>

    2.配置事务属性

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="方法名" propagation="REQUIRES_NEW"/>    <!--新开事务-->
            <tx:method name="*"/>                                    <!--使用原有事务-->
        </tx:attributes>
    </tx:advice>

    3.配置事务切入点,注入事务属性

    <aop:config>
        <aop:pointcut expression="execution(.......)" id="txPointCut"/>
        <aop:advisor advice-ref="txtAdvice" pointcut-ref="txtPointCut"/>
    </aop:config>

    实例:

    准备工作:导入c3p0、Spring框架、Mysql、AOP的jar包,并配置好。

    db.properties 

    driverClass=com.mysql.jdbc.Driver
    jdbcUrl=jdbc:mysql://localhost:3306/mydb
    user=root
    password=
    minPoolSize=5
    maxPoolSize=20
    initialPoolSize=5

    三个接口

    package com.itnba.maya.dao;
    
    public interface IInfoDao {
        public void delete(String code);
    }
    package com.itnba.maya.dao;
    
    public interface IWorkDao {
        public void deleteInfocode(String code);
    }
    package com.itnba.maya.dao;
    
    public interface IInfoService {
        public void delete(String code);
    
    }

    接口的实现类

    package com.itnba.maya.daoimp;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import com.itnba.maya.dao.IInfoDao;
    
    public class InfoDao implements IInfoDao {
    
        private JdbcTemplate j;
        public JdbcTemplate getJ() {
            return j;
        }
        public void setJ(JdbcTemplate j) {
            this.j = j;
        }
        @Override
        public void delete(String code) {
            // 故意设置一个错误
            if(code.equals("p008")){
                int n=1/0;
            }
            
            String sql="delete from info where code=?";
            j.update(sql,code);
        }
    
    
    }
    package com.itnba.maya.daoimp;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import com.itnba.maya.dao.IWorkDao;
    
    public class WorkDao implements IWorkDao {
        
        private JdbcTemplate j;
    
        public JdbcTemplate getJ() {
            return j;
        }
    
        public void setJ(JdbcTemplate j) {
            this.j = j;
        }
    
        public void deleteInfocode(String code) {
        
            String sql="delete from work where infocode=?";
            j.update(sql,code);
        }
    
    }
    package com.itnba.maya.daoimp;
    
    import com.itnba.maya.dao.IInfoDao;
    import com.itnba.maya.dao.IInfoService;
    import com.itnba.maya.dao.IWorkDao;
    
    public class InfoService implements IInfoService {
        
        private IInfoDao infoDao; 
        public IInfoDao getInfoDao() {
            return infoDao;
        }
        public void setInfoDao(IInfoDao infoDao) {
            this.infoDao = infoDao;
        }
        public IWorkDao getWorkdao() {
            return workdao;
        }
        public void setWorkdao(IWorkDao workdao) {
            this.workdao = workdao;
        }
        private IWorkDao workdao;
        public void delete(String code) {
            
            infoDao.delete(code);
            workdao.deleteInfocode(code);
            
        }
    
    }

    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:tx="http://www.springframework.org/schema/tx"
        default-autowire="byName"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        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-4.3.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
            
            <!-- 引入db.properties文件 -->
            <context:property-placeholder location="classpath:db.properties"/>
            <!-- 生成连接池 -->
            <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
                <property name="driverClass" value="${driverClass}"></property>
                <property name="jdbcUrl" value="${jdbcUrl}"></property>
                <property name="user" value="${user}"></property>
                <property name="password" value="${password}"></property>
                <property name="minPoolSize" value="${minPoolSize}"></property>
                <property name="maxPoolSize" value="${maxPoolSize}"></property>
                <property name="initialPoolSize" value="${initialPoolSize}"></property>
            </bean>
            <!-- 生成JdbcTemplate -->
            <bean class="org.springframework.jdbc.core.JdbcTemplate" id="j">
                <property name="dataSource" ref="dataSource"></property>
            </bean>
            <!-- 配置实体类 -->
            <bean class="com.itnba.maya.daoimp.InfoDao" id="infoDao">
                <property name="j" ref="j"></property>
            </bean>    
            <bean class="com.itnba.maya.daoimp.WorkDao" id="workDao">
                <property name="j" ref="j"></property>
            </bean>
                <bean class="com.itnba.maya.daoimp.InfoService" id="service">
                <property name="infoDao" ref="infoDao"></property>
                <property name="workdao" ref="workDao"></property>
            </bean>
            
            
            <!-- 配置事务管理器 -->
            <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
                <property name="dataSource" ref="dataSource"></property>
            </bean>
            <tx:advice id="advice"     transaction-manager="transactionManager">
                <tx:attributes>
                    <tx:method name="*" propagation="REQUIRED"/><!-- *是对所有方法都加 -->
                </tx:attributes>
            </tx:advice>
            <!-- 用切点把事务切进去 -->
            <aop:config>
                <aop:pointcut expression="execution(* com.itnba.maya.daoimp..*.*(..))" id="pointcut"/>
                <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
            </aop:config>
            
    </beans>

    mian函数测试事务有没有生效:

    package com.itnba.maya.daoimp;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.itnba.maya.dao.IInfoService;
    
    public class Test {
        private static ApplicationContext context=null;
    
        private static IInfoService infoservice=null;
    
        
        
        static{
            context=new ClassPathXmlApplicationContext("beans.xml");
            infoservice=(IInfoService) context.getBean("service");
            
        }
        
        public static void main(String[] args) {
            
            infoservice.delete("p008");
    
    
        }
    
    }

    结果除0错误,数据回滚,数据库并没有删除。说明配置的事务生效了。

  • 相关阅读:
    David Cutler NT之父
    VS2012 RC 编译Qt 4.8.2完整过程
    vm demo加固分析
    IDA dump so
    博客园首次发帖
    WebRTC本地选择codec(web本地模拟)
    Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方
    [译] 清除浮动的新方法
    《学习HTML5游戏编程》译记
    Web中的Tip组件实现
  • 原文地址:https://www.cnblogs.com/hq233/p/6664798.html
Copyright © 2011-2022 走看看