springmvc +mybatis实现手动让事务回滚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springmvc +mybatis实现手动让事务回滚相关的知识,希望对你有一定的参考价值。

我知道springmvc 通过注解的方式可以让发生异常的时候让事务混滚。但是现在想手动实现回滚,也就是某个数据不满足条件的时候就让前面的sql语句的事务全部回滚,相当于自己写了个rollback,这中间是不会发生异常的。该怎么实现啊?

参考技术A 对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。   二、Spring   Spring实际上是《Expert One-on-One J2EE Design and Development》一书中所阐述的设计思想的具体实现。在One-on-One一书中,Rod Johnson 倡导J2EE 实用主义的设计思想,并随书提供了一个初步的开发框架实现(interface21 开发包)。而Spring 正是这一思想的更全面和具体的体现。Rod Johnson在interface21 开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架。   Spring是一个开源框架,由Rod Johnson创建并且在他的著作《J2EE设计开发编程指南》里进行了描述。它是为了解决企业应用开发的复杂性而创建的。Spring使使用基本的JavaBeans来完成以前只可能由EJB完成的事情变得可能了。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。   简单来说,Spring是一个轻量的控制反转和面向切面的容器框架。当然,这个描述有点过于简单。但它的确概括出了Spring是做什么的。为了更好地理解Spring,让我们分析一下这个描述:   1、轻量   从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于轻量,从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。   2、控制反转   Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,对象被动地传递它们的依赖而不是自己创建或者查找依赖对象。你可以认为IoC与JNDI相反不是对象从容器中查找依赖,而是容器在对象初始化时不等被请求就将依赖传递给它。   3、面向切面   Spring包含对面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它们应该做的,完成业务逻辑,仅此而已。它们并不负责(甚至是意识)其它的系统关注点,例如日志或事物支持。   4、容器   Spring包含和管理应用对象的配置和生命周期,在这个意义上它是一种容器。你可以配置你的每个bean如何被创建基于一个配置原形为你的bean创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量的EJB容器,它们经常是庞大与笨重的,难以使用。   框架:Spring是由简单的组件配置和组合复杂的应用成为可能。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久性框架集成等等),将应用逻辑的开发留给了你。   所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种子框架提供了基础。

spring-springmvc-mybatis整合

---恢复内容开始---

前言:

  整合这三个框架的目的:
    因为mybatis不支持事务处理,为了满足这一需求因此需要整合spring-mybatis。

  整合中的注意事项:

    mybatis框架默认是不可以调用spring框架的数据源的,因此我们必须配置数据源用于创建会话工厂

    mybatis是通过映射接口创建对象的,但是spring不支持接口创建对象,mybati-spring中提供了解决方案

    整合的目的就是为了支持事务代理,因此必须指定事务代理的数据源

配置流程:

  1、配置springmvc框架

  2、配置mybatis框架

  3、两个框架的整合

具体步骤

  配置springmvc:

  注意事项:springmvc是实现前端和后台代码分离的框架,构建的是一个web项目。因此配置流程应该从请求开始。为了能够实现一个请求对应一个方法,必须在web.xml中配置一个核心控制器,拦截所有请求。拦截请求后如何实现请求和方法一一对应?通过映射路径实现。

    配置流程:

      创建一个请求传到web项目入口web.xml。

      在web.xml中配置核心控制器拦截所有请求

      创建业务控制器(controller层)

      配置请求与方法的映射路径

      返回前端页面

    实现代码:

      请求创建:

<form action="${pageContext.request.contextPath }/add" method="get">
    姓名:<input type="text" name="name" placeholder="姓名"><br>
    学号:<input type="text" name="num" placeholder="学号"><br>
    <input type="submit" value="提交">
</form>

      配置核心控制器:

 <servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-*.xml</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <!-- 这样会拦截静态资源,到时要放开静态资源 -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

      编程业务控制器(表示层代码)以及设置映射路径和返回页面

@Controller
public class StudentController {
    @RequestMapping(value="/add")
    public String add(String name,String num,HttpServletRequest request) {
        System.out.println(name);
        request.setAttribute("name", name);
        return "/show.jsp";
    }
}

 

mybatis配置

  配置流程:

    创建配置总文件

    获得数据库操作对象

    创建映射接口

    在配置总文件中指定映射接口

  具体实现步骤

    创建总配置文件:

      声明:配置总文件是用于配置全局设置和参数的一个文件,需要读取配置总文件的参数来创建数据库操作对象,

         因此配置总文件必须包含连接数据库的一些必要属性。

      实现代码:

<!-- 配置连接信息 -->
    <environments default="sms">
        <environment id="sms">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="url" value="jdbc:mysql://localhost:3306/sms"/>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

      获得数据库操作对象

        实现流程说明:

          1、使用Resources类以流的方式读取配置文件得到一个流对象

          2、创建会话工厂构建类对象

          3、使用会话工厂构建类对象创建会话工厂

          4、使用会话工厂获得操作对象

        实现代码:

public class Config {
    public SqlSession getsession() throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = builder.build(reader);
        SqlSession session = sessionFactory.openSession();
        return session;
    }
}

      创建映射接口:

public interface StudentMapper {
    @Select("select * from t_student where id = #{id}")
    public Student select(int id);
}

      在总配置文件中指定映射接口:

<!-- 指定映射接口 -->
    <mappers>
        <mapper class="my.mapper.StudentMapper"/>
    </mappers>

springmvc-mybatis整合

    注意事项:spring整合mybatis需要一个整合包(spring-mybatis),需要springJDBC、dbcp2、spring-tx四个包

         mybatis框架默认是不可以调用spring框架的数据源的,因此我们必须配置数据源用于创建会话工厂

         mybatis是通过映射接口创建对象的,但是spring不支持接口创建对象,mybati-spring中提供了解决方案

         整合的目的就是为了支持事务代理,因此必须指定事务代理的数据源

 

    配置流程:

        创建数据源(为了使数据源具有事务代理能力,需要重新指定数据源)

        创建支持spring数据源的会话工厂

        扫描映射接口的动态对象到spring容器中

        配置事务代理

    具体实现:

      说明:spring整合其他框架只需要在spring配置文件中增加<bean>即可,因此以上步骤均在在spring配置文件中配置

        创建数据源:

  <bean name="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/sms"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

        创建支持spring数据源的会话工厂:

  <!-- 通过整合包的类,获得会话工厂 -->
    <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定使用的数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 相当于mybatis总配置文件中的settings 标签-->
        <property name="configuration">
            <bean  class="org.apache.ibatis.session.Configuration">
            <!-- 支持驼峰命名法 -->
                <property name="mapUnderscoreToCamelCase" value="true"></property>
            </bean>
        </property>
    </bean>

        扫描映射接口的动态对象到spring容器中:

    <!--获得映射接口的对象,将其注入到spring容器中
        注意:mybatis是通过接口创建对象的,但是spring不支持痛过接口创建对象,因此
                mybatis提供了一个解决方案  -->
    <bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定会话工厂,用于创建映射接口动态对象 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
        <!-- 指定映射接口包的位置 -->
        <property name="basePackage" value="my.mapper"></property>
        <!-- 指定使用指定注解才创建对象并注入到spring容器中 -->
        <property name="annotationClass" value="org.mybatis.spring.annotation.MapperScan"></property>
    </bean>

        配置事务代理:

<!-- 配置事务代理 -->
    <bean name="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 指定数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="tx"/>

      最后删除mybatis总配置文件和获取操作对象的类即完成了ssm框架的配置。

          

      

---恢复内容结束---

以上是关于springmvc +mybatis实现手动让事务回滚的主要内容,如果未能解决你的问题,请参考以下文章

SpringMvc mybatis 基于注解式的事务管理怎么配

springmvc mybatis 整合怎么管理mybatis.xml

springmvc+mybatis整合的事务管理的问题

SpringMVC+Mybatis配置事务,回滚失败。

MyBatis + SpringMVC 总结

04_SSM框架整合(Spring+SpringMVC+MyBatis)