实现对ibatis原生SQL的拦截改造-可以实现物理分页等(咋个办呢 zgbn)

实现对ibatis原生SQL的拦截改造-可以实现物理分页等


spring-ibatis-ext-plugin.1.0.0下载附有源代码


描述:

针对连接ibatis执行SQL前做SQL拦截,并对原生的SQL做扩展性的改造,来完成我们在需求方面ibatis自身不能完成的事情。

基本思路就是找到ibatis执行sql的地方,截获sql并重新组装sql。通过分析ibatis源码知道,最终负责执行sql的类是 com.ibatis.sqlmap.engine.execution.SqlExecutor,此类没有实现任何接口,这多少有点遗憾,因为接口是相对稳定契约,非大的版本更新,接口一般是不会变的,而类就相对易变一些,所以这里的代码只能保证对当前版本。

例如

一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用了特定数据库的分页机制,效率相对较高。本文讲述的就是如何在不重新编译ibatis源码的前提下,为ibatis引入hibernate式的物理分页机制。

ExtSqlDialect接口说明

com.zgbn.ext.ibatis.sqlmap.engine.mapping.dialect.ExtSqlDialect
是一个改造原生SQL的接口,主要针对一些改造SQL,由于数据库不同导致SQL的不同,对其做不同的实现。
 /*在version="1.0.0"中其接口有如下几个方法*/
 //对原生SQL,做分页改造
 public String getLimitSql(String sql ,  int skipResults, int maxResults) ;
 //对原生SQL,做count改造
 public String getCountSql(String sql) ;
 //SQL方言描述,目的为了日志的打印。
 public String dialectInfo() ;
其中
com.zgbn.ext.ibatis.sqlmap.engine.mapping.dialect.Db2ExtSqlImpl
是对
com.zgbn.ext.ibatis.sqlmap.engine.mapping.dialect.ExtSqlDialect
的一个实现,完成SQL方言的功能。

spring配置文件例子:

 <!-- 将ibatis交给spring管理 start -->
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="/WEB-INF/classes/sqlmap-config.xml" />
  <property name="mappingLocations" value="classpath:/ibatis/*-sqlmap.xml" />
  <property name="dataSource" ref="dataSource" />
 </bean>

 <bean id="db2ExtSql" class="com.zgbn.ext.ibatis.sqlmap.engine.mapping.dialect.Db2ExtSqlImpl" />
 <bean id="sqlExecutor" class="com.zgbn.ext.ibatis.sqlmap.engine.execution.ExtSqlExecutor">
  <!-- 继承ibatis的SqlExecutor类,对其扩展 -->
  <property name="extSqlDialect" ref="db2ExtSql" />
 </bean>

 <bean id="dao"
  class="com.zgbn.ext.springframework.orm.support.ExtSqlMapClientDaoSupport"
  init-method="initialize">
  <!-- 继承spring的 SqlMapClientDaoSupport类,对其扩展,并在此注入扩展后的sqlExecutor对象,替换原来的ibatis的sqlExecutor对象。-->
  <property name="sqlMapClient" ref="sqlMapClient" />
  <property name="sqlExecutor" ref="sqlExecutor" />
 </bean>
 <!-- 将ibatis交给spring管理 end -->
date : 2011-9-23
remark : 知识点来源以于前同事和互联网
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值