实现对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 : 知识点来源以于前同事和互联网
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上进行了一些功能的增强,其中包括了分页查询的功能。下面是使用 MyBatis-Plus 实现 SQL 分页的方法: 1. 在 pom.xml 文件中添加 MyBatis-Plus 的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 在 MyBatis 的配置文件中添加分页插件配置: ``` <!-- MyBatis Plus 分页插件配置 --> <plugins> <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"> <property name="dialectType" value="mysql"/> </plugin> </plugins> ``` 3. 在 DAO 接口中使用 MyBatis-Plus 提供的 Page 对象来实现分页查询: ``` import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface MyMapper extends BaseMapper<MyEntity> { List<MyEntity> selectPage(Page<MyEntity> page, @Param("condition") MyCondition condition); } ``` 4. 在 Service 层中调用 DAO 层的 selectPage 方法即可实现分页查询: ``` import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { @Autowired private MyMapper myMapper; public Page<MyEntity> getPage(int pageNum, int pageSize, MyCondition condition) { Page<MyEntity> page = new Page<>(pageNum, pageSize); myMapper.selectPage(page, condition); return page; } } ``` 以上就是使用 MyBatis-Plus 实现 SQL 分页的方法。需要注意的是,分页插件的 dialectType 属性需要配置为当前项目所使用的数据库类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值