实现对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 : 知识点来源以于前同事和互联网