`

ibatis(学习2)-- spring + ibatis的事务管理

阅读更多
前言:我们知道事务的管理分为声明式和编程式,这里主要针对spring和ibatis结合用spring的声明式管理方式,管理ibatis链接数据库的事务。

条件:数据库支持事务,如果是mysql数据库需要先确定数据库的引擎是否是innodb,只有这个数据库引擎支持事务。

环境:myeclipse+spring3.X+ibatis2

配置文件主要信息

sqlMapConfig文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings 
		useStatementNamespaces="true" 
		cacheModelsEnabled="true"
		enhancementEnabled="true" 
		lazyLoadingEnabled="true"
		errorTracingEnabled="false" 
		maxRequests="32" 
		maxSessions="10"
		maxTransactions="5" 
	/>
	
     <sqlMap resource="com/sitech/wfrest/dao/engine/WorkflowEngine.xml" />
</sqlMapConfig>


讲解:你也许会发现这个文件中没有trancationManager 和dataSource 标签,因为如果使用spring管理ibatis事务,他们必须使用同一个数据源,关于dataSource要在spring的配置文件中定义。

spring配置文件

<?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:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@172.11.11.13:1525:test" />
		<property name="username" value="12345" />
		<property name="password" value="12345" />
	</bean>
 	
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager" abstract="false" lazy-init="default" autowire="default"
        dependency-check="default">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
	</bean>
	
	<aop:config>
	  <aop:pointcut id="serviceMethod" expression="execution(* com.sitech.wfrest.web.*.*(..))"/>
	  <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
	</aop:config>
	
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
	  <tx:attributes>
	    <tx:method name="*" propagation="REQUIRED"/>
	  </tx:attributes>
	</tx:advice>


讲解:dataSource是数据源,transactionManager定义事务管理的类。而下面的部分是基于tx/aop命名空间的配置,这里没有使用TransactionProxyFactoryBean,spring3.X已经不推荐使用事务代理,这中侵入式会导致很多冗余的代码。

现在看一个配置然后讲解tx/aop各参数意思,及作用。

<?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="sqlMapClient"
		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation">
			<value>classpath:com/sitech/wfrest/config/sqlmap-config.xml</value>						
		</property>
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
	</bean>

	<bean id="sqlMapClientTemplate"
		class="org.springframework.orm.ibatis.SqlMapClientTemplate">
		<property name="sqlMapClient">
			<ref bean="sqlMapClient" />
		</property>
	</bean>
</beans>


讲解:通过SqlMapClientFactoryBean链接数据源,获取sqlMapClient。


import org.springframework.orm.ibatis.SqlMapClientTemplate;

public class BaseDao {
	private SqlMapClientTemplate sqlMap;

	public SqlMapClientTemplate getSqlMap() {
		return sqlMap;
	}

	public void setSqlMap(SqlMapClientTemplate sqlMap) {
		this.sqlMap = sqlMap;
	}
}



讲解:自己编写一个BaseDao 的bean,引用sqlMapClientTemplate模板可以理解为sqlClient的一个实例。

到此为止,spring和ibatis的链接做好,ibatis和spring用的是同一个数据源。

基于tx/aop的命名空间配置:

<tx:advice/>标签配置详细讲解:

propagation :
事务的传播行为一共6种,最常用的REQUIRED,意思是:如果有事务则使用此事务,如果没有事务,新建一个事务。

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

注意:最后一个是应用在JDBC3.0基础上的,因为JDBC3.0支持保存点,使用最后一个为了不破坏保存点,所以使用嵌套事务。

isolation
隔离级别:

1 ISOLATION_DEFAULT 默认的隔离级别 :
2 ISOLATION_READ_UNCOMMITTED
Connection.TRANSACTION_READ_UNCOMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。
3 ISOLATION_READ_COMMITTED
Connection.TRANSACTION_READ_COMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
4 ISOLATION_REPEATABLE_READ
Connection.TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION_SERIALIZABLE
Connection.TRANSACTION_SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。


任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚

<tx:advice/> 和 <tx:attributes/> 标签里的 <tx:method/> 各种属性设置总结如下:

属性               是否必须      默认值                   描述
name               必须          与事务属性关联的方法名。 通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:'get*'、'handle*'、'on*Event'等等。
propagation        不必须        REQUIRED                 事务传播行为
isolation          不必须        DEFAULT                  事务隔离级别
timeout            不            -1                       事务超时的时间(以秒为单位)
read-only          不            false                    事务是否只读?
rollback-for       不                                     将被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'
no-rollback-for    不                                     被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException

到此事务的配置完成。




--------------------------------------------------------------------------------------------------------------------------------------


TranscationProxyFactory 代理方式管理事务的方法:

待续。。。。。
分享到:
评论

相关推荐

    struts2+spring3+ibatis项目整合案例

    Struts2、Spring3和iBATIS是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的Web应用。在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何...

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    SSI--struts2+spring2.5+ibatis项目实例

    通过这个SSI项目实例,开发者不仅可以学习到Struts2、Spring和iBatis的基本使用,还能理解它们如何协同工作,为大型企业级应用提供强大的支持。在实践中不断探索和优化,能更好地提升开发效率和代码质量。

    struts2+spring+Ibatis框架包

    iBatis与Spring的结合,可以让Spring管理SqlSession,提供事务控制,并且可以利用Spring的DAO支持,简化开发过程。 在"ssi_jar"这个压缩包中,可能包含了这三个框架的库文件,例如struts2相关的jar包(如struts2-...

    Spring-Struts-IBatis-AOP-Transaction

    Struts 2 与 Spring 的整合提供了更强大的功能,例如利用 Spring 的 DI 来管理 Struts 2 的动作类,以及事务管理。 **IBatis 框架** IBatis 是一个持久层框架,它将 SQL 查询与 Java 代码分离,允许开发者编写 SQL...

    SpringMVC精品资源--基于 SpringBoot + Spring + SpringMvc+Mybatis+.zip

    **Spring**:Spring是Java企业级应用开发的核心框架,提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。Spring的IoC容器管理着应用对象的生命周期和依赖关系,使代码更易于测试和解耦。 **...

    struts2+spring+ibatis+mysql

    这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、轻量级持久层框架Ibatis以及关系型数据库管理系统MySQL。 1. **Struts2**:Struts2是Apache软件基金会下的一...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    ibatis-sqlmap-2.jar.zip

    `ibatis-sqlmap-2.jar`是该版本的核心库文件,包含了iBatis框架的所有功能实现,包括SQL执行引擎、结果集映射、事务管理等。 1. SQL映射文件:iBatis的精髓在于它的SQL映射文件,如`sqlmap-config.xml`,它定义了...

    spring3+struts2+ibatis

    开发者可以从中学习到如何配置Spring的ApplicationContext、Struts2的struts.xml以及Ibatis的mybatis-config.xml,理解它们之间的交互机制。此外,通过分析Action、Service、DAO层的实现,可以进一步掌握各框架在...

    spring+struts2+ibatis整合的jar包

    Spring作为整体的框架容器,负责管理所有的Bean,包括Struts2和iBatis的相关组件。Struts2处理HTTP请求,调用Spring管理的业务服务,这些服务又通过Spring的数据访问层(DAO)与iBatis进行交互,执行数据库操作。...

    jpetstore4.0 (spring+struts+ibatis)

    2. **服务层管理**:Spring的Bean工厂可以管理服务层的bean,如DAO(Data Access Object)和Service对象,实现事务管理和数据访问。 3. **AOP**:Spring的AOP支持允许我们定义切面,如日志记录、事务管理等,这些切...

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

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

    struts2+spring+ibatis增删查改翻页代码示例

    在这个“struts2+spring+ibatis增删查改翻页代码示例”中,我们将深入探讨这三个框架如何协同实现数据管理的基本操作,并集成MySQL数据库和Tomcat web服务器。 首先,Struts2作为MVC(模型-视图-控制器)框架,主要...

    Spring+ibatis 保留ibatis事务的配置

    给定的XML配置文件展示了如何在Spring中配置ibatis数据源以及ibatis事务管理器。首先,注释掉的`BasicDataSource`部分是用来配置数据源的,这里没有启用,而是选择了使用JNDI数据源。实际生产环境中,通常会使用...

    mybaits-spring(ibatis-spring)-1.0.2-bundle

    而MyBatis-Spring通过提供SqlSessionTemplate和SqlSessionDaoSupport等工具类,使得MyBatis可以透明地与Spring的IoC容器和AOP事务管理相结合,减轻了开发负担。 1. SqlSessionTemplate:它是MyBatis-Spring的核心...

    spring+springMVC+iBatis+Json整合所需jar包

    2. **配置Spring**:创建Spring的配置文件,配置Bean、数据源、事务管理器等,以及SpringMVC的配置,如视图解析器、模型-视图-适配器(MVA)配置。 3. **配置SpringMVC**:设置DispatcherServlet,配置...

    maven搭建SpringMVC+spring+ibatis

    Ibatis与Spring框架集成后,可以使用Spring的DI功能管理数据库连接,同时通过MyBatis-Spring提供的MapperScannerConfigurer自动扫描并注册Mapper接口,实现DAO层的便捷开发。 在SpringMVC+Spring+Ibatis的架构中,...

    struts2+spring+ibatis整合项目实例

    在与Struts2和iBatis的整合中,Spring主要负责组件的管理和事务控制。`Struts+Spring+Ibatis整合框架搭建配置文档.doc`应该详细阐述了如何配置Spring以管理Struts2的Action和iBatis的数据源及SqlSession。 3. **...

    Struts2+Spring2+iBatis2整合的例子

    Struts2、Spring和iBatis是Java Web开发中三个非常重要的框架,它们分别负责表现层、业务层和数据访问层。将这三个框架整合在一起,...同时,也可以在此基础上进一步学习和扩展,如添加事务管理、缓存支持等高级特性。

Global site tag (gtag.js) - Google Analytics