您的位置:首页 > 编程语言 > Java开发

mybatis与spring整合事务管理

2017-03-05 08:47 513 查看
1.最重要的spring配置文件

[html] view plain copy

在CODE上查看代码片派生到我的代码片

    <bean  

            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  

            <property name="location" value="classpath:jdbc.properties" />  

        </bean>  

        <bean id="dataSource"  

            class="org.springframework.jdbc.datasource.DriverManagerDataSource">  

            <property name="driverClassName">  

                <value>${driverClassName}</value>  

            </property>  

            <property name="password">  

                <value>${password}</value>  

            </property>  

            <property name="username">  

                <value>${username}</value>  

            </property>  

            <property name="url">  

                <value>${url}</value>  

            </property>  

        </bean>  

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  

            <property name="dataSource" ref="dataSource" />  

            <property name="configLocation" value="classpath:mybatis.xml" />  

            <property name="plugins">  

                <array>  

                    <ref bean="pagePlugin" />  

                </array>  

            </property>  

            <property name="mapperLocations">  

                <list>  

    <!-- 事务配置 -->  

        <bean id="transactionManager"  

            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

            <property name="dataSource" ref="dataSource" />  

        </bean>  

        <aop:config>  

            <aop:pointcut  

                expression="execution(public * com.test.service.*.*(..))"  

                id="pointcutExtend" />  

            <aop:pointcut  

                expression="execution(public * com.test.frame.service.impl.*.*(..))"  

                id="pointcutBase" />  

            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutExtend" />  

            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutBase" />  

        </aop:config>  

        <tx:advice id="txAdvice" transaction-manager="transactionManager">  

            <tx:attributes>  

                <tx:method name="query*" propagation="REQUIRED" read-only="true" />  

                <tx:method name="expand*" propagation="REQUIRED" read-only="true" />  

                <tx:method name="save*" propagation="REQUIRED"  rollback-for="Exception"/>  

                <tx:method name="insert*" propagation="REQUIRED"  rollback-for="Exception" />  

                <tx:method name="delete*" propagation="REQUIRED"  rollback-for="Exception"/>  

                <tx:method name="update*" propagation="REQUIRED"  rollback-for="Exception"/>  

            </tx:attributes>  

        </tx:advice>  

service中方法:

[html] view plain copy

在CODE上查看代码片派生到我的代码片

    public String insertEntity(BaseEntity entity) throws Exception {  

            if (null == entity.getId() || "".equalsIgnoreCase(entity.getId())) {  

                entity.setId(CreateUuid.getID());  

            }  

            this.dao.insertEntity(entity);  

            int i=1/0;//测试spring事务  

            return entity.getId();  

        }  

注意事项:

//1.直接<aop:pointcut

/*expression="execution(public * com.test.service.*.*(..))"

id="pointcut" />

达不到事务的目的,必须

<aop:pointcut

expression="execution(public * com.ssm.core.frame.service.impl.*.*(..))"

id="pointcut1" />

才可以,如果在子类ProviderServiceImpl中的方法可以使用上面第一句话来进行事务控制。一遍情况下子类为空,用的都是继承的BaseService中方法,只切面子类ProviderServiceImpl是不行的。

*/

测试代码:

[html] view plain copy

在CODE上查看代码片派生到我的代码片

    Provider provider4 = new Provider();  

            //ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2  

            //provider4.setId(CreateUuid.getID());  

            provider4.setBh("bh4");  

            provider4.setMc("mc4");  

            provider4.setLxr("lxr4");  

            provider4.setDh("dh4");  

            provider4.setDz("dz4");  

            provider4.setYx("yx4");  

            provider4.setCz("cz4");  

            provider4.setBz1("bz1");  

            provider4.setBz2("bz2");  

            String insertResult4 = providerService.insertEntity(provider4);  

正确输出日志为:

[html] view plain copy

在CODE上查看代码片派生到我的代码片

    DEBUG 2016-03-03 21:11:47,004 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession  

    DEBUG 2016-03-03 21:11:47,009 org.mybatis.spring.SqlSessionUtils.main Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]  

    DEBUG 2016-03-03 21:11:47,047 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@112da40] will be managed by Spring  

    DEBUG 2016-03-03 21:11:47,048 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@112da40]  

    DEBUG 2016-03-03 21:11:47,053 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?)   

    DEBUG 2016-03-03 21:11:47,073 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: 832dd0a5747345dabdaeef72c184966e(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
 

    DEBUG 2016-03-03 21:11:47,074 org.mybatis.spring.SqlSessionUtils.main Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]  

    DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Initiating transaction rollback  

    DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Rolling back JDBC transaction on Connection [org.sqlite.Conn@112da40]  

    DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization rolling back SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]  

    DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]  

    DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Releasing JDBC Connection [org.sqlite.Conn@112da40] after transaction  

    DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource  

    Exception in thread "main" java.lang.ArithmeticException: / by zero  

    at com.ssm.core.frame.service.impl.BaseService.insertEntity(BaseService.java:47)  

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  

    at java.lang.reflect.Method.invoke(Method.java:597)  

    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)  

    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)  

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  

    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  

    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)  

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  

    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)  

    at $Proxy8.insertEntity(Unknown Source)  

注意日志中的有关事务的描述。

假如事务没起作用,比如pointcut指向的类不对,那么日志信息为:

[html] view plain copy

在CODE上查看代码片派生到我的代码片

    DEBUG 2016-03-03 21:13:57,732 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession  

    DEBUG 2016-03-03 21:13:57,738 org.mybatis.spring.SqlSessionUtils.main SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945] was not registered for synchronization because synchronization is not active  

    DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DataSourceUtils.main Fetching JDBC Connection from DataSource  

    DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DriverManagerDataSource.main Creating new JDBC DriverManager Connection to [jdbc:sqlite:data/ikakeibo.dat]  

    DEBUG 2016-03-03 21:13:57,777 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@ecb67f] will not be managed by Spring  

    DEBUG 2016-03-03 21:13:57,778 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@ecb67f]  

    DEBUG 2016-03-03 21:13:57,783 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?)   

    DEBUG 2016-03-03 21:13:57,802 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: dcb3fe804163407fa3f45d0337595d2f(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
 

    DEBUG 2016-03-03 21:13:57,911 org.mybatis.spring.SqlSessionUtils.main Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945]  

    DEBUG 2016-03-03 21:13:57,912 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource  

    Exception in thread "main" java.lang.ArithmeticException: / by zero  

注意日志信息中的Closing non transactional SqlSession ,表明这个是没有事务控制的,因此可以成功插入记录,而没有进行回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mybatis