zoukankan      html  css  js  c++  java
  • ] ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

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

    分类: spring.net+ibatis.net+codeSmith软件框架开发及应用 299人阅读 评论(0) 收藏 举报

    最近在看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 >    

  • 相关阅读:
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结v2
    JS设置cookie、读取cookie、删除cookie
    Atitit 图像处理30大经典算法attilax总结
    Atitit数据库层次架构表与知识点 attilax 总结
    Atitit 游戏的通常流程 attilax 总结 基于cocos2d api
    Atitti css transition Animation differ区别
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
    Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式
    Atitit 混合叠加俩张图片的处理 图像处理解决方案 javafx blend
    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  • 原文地址:https://www.cnblogs.com/lexus/p/2348446.html
Copyright © 2011-2022 走看看