`
lvmlvy
  • 浏览: 44918 次
社区版块
存档分类
最新评论

spring+ibatis事务回滚

    博客分类:
  • java
阅读更多

1、所需jar

cglib-nodep-2.1_3.jar

commons-dbcp.jar

commons-logging-1.1.1.jar

commons-pool-1.6.jar

ibatis-2.3.0.677.jar

mysql-connector-java-5.0.8-bin.jar

spring.jar

spring-context.jar

spring-ibatis.jar

2、spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                 <!--<value>cfg.cfg</value>-->
            </list>
        </property>
    </bean>
    
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/test</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>hitv</value>
		</property>
	</bean>

	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation">
			<value>/mysql-sql-map-config.xml</value>
		</property>
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref local="dataSource"/>
        </property>
    </bean>
    
    <bean id="tempProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="target">
            <ref local="tempService"/>
        </property>
        
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> 
            </props>
        </property>
    </bean>
    
    <bean id="tempDao" class="test.TempDao">
        <property name="sqlMapClient" ref="sqlMapClient"></property>
    </bean>
    <bean id="tempService" class="test.TempService">
        <property name="tempDao" ref="tempDao" />
    </bean>
	
</beans>

 3、ibatis配置文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	<settings cacheModelsEnabled="true" enhancementEnabled="true"
		lazyLoadingEnabled="true" maxSessions="128" maxTransactions="32"
		maxRequests="512" useStatementNamespaces="true" />
		
	<sqlMap resource="test/temp.xml" />
</sqlMapConfig>

 

<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="temp">

	<typeAlias alias="temp" type="test.TempVO" />

	<resultMap id="TempVO-Result-List" class="temp">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<result property="type" column="types" />
	</resultMap>

    <select id="getAllTemp" resultMap="TempVO-Result-List">
		select * from temp 
	</select>

	<insert id="insertTemp">
		insert into temp(name,types) values(#name#,#type#)
	</insert>

</sqlMap>

 4、java代码

package test;

public class TempVO {
	private int id;
	private String name;
	private int type;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	
	
}

 

package test;

import java.sql.SQLException;
import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;


public class TempDao extends SqlMapClientDaoSupport{

	public List<TempVO> getAllTemp() throws SQLException {
        return getSqlMapClientTemplate().queryForList("temp.getAllTemp");
    }
	
	public Object insertTemp(TempVO temp) throws SQLException {
		
		return getSqlMapClientTemplate().insert("temp.insertTemp", temp);
    }
}

 

package test;

import java.sql.SQLException;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TempService {

	private TempDao tempDao;

	public TempDao getTempDao() {
		return tempDao;
	}

	public void setTempDao(TempDao tempDao) {
		this.tempDao = tempDao;
	}

	public void getAllTemp() throws SQLException {
		List<TempVO> li = tempDao.getAllTemp();
		System.out.println(li.size());
	}
	
	public void insertTemp() throws Exception{
		TempVO temp = new TempVO();
		temp.setName("name");
		temp.setType(1);
		tempDao.insertTemp(temp);
		if(true){
			//throw new RuntimeException("dsad");
		}
		TempVO temp2 = new TempVO();
		temp2.setName("name");
		temp2.setType(2);
		tempDao.insertTemp(temp2);
	}
	
	
	public static void main(String[] args){
		try{
			String[] xmls = {"applicationContext.xml"};
	        ApplicationContext context = new ClassPathXmlApplicationContext(xmls);
	        
	        TempService tempService = (TempService) context.getBean("tempProxy");
	        tempService.insertTemp();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

5、注意事项

spring配置事务时,需要指定exception,否则默认Unchecked Exceptions回滚

获取bean时是获取代理bean

    <bean id="tempProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="target">
            <ref local="tempService"/>
        </property>
       
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
            </props>
        </property>
    </bean>
    <bean id="tempService" class="test.TempService">
        <property name="tempDao" ref="tempDao" />
    </bean>

 

 

TempService tempService = (TempService) context.getBean("tempProxy");

 

 

6、事务回滚实际是对代理对象做的操作,如果是bean内部方法a调用方法b,如果方法b做了事务处理,实际不会生效,

需要再找回当前代理对象,通过代理对象调用方法b

((TempService)AopContext.currentProxy()).b();

 

有时需要将代理对象的exposeProxy设置成true

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

分享到:
评论

相关推荐

    Spring+ibatis 保留ibatis事务的配置

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

    struts2+spring+ibatis的小demo

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

    Spring + Ibatis 与mysql集群集成

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

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

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

    spring+ibatis声明式事务Demo_

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

    Spring+iBatis+JOTM实现JTA事务

    在集成Spring+iBatis+JOTM的环境中,Spring主要负责事务策略的配置和管理,iBatis则作为持久层框架,负责SQL的执行,而JOTM作为事务管理器,确保跨数据库的事务一致性。 1. **环境搭建** - 首先,确保安装了JDK ...

    spring+ibatis声明式事务Demo

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

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

    这样,一旦发生异常,Spring会自动回滚事务,保证数据一致性。 最后,关于Spring与Struts2的集成。Spring作为应用框架,负责依赖注入和事务管理;Struts2则作为MVC框架,处理请求和视图。结合Ibatis,我们可以创建...

    struts2+spring+ibatis框架搭建手册

    然后,Spring可以管理这些SqlSession,提供事务的开始、提交、回滚等操作。 5. **实际应用**:在项目中,开发者会创建具体的Action类,这些类通常会包含处理用户请求的方法,并通过注入的Service类调用业务逻辑。...

    Spring+iBatis配置[归类].pdf

    - 事务管理器(TransactionManager)配置,如`PlatformTransactionManager`,它与iBatis的数据源配置结合,控制事务的开始、提交和回滚。 - 数据源(DataSource)配置,定义如何连接到数据库。 - iBatis的...

    struts2+spring+ibatis学生管理demo

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

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    spring+ibatis的jpetstore实例工程,包含完整源代码和jar包

    7. **事务管理**:Spring提供了声明式事务管理,通过在服务层的方法上添加@Transactional注解,可以自动进行事务的开启、提交或回滚,简化了事务处理代码。 8. **单元测试**:在源代码中,通常会有相应的JUnit测试...

    spring+ibatis

    完成后,Spring会自动提交或回滚事务。 9. **最佳实践**: - 尽可能使用注解配置,以减少XML配置文件的复杂性。 - 使用Spring的AOP进行事务管理,使事务处理更透明。 - 为每个Mapper接口创建单独的配置,保持...

    基于Spring+Ibatis的安全线程实现

    5. **事务管理**:Spring的PlatformTransactionManager接口用于管理事务,可以自动进行回滚和提交,确保数据一致性。在配置文件中,我们可以选择合适的事务管理器,如DataSourceTransactionManager或...

    Spring+Struts+ibatis下配置数据读写分离及事务(一)

    编程式事务管理需要在代码中显式调用开始、提交、回滚等事务方法,而声明式事务管理则更简洁,通过在配置文件中定义事务规则,Spring自动管理事务的生命周期。 在Spring中配置事务管理,我们需要在`...

    Spring+Struts+iBATIS整合

    Spring提供了声明式事务管理,只需在配置文件中设置事务边界,即可自动处理事务的提交和回滚,确保数据的一致性。 总的来说,Spring、Struts和iBATIS的整合能够为Java Web开发提供一个强大而灵活的架构。通过它们的...

    spring mvc+ibatis+spring注解

    在本项目中,很可能使用了@Transactional注解来实现声明式事务管理,这样可以在方法级别控制事务的开始、提交、回滚等操作,确保数据的一致性。 "分页排序查询"是Web应用中常见的需求,Spring MVC 和 Ibatis 结合...

    Spring + iBATIS

    Spring 是一个全面的后端开发框架,提供依赖注入、面向切面编程、事务管理等功能,而 iBATIS 是一个优秀的数据持久层框架,它简化了数据库操作,将 SQL 查询与 Java 代码分离。 在 Spring 和 iBATIS 的整合中,主要...

Global site tag (gtag.js) - Google Analytics