自己编写的分页工具类,根据不同的数据库类型,生成对应的分页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. Redis03——Redis架构

    Redis架构 1.1.问题 redis是单线程,单实例,为什么并发那么多,依旧很快呢? 回答:因为调用了系统内核的epoll 1.2.Linux的早期版本 Linux有Linux kernal,我们 ...

  2. Elasticsearch中Mapping

    映射(Mapping) 概念:创建索引时,可以预先定义字段的类型以及相关属性.从而使得索引建立得更加细致和完善.如果不预先设置映射,会自动识别输入的字段类型. 官方文档(字段数据类型):https:/ ...

  3. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  4. BZOJ 1015 并查集&连通块

    很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或 ...

  5. Websocket @serverendpoint 404

    今天写一个前后端交互的websocket , 本来写着挺顺利的,但测试的时候蒙了,前端websocket发的连接请求竟然连接不上 返回状态Status 报了个404 ,然后看后台onError方法也没 ...

  6. 《Python基础教程》第二章:列表和元组(1)

    列表可以修改,元组则不能 字符串就是一个由字符组成的序列 使用分片操作来访问一定范围内的元素,分片操作的实现需要提供两个索引作为边界,第一个索引的元素是包含在分片内的,而第二个不包含在分片内. 如果分 ...

  7. NoSQL数据库技术实战-第1章 NoSQL的数据一致性 传统关系型数据库的ACID

    在看着章节的时候,我简单的回顾了一下关系型数据库的事务处理的ACID原则,其中原子性和持久性比较好理解.由于以前没有深入去研究.关于一致性和隔离性上我产生了疑问,在整理后分析如下:   一致性:书中所 ...

  8. 【Share Code | HTML & CSS & Javascript】动画片段幻灯片

    [查看demo & 下载资源](https://zhaoshuquan.com/posts/15 介绍 本文使用"Pieces"库轻松实现动画片段幻灯片效果. 今天我们想向 ...

  9. for 循环用了那么多次,但你真的了解它么?

    其实我们写代码的时候一直都在使用for循环,但是偶尔还是会纠结用哪一个循环. 一.基础的for循环 0.使用while也是一种循环方式,此处探究for相关的循环,就不做拓展了. 1.遍历数组的时候,初 ...

  10. codevs 1013 求先序排列 2001年NOIP全国联赛普及组 x

                         题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Inpu ...