`

Spring 实现ibatis事务回滚

 
阅读更多

转载http://blog.csdn.net/kolkosky/article/details/2071242

 

Spring 实现ibatis事务回滚

这两天做一个网站需要在数据报错时自动对数据进行回滚,在此期间遇到一些问题,现做下笔记

这里使用spring-Aop代理机制来实现事务的回滚:

配置如下:

 

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

    <listener>

       <listener-class>

           org.springframework.web.context.ContextLoaderListener

       </listener-class>

    </listener>

 

    <servlet>

       <servlet-name>AppConfigServlet</servlet-name>

       <servlet-class>com.test.ConfigServlet</servlet-class>

       <load-on-startup>2</load-on-startup>

    </servlet>

 

    <welcome-file-list>

       <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

</web-app>

 

 

ApplicationContext.xml

<bean id="transactionManager"

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

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

    </bean>

<bean id="businessTarget"

       class="com.test.BusinessInterfaceImpl" />

      

    <bean id="businessBean"

       class="org.springframework.aop.framework.ProxyFactoryBean">

       <property name="singleton">

           <value>true</value>

       </property>

       <property name="proxyInterfaces">

           <value>com.test.BusinessInterface</value>

       </property>

       <property name="interceptorNames">

           <list>

              <value>transactionInterceptor</value>

              <value>businessTarget</value>

           </list>

       </property>

       <property name="proxyTargetClass"><value>true</value></property>

    </bean>

   

    <bean id="transactionInterceptor"

       class="org.springframework.transaction.interceptor.TransactionInterceptor">

       <property name="transactionManager">

           <ref local="transactionManager" />

       </property>

       <property name="transactionAttributes">

           <props>

              <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>

           </props>

       </property>

    </bean>

    <bean id="dataSource"

       class="org.springframework.jndi.JndiObjectFactoryBean">

       <property name="jndiName">

           <value>gissys</value>

       </property>

    </bean>

<bean id="sqlMapClient"

       class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

       <property name="configLocation">

           <value>

              classpath:com/emaptech/persistence/SqlMapConfig.xml

           </value>

       </property>

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

    </bean>

 

Ibatis.xml

    <insert id="testInsert" parameterClass="string">

       insert into corebase.cc select 6,#value# from dual

    </insert>

   

    <insert id="testInsertWrong" parameterClass="string">

       insert into corebase.cc select 6,#value#,7 from dual

    </insert>

 

ConfigServlet.java

package com.test;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

 

import org.springframework.context.ApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

 

 

public class ConfigServlet extends HttpServlet {

    /**

     * UID

     */

    private static final long serialVersionUID = 5118794568550751611L;

 

    public void init() throws ServletException {

       ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());

 

       BaseService.getInstance().init(ctx);

       super.init();

    }

}

 

BaseService.java

package com.test;

 

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.core.io.ClassPathResource;

 

import com.ibatis.sqlmap.client.SqlMapClient;

 

public class BaseService implements ApplicationContextAware {

 

    private static ApplicationContext ctx;

    private static SqlMapClient sqlMapClient;

    private static SqlMapClient sqlMapClientProxy;

    private static BusinessInterface businessBean;

   

    private static BaseService instance = new BaseService();

   

    /**

     * @return 返回 静态类

     */

    public static BaseService getInstance(){

       return instance;

    }

   

    /**

     * @return 返回 初始化BaseService,存于内存

     */

    public void init(ApplicationContext ctx) {

       setApplicationContext(ctx);

       setSqlMapClient(ctx);

       setBusinessBean(ctx);

//     setSqlMapClientProxy(ctx);

       System.out.println(" INFO - 初始化baseservice成功");

    }

   

    public void setSqlMapClient(ApplicationContext ctx){

       sqlMapClient = (SqlMapClient) ctx.getBean("sqlMapClient");

    }

   

    /**

     * @return 返回 sqlMapClient

     */

    public SqlMapClient getInstanceSqlMapClient() {

       return this.sqlMapClient;

    }

   

    /**

     * 通过spring注入ApplicationContext

     *

     * @param ApplicationContext

     * @return null

     */

    public void setApplicationContext(ApplicationContext arg0) throws BeansException {

       ctx = arg0;

    }

 

    public Object getBean(String beanName) {

       return ctx.getBean(beanName);

    }

 

    /**

     * @return 返回 sqlMapClient

     */

    public SqlMapClient getSqlMapClient() {

       return (SqlMapClient) ctx.getBean("sqlMapClient");

    }

 

    public void setSqlMapClientProxy(ApplicationContext ctx) {

       sqlMapClientProxy= (SqlMapClient) ctx.getBean("sqlMapClientProxy");

    }

 

    public SqlMapClient getSqlMapClientProxy() {

       return sqlMapClientProxy;

    }

 

    public static BusinessInterface getBusinessBean() {

       return businessBean;

    }

 

    public static void setBusinessBean(ApplicationContext ctx) {

       businessBean = (BusinessInterface) ctx.getBean("businessBean");

    }

 

}

 

BusinessInterface.java

    package com.test;

 

import java.sql.SQLException;

 

public interface BusinessInterface {

    public void hello() throws SQLException;

}

 

BusinessInterfaceImpl.java

package com.test;

 

import java.sql.SQLException;

 

import com.ibatis.sqlmap.client.SqlMapClient;

 

public class BusinessInterfaceImpl implements BusinessInterface {

    public void hello() throws SQLException {

       System.out.println("hello Spring AOP.");

       SqlMapClient sqlMapClient = BaseService.getInstance().getInstanceSqlMapClient();

   

           sqlMapClient.startTransaction();

           sqlMapClient.insert("testInsert","7");

           System.out.println("1");

           sqlMapClient.insert("testInsert","8");

           System.out.println("2");

           sqlMapClient.insert("testInsert","9");

           System.out.println("3");

           sqlMapClient.insert("testInsertWrong","10");

           sqlMapClient.commitTransaction();

      

    }

}

 

测试页面

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'index.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <!--

    <link rel="stylesheet" type="text/css" href="styles.css">

    -->

  </head>

 

  <body>

    This is my JSP page. <br>

  </body>

</html>

分享到:
评论

相关推荐

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

    ibatis

    - 事务回滚(如`Spring实现iBATIS事务回滚.htm`):在Spring中,如果在事务范围内发生异常,Spring会自动回滚事务,保证数据一致性。 - 事务配置问题(如`spring&ibatis事务配置问题.htm`):整合过程中常见的问题...

    spring+ibatis声明式事务Demo_

    本示例“spring+ibatis声明式事务Demo”将探讨如何在Spring与iBatis集成环境中使用声明式事务管理。声明式事务管理允许开发者通过配置来控制事务,无需在代码中显式处理事务开始、提交和回滚。 **Spring框架** 是一...

    配置事务通知

    2. "Spring实现iBATIS事务回滚.htm" - 这篇文章很可能详细解释了如何在Spring框架中配置和使用iBATIS,特别是在出现异常时如何自动或手动回滚事务。 3. "Spring实现iBATIS事务回滚_files" - 这可能是一些相关的资源...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    SPRING IBATIS 保留IBATIS事务的配置方式

    根据提供的文件信息,本文将详细解析Spring与iBatis整合时如何保留并使用iBatis事务管理机制,以及如何在应用程序中实现手动控制事务的方法。 ### Spring与iBatis整合 Spring框架是一个全面的企业级应用开发框架,...

    spring+ibatis声明式事务Demo

    当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式事务管理。 声明式事务管理是Spring框架提供的一种方便、高效的方式,使得开发者无需手动控制事务的开始、提交、...

    spring整合ibatis

    6. **事务管理**:Spring提供了声明式事务管理,我们可以在方法上添加@Transactional注解,让Spring自动处理事务的开启、提交和回滚。 7. **使用Service和DAO**:在Spring的业务逻辑层Service中,通过@Autowired...

    spring与ibatis整合集成实例

    6. **事务管理**:Spring 提供了声明式事务管理,可以在配置文件中设置事务边界,由 Spring 自动处理事务的开启、提交、回滚等操作。在整合 iBATIS 时,通常会使用 Spring 的 PlatformTransactionManager 接口。 7....

    Spring+iBatis+JOTM实现JTA事务

    本篇文章将详细讲解如何利用Spring+iBatis+JOTM来实现JTA事务。 首先,我们需要理解JTA的核心概念。JTA定义了一组接口和规范,允许应用程序在不同的事务边界之间进行协调,确保原子性和持久性。JOTM作为JTA的一个...

    Spring + Ibatis 与mysql集群集成

    只需在需要事务的Service层方法上添加@Transactional注解,Spring会自动管理事务的开始、提交或回滚。 5. **高可用性和负载均衡**:在Spring中,可以使用Ribbon或Hystrix组件实现对MySQL集群的负载均衡。这些组件会...

    使用SpringBoot注解方式处理事务回滚实现

    使用 SpringBoot 注解方式处理事务回滚实现 在本文中,我们将介绍使用 SpringBoot 注解方式处理事务回滚实现的方法,并通过示例代码进行详细的讲解。本文对于学习 SpringBoot 的开发者或者工作中需要实现事务回滚的...

    struts2+spring+ibatis的小demo

    同时,Spring的事务管理确保了数据的一致性,比如在处理数据库操作时进行自动的回滚和提交。 **iBatis** 是一个持久层框架,它简化了SQL操作,将SQL语句与Java代码分离。在本demo中,iBatis可能会被用来执行员工...

    spring ibatis 配置(包括事务管理)

    由于配置了事务管理,当出现异常时,Spring会自动回滚事务。 ```java @Service public class UserService { @Autowired private UserMapper userMapper; @Transactional public void addUser(User user) {...

    spring和ibatis整合

    5. **事务管理**:Spring的PlatformTransactionManager接口负责处理事务,通过配置,可以将iBatis的数据库操作纳入Spring的事务管理范围。这样,当发生异常时,可以自动回滚事务,保证数据的一致性。 6. **DAO层...

    struts2+spring+ibatis学生管理demo

    同时,Spring的事务管理能力确保了对数据库操作的原子性和一致性,通过声明式事务管理,可以在XML配置文件中轻松设置事务边界,如开启、提交、回滚等操作。 Ibatis是轻量级的持久层框架,它简化了JDBC的繁琐工作,...

    搭建spring mvc+spring+ibatis所需所有jar包

    3. **事务控制**:通常在Service层使用@Transactional注解进行事务控制,Spring会自动管理事务的开启、提交和回滚。 4. **异常处理**:在Controller层捕获并处理可能抛出的异常,确保正常响应。 这些jar包的集合...

    Spring+iBatis配置[归类].pdf

    综上所述,Spring+iBatis的配置归类文档详细讲解了如何在Spring应用中集成和配置iBatis,包括JavaBean实体、映射文件、iBatis配置、DAO实现以及Spring的事务管理。通过这样的集成,开发人员可以利用Spring的高级特性...

    spring and ibatis own back

    4. 事务管理:Spring的TransactionManager负责事务的开启、提交、回滚等操作。 5. 编写Mapper XML文件:定义SQL语句和结果映射,与Mapper接口对应。 6. 使用注解或XML编写SQL:在Mapper接口的方法上使用@Select、@...

    Spring宠物店非常典型的展现了Spring和IBatis的整合

    数据源配置确保了Spring能够连接到数据库,事务管理器则用于处理事务的提交和回滚,SqlSessionFactory是IBatis的核心,它创建SqlSession对象,用于执行SQL语句。 接着,我们需要创建MyBatis的Mapper接口和XML配置...

Global site tag (gtag.js) - Google Analytics