博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iBATIS&Spring合奏(三)--事务&动态SQL
阅读量:2014 次
发布时间:2019-04-28

本文共 3291 字,大约阅读时间需要 10 分钟。

     刚看了个恐怖片,总算有点灵感,继续总结Spring和iBATIS的东东。本来想今天梳理下iBATIS源码阅读时总结的经典设计模式。但是现在思绪比较凌乱,留到下一次吧。
      先说事务处理。iBATIS对于事务的支持比较基本的是基于JDBC的,当然也有JPA,EXTERNAL。这里就说说JDBC。其实看源码就知道,源码也只是对JDBC事务管理进行了轻量封装。核心处理在TransactionManager和Transaction。Spring对于iBATIS的事务支持也是折腾到jdbc中。
      1)可以看一下下面的beans.xml中有关transactionManager的配置(省略datasource了,可以参看前一篇文章配置):
     很明显的把datasource注入到transactionManager中来。
      2)下面就该定义tx:advice了:
      话说回来,advice按照字面解释就是建议,这个建议中对于transactionManager的引用来处理一些需要事务管理的method。而这些method有着不同的事务管理需求,可以分别配置,这里用*代表所有方法,当然只是为了简便,实际中不可如此。
      3)aop:config来将事务管理织入切点定义的方法。
     上文中UserService是纯Service类,调用DAO层—UserSqlMapDao。两个类的代码可以看前面两篇文章。advisor建议者给了point切点一个建议,就是在point中声明的匹配方法中建议它们加入事务管理逻辑,逻辑被spring注入,在advice-ref中指出。说得比较白话文了。在advisor里面直接定义pointcut也可以,但是就只能局部引用,因为是事务逻辑,没大关系哒。
      至此,Spring事务就加入到应用中了。当然还有注解的方式就不介绍了,官方文档还是介绍得很好的。官方文档,永远是程序员的屠龙刀啊。
     
       再谈谈动态SQL放到一起说只是因为比较小的模块,就不独立弄出来了,写一篇Blog要费很多神经Cell的。
       1)在sqlmap配置中添加如下代码(这里用到了Order,可以参看合奏一中的数据库图,POJO在此省略啦):
     以上是在sqlmap中配置的。这里用到了alias,类的别名,偷懒方便的。这里简单说明下上面那句动态SQL翻译过来的意思吧:通过user表联合order查出在order中username非空的且查出的结果非空的order记录。有点绕。其实看这面,就知道用动态SQL只是iBATIS封装了一些我们要硬编码的东西,把SQL语句写活了,也就是写动态了,一些逻辑判断更加清晰,灵活了。
      2)在程序中调用动态SQL。其实和静态SQL,简单动态SQL(简化版本动态SQL)没什么太大差别。下面的代码中不用Spring,大家可以看看区别,其中加入了iBATIS,jdbc级别的事务管理。同样作为简单参考。代码如下:
public List
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
list = (List
) 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
list=new ArrayList
(); //父类方法,实例化对象会自动调用该方法--用到Proxy了,不多说了,你懂的。 public void handleRow(Object o) { Order order=(Order)o; if((Double.parseDouble(order.getGoodprice()))<10.0) list.add(order); } public List
getList() { return list; }}
      4)在调用时加上这个Filter。在getOrderByUser方法中替换原来的查询,加入如下:
OrderFilterRowHandler fh=new OrderFilterRowHandler();sqlMap.queryWithRowHandler("getOrdersByListGood", user, fh);List
list1=fh.getList();
      很easy就搞定了,当然也可以定义个XMLFilter将结果输出到一个XML文件中。都看自己兴趣爱好和需求吧。
       iBATIS事务和动态SQL的总结就到这里了。当然,介绍的比较简陋。后续的介绍中会把iBATIS源码中用到的设计模式拿出来总结下,就是比较纠结的过程了。又要搬出EA来画图了,眼花缭乱时留给下次吧。
       最后,老规矩,冷笑一刻:
       某程序员对书法十分感兴趣,退休后决定在这方面有所建树。花重金购买了上等的文房四宝。一日突生雅兴,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地 写下一行字:hello world。

转载地址:http://xljxf.baihongyu.com/

你可能感兴趣的文章
Ubuntu Manpage: ajaxterm - Web based terminal written in python
查看>>
COST CUTTING THE ALAN GREENBERG WAY
查看>>
景甜_百度百科
查看>>
30岁生日,媳妇赏的,U-BOAT手表一枚-数字尾巴
查看>>
基于倒排索引的关系数据库全文检索查询效率研究
查看>>
基于加权相似度的相关性排序算法的研究 - 中国学术期刊网络出版总库
查看>>
基于相关反馈技术的检索结果排序模型研究 - 中国优秀硕士学位论文全文数据库...
查看>>
垂直搜索引擎分类索引系统的设计与实现 - 中国优秀硕士学位论文全文数据库...
查看>>
情报学报
查看>>
分享:c++ 类型转换
查看>>
std::map, std::multimap, std::tr1::unordered_map 区别 - 笔记本 - 博客频道 - CSDN.NET
查看>>
unordered_set::load_factor - C++ Reference
查看>>
boost库之Hash - 兔子的技术博客 - C++博客
查看>>
std::find ,set.find, multiset.find, map.find和multimap.find算法总结 - Hibernate4 - 博客园
查看>>
std::find ,set.find, multiset.find, map.find和multimap.find算法总结
查看>>
淘宝核心系统团队博客 | linux异步IO编程实例分析
查看>>
linux后端服务程序之信号处理
查看>>
ulimit限制之nproc问题
查看>>
saghul, on code « How do event loops work in Python?
查看>>
基于EPOLL写的HTTP服务器(加入了线程池)
查看>>