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

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

    Sql代码
    1. select  *  from   user   where ... order   by ... limit 10,25     
      [sql] view plaincopy
       
      1.   

      根据以上的语句我们可以对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] view plaincopy
     
    1.    


    修改后

    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] view plaincopy
     
    1.    


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

    Java代码
    1. protected  String limitClauseStart; //起始参数   
    2. protected  String limitClauseCount; //数量参数   
    [java] view plaincopy
     
    1.    


    接下来就可以通过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  
    [sql] view plaincopy
     
    1.    


    接下来和上面的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   
      [xml] view plaincopy
       
      1.    

      接下来是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   
  • 相关阅读:
    超贴心的,手把手教你写爬虫
    人生苦短我用Python,本文助你快速入门
    RocketMQ 安装
    RocketMQ 简介
    2020年工作上的最大收获——监控告警体系
    .NET Core开源任务调度平台ScheduleMaster上新了
    从源码角度分析ScheduleMaster的节点管理流程
    使用 K8s 进行作业调度实战分享
    图解 K8s 核心概念和术语
    深度剖析 Kafka Producer 的缓冲池机制【图解 + 源码分析】
  • 原文地址:https://www.cnblogs.com/likeju/p/4711457.html
Copyright © 2011-2022 走看看