自己编写的分页工具类,根据不同的数据库类型,生成对应的分页sql信息,分享给大家,希望大家共勉,工具类有些地方,大家可能不需要,请根绝自己的需要进行修改使用,核心逻辑都在,如果大家觉得有什么不妥,欢迎大家随时指正

 package com.ideal.ieai.server.util;

 import com.ideal.ieai.core.JudgeDB;

 /**
* @ClassName: PageParamBean
* @Description: 根据数据库类型不同生成不同的分页方法的工具类
* @author: yue_sun
* @date: 2019年1月3日 下午12:53:09
*
* @Copyright: 2019-2027 www.idealinfo.com Inc. All rights reserved.
*
*/
public class PageParamBean
{
private String sql;
private int pagePara1 = 0;
private int pagePara2 = 0; private static String mysql = "mysql";
private static String oracle = "oracle";
private static String db2 = "db2"; private static PageParamBean instance = null; private PageParamBean()
{ } public static PageParamBean getInstance ()
{
if (null == instance)
{
instance = new PageParamBean();
}
return instance;
} public String getSql ()
{
return sql;
} public void setSql ( String sql )
{
this.sql = sql;
} public int getPagePara1 ()
{
return pagePara1;
} public void setPagePara1 ( int pagePara1 )
{
this.pagePara1 = pagePara1;
} public int getPagePara2 ()
{
return pagePara2;
} public void setPagePara2 ( int pagePara2 )
{
this.pagePara2 = pagePara2;
} /**
* @Title: getParamPageBean
* @Description: 获取分页sql及分页参数方法
* @param sql
* @param start
* @param limit
* @return
* @author: yue_sun
* @date: 2019年1月2日 上午10:09:25
*/
public PageParamBean getParamPageBean ( String sql, int start, int limit )
{
PageParamBean paramBean = new PageParamBean();
int pageParam1 = 0;
int pageParam2 = 0;
switch (JudgeDB.IEAI_DB_TYPE)
{
case 1:
sql = getQueryPageSQL(oracle, sql);
pageParam1 = start + limit;
pageParam2 = start;
break;
case 2:
sql = getQueryPageSQL(db2, sql);
pageParam1 = start + 1;
pageParam2 = start + limit;
break;
case 3:
sql = getQueryPageSQL(mysql, sql);
pageParam1 = start;
pageParam2 = limit;
break;
default:
break;
}
paramBean.setSql(sql);
paramBean.setPagePara1(pageParam1);
paramBean.setPagePara2(pageParam2);
return paramBean;
} public PageParamBean getParamPageBean ( String sql, String order, int start, int limit )
{
PageParamBean paramBean = new PageParamBean();
int pageParam1 = 0;
int pageParam2 = 0;
switch (JudgeDB.IEAI_DB_TYPE)
{
case 1:
sql = getQueryPageSQLNew(oracle, order, sql);
pageParam1 = start + limit;
pageParam2 = start;
break;
case 2:
sql = getQueryPageSQLNew(db2, order, sql);
pageParam1 = start;
pageParam2 = start + limit;
break;
case 3:
sql = getQueryPageSQLNew(mysql, order, sql);
pageParam1 = start;
pageParam2 = limit;
break;
default:
break;
}
paramBean.setSql(sql);
paramBean.setPagePara1(pageParam1);
paramBean.setPagePara2(pageParam2);
return paramBean;
} /**
* @Title: getQueryPageSQL
* @Description: 组织各种数据库的分页查询sql
* @param dbType
* @param sql
* @return
* @author: yue_sun
* @date: 2019年1月3日 上午9:40:40
*/
public static String getQueryPageSQL ( String dbType, String sql )
{
StringBuilder stringBuffer = new StringBuilder();
if (dbType.equals("mysql"))
{
stringBuffer.append(sql);
stringBuffer.append(" limit ?,?");
}
if (dbType.equals("oracle"))
{
stringBuffer.append("select * from ( select row_.*, rownum rownum_ from ( ");
stringBuffer.append(sql);
stringBuffer.append(" ) row_ where rownum <= ?) where rownum_ > ?");
}
if (dbType.equals("microsoft sql server"))
{
stringBuffer.append("select top ? ");
if (sql.indexOf("order by") != -1)
{
stringBuffer.append(sql.substring(sql.indexOf("select") + 7, sql.indexOf("order by"))); } else if (sql.indexOf("group by") != -1)
{ } else
{
stringBuffer.append(sql.substring(sql.indexOf("select") + 7, sql.length()));
}
stringBuffer.append(" where 1 not in (select top ? 1 ");
stringBuffer.append(sql.substring(sql.indexOf("from"), sql.length()));
stringBuffer.append(" )");
}
if (dbType.equals("postgresql"))
{
stringBuffer.append(sql);
stringBuffer.append(" limit ? offset ?");
}
if (dbType.indexOf("db2") != -1)
{
stringBuffer.append("select * from( select rownumber() over() as rownum_ ,a1.* from ( "); stringBuffer.append(sql); stringBuffer.append(" ) a1) a2 where a2.rownum_ between ? and ? ");
} if (dbType.indexOf("hsql") != -1)
{
stringBuffer.append("select limit ? ? * from (");
stringBuffer.append(sql);
stringBuffer.append(" )");
} return stringBuffer.toString();
} /**
* @Title: getQueryPageSQLNew
* @Description: 重载该方法,oracle 和 DB2 都用 > 和 <= 来做分页(加入order排序条件)
* @param dbType
* @param order
* @param sql
* @return
* @author: yue_sun
* @date: 2019年1月3日 上午9:40:40
*/
public static String getQueryPageSQLNew ( String dbType, String order, String sql )
{
StringBuilder stringBuffer = new StringBuilder();
if (dbType.equals("mysql"))
{
stringBuffer.append(sql);
stringBuffer.append(" " + order + " ");
stringBuffer.append(" limit ?,?");
}
if (dbType.equals("oracle"))
{
stringBuffer.append("SELECT * FROM ( SELECT row_number() over(" + order + ") AS RN , A.* FROM ( ");
stringBuffer.append(sql);
stringBuffer.append(" ) A ) B WHERE B.RN <= ? and B.RN > ?");
}
if (dbType.equals("microsoft sql server"))
{
stringBuffer.append("select top ? ");
if (sql.indexOf("order by") != -1)
{
stringBuffer.append(sql.substring(sql.indexOf("select") + 7, sql.indexOf("order by"))); } else
{
stringBuffer.append(sql.substring(sql.indexOf("select") + 7, sql.length()));
}
stringBuffer.append(" where 1 not in (select top ? 1 ");
stringBuffer.append(sql.substring(sql.indexOf("from"), sql.length()));
stringBuffer.append(" )");
}
if (dbType.equals("postgresql"))
{
stringBuffer.append(sql);
stringBuffer.append(" limit ? offset ?");
}
if (dbType.indexOf("db2") != -1)
{
stringBuffer.append("SELECT * FROM ( SELECT ROW_NUMBER() OVER(" + order + ") AS RN , A.* FROM ("); stringBuffer.append(sql); stringBuffer.append(" ) A ) B WHERE B.RN > ? and B.RN <= ?");
} if (dbType.indexOf("hsql") != -1)
{
stringBuffer.append("select limit ? ? * from (");
stringBuffer.append(sql);
stringBuffer.append(" )");
} return stringBuffer.toString();
} /**
* @Title: toCount
* @Description: 生成查询总数的sql的方法
* @param sql
* @return
* @author: yue_sun
* @date: 2019年1月2日 上午10:12:25
*/
public String toCount ( String sql )
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("SELECT COUNT(1) AS COUNT FROM ( ");
stringBuilder.append(sql);
stringBuilder.append(" ) TOTAL");
return stringBuilder.toString();
} }

工具类 分页工具类PageParamBean的更多相关文章

  1. PHP常用之封装分页工具类

    分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可.),这样既省时又省力还赚'工分'. 我封的这个分页工具类还比较完 ...

  2. PageUtil.java分页工具类

    package com.chabansheng.util; /** * 分页工具类 * @author Administrator * */ public class PageUtil { /** * ...

  3. 分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]http ...

  4. c#分页工具类,完美实现List分页

    using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Proje ...

  5. SpringBoot集成Mybatis-PageHelper分页工具类,实现3步完成分页

    在Mybatis中,如果想实现分页是比较麻烦的,首先需要先查询出总的条数,然后再修改mapper.xml,为sql添加limit指令. 幸运的是现在已经不需要这么麻烦了,刘大牛实现了一个超牛的分页工具 ...

  6. JAVA分页工具类

    最近写了一个代码生成工具,分享下该工具下的分页工具 一.分页工具类 package com.qy.code.api.page; import java.io.Serializable; import ...

  7. JAVA 分页工具类及其使用

    Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; ...

  8. mongoDB工具类以及测试类【java】

    java操作mongo工具类 package Utils; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; im ...

  9. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

随机推荐

  1. HTML符号代码速查表

    HTML实体符号被用作实现保留字符(reserved characters)或者表达键盘无法输入的一些常用字符.在大多数浏览器中默认的字符集为ISO-8859-1.HTML实体符号使我们在网页设计中经 ...

  2. linux 远程配置docker加速器

    https://www.jianshu.com/p/dca49964af04 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh ...

  3. pycharm pro版server激活

    从网上搜集了一些 License server 地址(有钱的一定要支持正版哦) http://idea.iteblog.com/key.php http://intellij.mandroid.cn ...

  4. Python numpy.ZIP 安装问题

    今天在python上安装numpy,按照网上教程,安装pip,然后命令行直接:pip install numpy  .但是一直因为资源问题下载失败. 后来下载了一个numpy-1.11.2.zip 安 ...

  5. 关于JavaScript的事件绑定

    js事件绑定的几种方式 JavaScript中有三种常用的绑定事件方法: 1. 在DOM元素中直接绑定: 2. 在JavaScript代码中绑定: 3. 绑定事件佳妮婷函数. 一.在DOM元素中直接绑 ...

  6. ESP8266烧录选项中的QIO 和 DIO解释

    https://blog.csdn.net/recclay/article/details/78956580 看到的由烧录引起的QIO和DIO问题探索.. 所以一般选择DIO QIO -> Qu ...

  7. 1 request模块

    官方文档真是好用的一匹 官方文档:https://2.python-requests.org//zh_CN/latest/index.html 参考blog:https://www.cnblogs.c ...

  8. C# socket异步通讯

    Server: using System; using System.Net; using System.Net.Sockets; using System.Text; namespace TCP_S ...

  9. android的ant编译打包

    Android本身是支持ant打包项目的,并且SDK中自带一个build.xml文件. 通过该文件,可以对文件进行编译.打包.安装等.并且支持多种方式打包,如debug或者release. 一般的,可 ...

  10. sql 同一行中,不同结果在不同列显示

    对不同条件查询到的结果在同一行中展示 尝试写过使用","和inner join两种方式,感觉使用","的更加直观 select table1.guid, tab ...