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" abstract="false" lazy-init="default" autowire="default"dependency-check="default"><property name="dataSource"><ref bean="dataSource" /></property> </bean>
<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>
<!-- 表达式表示切入点为该类中的任何方法。所以当UserService类中方法调用时就会进行事务管理,并且当抛出RuntimeException时,自动进行回滚操作 --><aop:config><aop:pointcutexpression="execution(* com.qiyun.spritis.service.UserService.*(..))"id="userServicePc" /><aop:advisor advice-ref="transactionManagerAdivice"pointcut-ref="userServicePc" /></aop:config>
<typeAlias alias="order" type="com.qiyun.spritis.pojo.Order"/><select id="getOrderByUser" parameterprepend="and " open="(" close=")">a.username=#username#</isNotEmpty></dynamic></select>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;}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;}}OrderFilterRowHandler fh=new OrderFilterRowHandler();sqlMap.queryWithRowHandler("getOrdersByListGood", user, fh);List<Order> list1=fh.getList();