`
lijingyao8206
  • 浏览: 219288 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

iBATIS&Spring合奏(三)--事务&动态SQL

阅读更多
     刚看了个恐怖片,总算有点灵感,继续总结Spring和iBATIS的东东。本来想今天梳理下iBATIS源码阅读时总结的经典设计模式。但是现在思绪比较凌乱,留到下一次吧。
      先说事务处理。iBATIS对于事务的支持比较基本的是基于JDBC的,当然也有JPA,EXTERNAL。这里就说说JDBC。其实看源码就知道,源码也只是对JDBC事务管理进行了轻量封装。核心处理在TransactionManager和Transaction。Spring对于iBATIS的事务支持也是折腾到jdbc中。
      1)可以看一下下面的beans.xml中有关transactionManager的配置(省略datasource了,可以参看前一篇文章配置):
	<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>   

     很明显的把datasource注入到transactionManager中来。
      2)下面就该定义tx:advice了:
<tx:advice id="transactionManagerAdivice"
		transaction-manager="transactionManager">
		<!--propagation默认值如果调用UserService类中的方法有Tran就用原来的Tran,自己作为Tran的一部分。没有创建新的
		isolation数据库的隔离级别  rollback-for默认  (name="get*" read-only="true")-->
		<tx:attributes>
			<tx:method name="*" isolation="READ_COMMITTED"
				propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntionException" />
		</tx:attributes>
	</tx:advice>

      话说回来,advice按照字面解释就是建议,这个建议中对于transactionManager的引用来处理一些需要事务管理的method。而这些method有着不同的事务管理需求,可以分别配置,这里用*代表所有方法,当然只是为了简便,实际中不可如此。
      3)aop:config来将事务管理织入切点定义的方法。
<!-- 表达式表示切入点为该类中的任何方法。所以当UserService类中方法调用时就会进行事务管理,并且当抛出RuntimeException时,自动进行回滚操作 -->
	<aop:config>
		<aop:pointcut
			expression="execution(* com.qiyun.spritis.service.UserService.*(..))"
			id="userServicePc" />
		<aop:advisor advice-ref="transactionManagerAdivice"
			pointcut-ref="userServicePc" />
		
	</aop:config>

     上文中UserService是纯Service类,调用DAO层—UserSqlMapDao。两个类的代码可以看前面两篇文章。advisor建议者给了point切点一个建议,就是在point中声明的匹配方法中建议它们加入事务管理逻辑,逻辑被spring注入,在advice-ref中指出。说得比较白话文了。在advisor里面直接定义pointcut也可以,但是就只能局部引用,因为是事务逻辑,没大关系哒。
      至此,Spring事务就加入到应用中了。当然还有注解的方式就不介绍了,官方文档还是介绍得很好的。官方文档,永远是程序员的屠龙刀啊。
     
       再谈谈动态SQL放到一起说只是因为比较小的模块,就不独立弄出来了,写一篇Blog要费很多神经Cell的。
       1)在sqlmap配置中添加如下代码(这里用到了Order,可以参看合奏一中的数据库图,POJO在此省略啦):
<typeAlias alias="order" type="com.qiyun.spritis.pojo.Order"/>
	
	<select id="getOrderByUser" parameterClass="com.qiyun.spritis.pojo.User"
		resultClass="order">
		SELECT 
			o.id as id, 
			o.goodname as goodname,
			o.user as username,
			o.goodprice as goodprice
		FROM orders o 
			<isNotNull property="username">
				INNER JOIN user a ON o.user=a.username 
			</isNotNull>
			<dynamic prepend="where">
				<isNotEmpty property="username" prepend="and "  open="(" close=")">
					a.username=#username#
				</isNotEmpty>
			</dynamic>
	</select>

     以上是在sqlmap中配置的。这里用到了alias,类的别名,偷懒方便的。这里简单说明下上面那句动态SQL翻译过来的意思吧:通过user表联合order查出在order中username非空的且查出的结果非空的order记录。有点绕。其实看这面,就知道用动态SQL只是iBATIS封装了一些我们要硬编码的东西,把SQL语句写活了,也就是写动态了,一些逻辑判断更加清晰,灵活了。
      2)在程序中调用动态SQL。其实和静态SQL,简单动态SQL(简化版本动态SQL)没什么太大差别。下面的代码中不用Spring,大家可以看看区别,其中加入了iBATIS,jdbc级别的事务管理。同样作为简单参考。代码如下:
public List<Order> getOrderByUser(User user) throws IOException,
			SQLException {
		String resource = "./SqlMapConfig.xml";
		Reader reader;
		reader = Resources.getResourceAsReader(resource);
		SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		try {

			sqlMap.startTransaction();
			List<Order> list = (List<Order>) sqlMap.queryForList(
					"getOrderByUser", user);

			for (int i = 0; i < list.size(); i++) {
				Order oo = list.get(i);
				System.out.println(oo.getId() + " " + oo.getUsername() + " "
						+ oo.getGoodname() + " " + oo.getGoodprice());
			}
			return list;
		} catch (Exception e) {
			sqlMap.endTransaction();
			e.printStackTrace();
		}
		sqlMap.commitTransaction();
		return null;
	}


      要提一句,这里SqlMapConfig.xml是配置在项目classpath里面的,里面要有datasource,因为这里没有用到Spring啦,没有肯定报错滴。
       3)Filter的一些说明。当然,有时候我们想要对查询的结果或者逻辑多一些控制(比如我想要查出price(价格)在10元以下的Order)。然后就想到了Filter。iBATIS也提供了很好的支持。OrderFilterRowHandler.java定义如下:
public class OrderFilterRowHandler implements RowHandler {
	public List<Order> list=new ArrayList<Order>();
	//父类方法,实例化对象会自动调用该方法--用到Proxy了,不多说了,你懂的。
	public void handleRow(Object o) {
		Order order=(Order)o;
		if((Double.parseDouble(order.getGoodprice()))<10.0)
			list.add(order);	
	}

	public List<Order> getList() {
		return list;
	}

}

      4)在调用时加上这个Filter。在getOrderByUser方法中替换原来的查询,加入如下:
OrderFilterRowHandler fh=new OrderFilterRowHandler();
sqlMap.queryWithRowHandler("getOrdersByListGood", user, fh);
List<Order> list1=fh.getList();	

      很easy就搞定了,当然也可以定义个XMLFilter将结果输出到一个XML文件中。都看自己兴趣爱好和需求吧。

       iBATIS事务和动态SQL的总结就到这里了。当然,介绍的比较简陋。后续的介绍中会把iBATIS源码中用到的设计模式拿出来总结下,就是比较纠结的过程了。又要搬出EA来画图了,眼花缭乱时留给下次吧。
       最后,老规矩,冷笑一刻:
       某程序员对书法十分感兴趣,退休后决定在这方面有所建树。花重金购买了上等的文房四宝。一日突生雅兴,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地 写下一行字:hello world。
2
1
分享到:
评论
4 楼 lijingyao8206 2015-08-26  
过奖过奖~
toknowme 写道
看来是才女一枚~   

3 楼 toknowme 2015-08-15  
看来是才女一枚~   
2 楼 lijingyao8206 2015-08-03  
是的,多阅读优秀的框架源码对于编码思维的形成有很大的好处~
henu_zhangyang 写道
学姐,大学期间都开始阅读框架源码了吗?

1 楼 henu_zhangyang 2015-07-30  
学姐,大学期间都开始阅读框架源码了吗?

相关推荐

    iBATIS&Spring合奏(一)--DAO

    标题中的“iBATIS&Spring合奏(一)--DAO”指的是在Java开发中,将iBATIS和Spring框架结合使用来实现数据访问层(DAO)的一种技术整合。iBATIS是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,提供...

    iBATIS&Spring合奏(二)--Flex前端融合

    在“iBATIS&Spring合奏(二)--Flex前端融合”中,博主Yunshen0909分享了关于如何在Java Web应用中结合使用这两种技术,特别是如何与Flex前端进行集成,以提升用户体验。 首先,iBATIS是一个持久层框架,它简化了...

    iBATIS-SqlMaps-2-Tutorial_cn.pdf

    iBATIS-SqlMaps-2-Tutorial_cniBATIS-SqlMaps-2-Tutorial_cn.pdf.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdf

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

    4. TransactionalExecutor:这是MyBatis-Spring的另一个重要组件,它负责在Spring事务管理下执行SQL。当在Spring的事务边界内运行时,TransactionalExecutor会确保SqlSession的操作与事务同步。 5. 1.0.2版本特性:...

    apache开源项目源码ibatis-3-core-src-3.0.0.227(ibatis框架java源程序)

    spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其优良的代码风格和高质量的源码是学习者难得的学习资料!

    iBATIS-SqlMaps-2_cn.rar_ibatis/spring

    在Spring中配置iBATIS,开发者可以通过Spring的DataSource和TransactionManager来管理数据源和事务,同时,通过SqlSessionFactoryBean来创建SqlSessionFactory,进一步创建SqlSession,从而执行SQL操作。 此外,...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    5. **动态SQL**:讲解如何使用iBATIS的动态元素来构建灵活的SQL语句,以应对复杂的查询需求。 6. **API使用**:介绍SqlSession、SqlSessionFactory、Executor等关键接口和类的使用方法。 7. **缓存机制**:解释...

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    ibatis-sqlmaps-2_cn

    此外,教程还会涵盖动态SQL,这是IBATIS的一大亮点,允许在运行时构建和修改SQL语句,提高了代码的复用性和可维护性。 在使用IBATIS的过程中,你可能会遇到参数映射和结果映射的问题。《ibatis-sqlmaps-2_cn》将...

    ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip

    iBATIS-SqlMaps-2-Tutorial_cn

    动态SQL是iBATIS的一大特色,它允许在SQL语句中使用条件判断、循环等逻辑,极大地增强了SQL的灵活性。 本书首先会引导读者理解iBATIS的基本架构,然后详细介绍如何创建和配置SqlMap,以及如何编写映射文件。映射...

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.200

    iBATIS-SqlMaps-2-快速入门教程.docx

    iBATIS-SqlMaps-2-快速入门教程 iBATIS-SqlMaps-2 是一个 Java 持久层框架,用于简化 Java 应用程序中的数据库交互。快速入门教程旨在帮助开发者快速了解 iBATIS-SqlMaps-2 的使用和配置。 知识点1:iBATIS-Sql...

    iBATIS-SqlMaps2入门代码文档

    ### iBATIS-SqlMaps2入门代码文档知识点详解 #### 一、简介 iBATIS-SqlMaps2是一款用于简化Java应用程序与数据库交互过程的框架。该框架通过配置文件定义了对象关系映射规则,使得开发者能够更加专注于业务逻辑而...

    iBATIS-SqlMaps-2_cn.pdf

    在实际应用中,iBATIS SQL Maps常与其他Java框架(如Spring)集成,以实现更强大的功能,如AOP(面向切面编程)和依赖注入。同时,随着技术的发展,iBATIS已被MyBatis所取代,但其设计理念和核心思想在MyBatis中得以...

    ibatis的sql-map dtd

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。在Ibatis中,`sql-map`和`sql-map-config`是两个重要的XML配置文件,...

    Spring-Struts-IBatis-AOP-Transaction

    在 "17-Prj-Spring-Struts-IBatis-AOP-Transaction" 这个项目中,这四个框架被集成在一起,形成一个强大的 web 应用开发解决方案。Spring 作为整个系统的基石,负责依赖注入和事务管理;Struts 2 处理 HTTP 请求,...

    iBATIS-SqlMaps-2 PDF文档资料(日文)

    ja.pdf》可能包含以下内容:基础安装和配置、SqlMap配置详解、数据源的设置、SQL映射文件的编写、动态SQL的使用、事务管理、结果集映射、参数映射、自定义类型处理器、异常处理以及如何在实际项目中集成iBATIS等。...

    iBATIS-SqlMaps-2_cn中文文档

    iBATIS-SqlMaps-2_cn中文文档

    转ibatis动态sql - phoebus0501 - 博客园.mht

    转ibatis动态sql - phoebus0501 - 博客园.mht

Global site tag (gtag.js) - Google Analytics