之前公司用的是mybatis,但事务管理这块是用ejb的CMT容器管理的事务。基本原理是ejb请求进来,业务代码会创建一个mybatis的session然后放入当前线程,之后所有的方法操作涉及到数据库的都从当前线程取session。当所有service层代码完成后,退出ejb时,根据是否有异常来决定是否回退事务,这部分由拦截器来做(回退时,只在事务状态实体上设置rollback为true),等整个ejb退出时,容器再根据标记最终提交或回退事务。

相比现在公司用的ejb事务,一个请求一个事务,有些场景就不太灵活了,而且还必须用支持ejb的容器,我们用的是jboss。

这几天,将mybatis与mybatis-spring进行结合,用spring来管理事务。发现在整合过程中,碰到了事务不起作用。这里记录下。

整理步聚如下:

1.首先需要在maven里引入以下jar:

<dependency>

            <groupId>org.mybatis</groupId>

            <artifactId>mybatis</artifactId>

            <version>3.2.2</version>

        </dependency>

spring相关的jar,用的版本是3.0.0.RELEASE

2.接着需要配置事务文件,这里对service层做事务代理,所有除spring mvc Controller中相关的bean定义放在:applicationContext.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"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans 

    http://www.springframework.org/schema/beans/spring-beans-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

    http://www.springframework.org/schema/context 

    http://www.springframework.org/schema/context/spring-context-3.0.xsd

    http://www.springframework.org/schema/mvc   

        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="com.video.*">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  

    </context:component-scan>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <context:property-placeholder location="classpath:MySQL.properties" />

    

    <!-- 这个数据库需要引用apache的commons-dbcp jar包 -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="${jdbc.driverClassName}" />

        <property name="url" value="${jdbc.url}" />

        <property name="username" value="${username}" />

        <property name="password" value="${password}" />

    </bean>

    

    <!-- 事务管理器 -->

    <bean id="transactionManager"

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

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

    </bean>

    

    <!-- sqlSessionFactory的datasource必须与上面transactionManager的datasource相同 -->

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

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

        <property name="mapperLocations" value="classpath*:com/video/mapper/**/*.xml" />

    </bean>

    

    <!-- 创建一个sqlSession实例,线程安全的,可以在所有DAO实例共享,原理是将sqlSession,事务与当前线程挂钩 -->

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

        <constructor-arg index="0" ref="sqlSessionFactory" />

    </bean>

    

    <!-- 创建dao层,注入一个sqlSession -->

    <bean id="userDAO" class="com.video.dao.UserDAOImpl">

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

    </bean>

</beans>

这里需要特别注意配置中的:

<context:component-scan base-package="com.video.*">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  

    </context:component-scan>

    <tx:annotation-driven transaction-manager="transactionManager" />

tx:annotation-driver,这个标记,主要是这里用的是注解事务,这个开启后spring会在  "com.video.下面所有类中扫描含有@Transactional的标识,并生成相应的代理(默认是基于接口的JDK动态代理),也可以加上proxy-target-class="true",使用cglib类代理。这时需要加入cglib jar。

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

这个标记是表示不要扫描spring mvc相关的controller

spring mvc相关controller实例的扫描生成,由web容器启动时加载webrequest-servlet.xml的内容时进行处理。

下面是spring mvc组件定义的webrequest-servlet.xml文件

3.webrequest-servlet.xml spring mvc组件文件

<?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"

    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"

    xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/mvc   

    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

    http://www.springframework.org/schema/context  

    http://www.springframework.org/schema/context/spring-context-3.0.xsd

    ">

    <!-- 启用spring mvc 注解 -->

    <context:annotation-config />

    <!-- 设置使用注解的类所在的jar包,这里必须排除扫描service层的组件 -->

    <context:component-scan base-package="com.video.*">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

    </context:component-scan>

    <!-- 完成请求和注解POJO的映射 -->

    <bean

        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->

    <bean

        class="org.springframework.web.servlet.view.InternalResourceViewResolver"

        p:prefix="/jsp/" p:suffix=".jsp" />

</beans>

注意这里的:

<context:component-scan base-package="com.video.*">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

    </context:component-scan>

排除了扫描@service的bean。如果不排除,这里由于web启动时,首先加载这个webrequest-servlet.xml文件,这时将生成一个没有事务的service实例注入到controller。

所有的配置已经完成,注意上面提到的扫描排除的问题。

4

spring mvc与mybatis事务整合的更多相关文章

  1. spring、spring mvc、mybatis框架整合基本知识

    学习了一个多月的框架知识了,这两天很想将它整合一下.网上看了很多整合案例,基本都是基于Eclipse的,但现在外面公司基本都在用Intellij IDEA了,所以结合所学知识,自己做了个总结,有不足之 ...

  2. IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

    项目创建 本项目使用的是IDEA 2016创建. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId, ...

  3. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  4. SSM 三大框架系列:Spring 5 + Spring MVC 5 + MyBatis 3.5 整合(附源码)

    之前整理了一下新版本的 SSM 三大框架,这篇文章是关于它的整合过程和项目源码,版本号分别为:Spring 5.2.2.RELEASE.SpringMVC 5.2.2.RELEASE.MyBatis ...

  5. Spring MVC、MyBatis整合文件配置详解

    Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ Building a RESTful Web Serv ...

  6. Mybaits-从零开始-Spring、Spring MVC、MyBatis整合(未万待续)

    Spring.Spring MVC.MyBatis整合(未万待续)

  7. Spring、Spring MVC、MyBatis

    Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...

  8. spring MVC、mybatis配置读写分离

    spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ...

  9. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...

随机推荐

  1. 关于 spring security 对用户名和密码的校验过程

    1.执行 AuthenticationManager 认证方法 authenticate(UsernamePasswordAuthenticationToken) 2.ProviderManager ...

  2. String.Split()函数 非原创

    我们在上次学习到了 String.Join函数(http://blog.csdn.net/zhvsby/archive/2008/11/28/3404704.aspx),其中用到了String.SPl ...

  3. 第一次UML编程作业

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  4. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  5. 《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

    1.起点 我叫小白,坐在这间属于华夏国超一流互联网公司企鹅巴巴的小会议室里,等着技术面试官的到来. 令我感到不舒服的,是坐在我对面的那位HR美女一个劲儿的盯着我打量!虽说本人帅气,但是也不能这么毫无顾 ...

  6. sqlmap工具的简单使用

    0x00 sqlmap简介:sqlmap是一款针对sql漏洞的自动化注入工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 官方网站下载http://sq ...

  7. .NET Core/.NET 5.0 析构函数依然有效?

    前言 最近看到小伙伴在.NET Core中用到了析构函数,不禁打一疑问,大部分情况下,即使在.NET Framework中都不会怎么用到析构函数,我想在.NET Core中是否还依然有效呢?随着时间推 ...

  8. 2020中国.NET开发者峰会主题内容发布

    2020年12月09日,组委会正式发布了China .NET Conf 2020中国 .NET 开发者峰会的主题内容. 今年的大会主题收到超预期的主题,无论是数量还是质量上都比2019年有所进步,这也 ...

  9. Robot Framework+adb框架自动化测试Android设备案例⑷——L2层关键字

    一.EMMC测试套件 L2层关键字.robot *** Settings *** Resource ../L3公共层.robot *** Keywords *** 一般录影文件列表(EMMC) ${f ...

  10. python爬虫--用xpath爬豆瓣电影

    步骤 将目标网站下的页面抓取下来 将抓取下来的数据根据一定规则进行提取   具体流程 将目标网站下的页面抓取下来 1. 倒库 import requests 2.头信息(有时候可不写) headers ...