ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

最近在看iBatis时,想做用动态Sql做个分布。因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能。所以要对生成后的代码做修改。我在Java高手真经的一书中看到有做了MySql SqlServer Oracle的分页。实现如下:
MySql-->
首先说说MySql的分页语句

Sql代码
  1. select * from user where...order by... limit 10,25     
      
    

    根据以上的语句我们可以对ibator生成后的代码进行修改。
    第一修改User_sqlMap.xml
    修改前
Xml代码
  1. <select id="ibatorgenerated_selectByExample"         resultMap="ibatorgenerated_BaseResultMap"  
  2.     parameterClass="com.demo.ibatis.beans.UserExample">  
  3.     select ID, LOGIN_NAME, PASSWORD   
  4.     from user   
  5.     <isParameterPresent>  
  6.         <include refid="user.ibatorgenerated_Example_Where_Clause" />  
  7.                <isNotNull property="orderByClause">  
  8.                 order by $orderByClause$   
  9.                        </isNotNull>  
  10.         </isParameterPresent>  
  11. </select>  
 


修改后

Xml代码
  1. <select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap"  
  2.         parameterClass="com.demo.ibatis.beans.UserExample">  
  3.         select ID, LOGIN_NAME, PASSWORD   
  4.         from user   
  5.     <isParameterPresent>  
  6.         <include refid="user.ibatorgenerated_Example_Where_Clause" />  
  7.             <isNotNull property="orderByClause">  
  8.                 order by $orderByClause$   
  9.                         </isNotNull>  
  10.             [b]<isNotNull property="limitClauseStart">  
  11.                 limit   
  12.                 $limitClauseStart$,$limitClauseCount$   
  13.             </isNotNull>[/b]   
  14.     </isParameterPresent>  
  15. </select>  
 


重要的是黑色的字体是添加到原来的xml中的。接下来修改UserExample.java
在该类中添加两个字段和相应的getter/setter方法

Java代码
  1. protected String limitClauseStart;//起始参数   
  2. protected String limitClauseCount;//数量参数  
 


接下来就可以通过Dao调用selectByExample()方法测试,好的以上就是MySql的分页。SqlServer的分页比较难了,因为 SqlServer中没有limit的关键字。
看看SqlServer的分页语句,那当然 SqlServer人分布方法有很多种。这里我采用其中的一种。
语句如下:

Sql代码
  1.   SELECT TOP 页大小 *   
  2.   FROM TestTable   
  3.   WHERE (ID NOT IN  
  4.           (SELECT TOP 页大小*页数 id   
  5.          FROM 表   
  6.          ORDER BY id))   
  7. ORDER BY ID  
 


接下来和上面的MySql一样也进行修改
修改xml

Xml代码
  1. <select id="ibatorgenerated_selectByExample" resultMap="ibatorgenerated_BaseResultMap"  
  2.         parameterClass="com.demo.ibatis.beans.UserExample">  
  3.         [b] <isNotNull property="limitClauseStart">  
  4.             SELETE TOP $limitClauseCount$ * FROM user where (ID NOT IN    
  5.                        (SELECT TOP $limitClauseStart$ ID    
  6.                   </isNotNull>[/b]   
  7.                    <isNull property="limitClauseStart">  
  8.             SELETE *    
  9.           </isNull>  
  10.                     FROM user    
  11.         from user   
  12.     <isParameterPresent>  
  13.         <include refid="user.ibatorgenerated_Example_Where_Clause" />  
  14.             <isNotNull property="orderByClause">  
  15.                 order by $orderByClause$   
  16.                                [b]  <isNotNull property="limitClauseStart">  
  17.                      ))order by $orderByClause$   
  18.                     </isNotNull>[/b]   
  19.                         </isNotNull>  
  20.     </isParameterPresent>  
  21. </select>  
     

    接下来是ORacle的,和上面都是差不多的这里不多说。
    语法:
    select* from(select rownum tid,user.* FROM (select * from user where id>1 order by ID desc)user where where rownum<35) where tid>10;
    修改Xml,
Xml代码
  1. <select id="ibatorgenerated_selectByExample"     resultMap="ibatorgenerated_BaseResultMap"  
  2.         parameterClass="com.demo.ibatis.beans.UserExample">  
  3.         [b] <isNotNull property="limitClauseStart">  
  4.             select* from(select rownum tid,user.* FROM (   
  5.                   </isNotNull>[/b]   
  6.                    select * from user   
  7.     <isParameterPresent>  
  8.         <include refid="user.ibatorgenerated_Example_Where_Clause" />  
  9.             <isNotNull property="orderByClause">  
  10.                 order by $orderByClause$                 
  11.                         </isNotNull>  
  12.                         [b]  <isNotNull property="limitClauseStart">  
  13.                    <![[CDATA )user where where rownum<$limitClauseCount$+$limitClauseStart$+1) where tid>$limitClauseStart$;]]>  
  14.                  </isNotNull>[/b]   
  15.     </isParameterPresent>  
  16. </select> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值