mysql、sqlserver、oracle分页,java分页统一接口实现

mysql、sqlserver、oracle分页,java分页统一接口实现 

定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量 

oracle分页: 

    select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart 

sqlServer分页: 

           select * from ( select top 页面容量 from( select top  页面容量*当前页码 * from 表 where 条件 order by 字段A) as temptable1 order by 

字段A desc) as temptable2 order by 字段A   

Mysql分页: 

         select * from mytable where 条件 limit 当前页码*页面容量-1 to 页面容量 

Java分页接口和实现类: 

package com.qg.demo.util; 

import java.sql.Connection; 
import java.sql.SQLException; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.sql.DataSource; 

import org.apache.commons.dbutils.QueryRunner; 
import org.apache.commons.dbutils.ResultSetHandler; 

public class OracleUtil { 
private String dataSourceName; 
private DataSource ds; 
public OracleUtil(String dataSourceName){ 
  this.dataSourceName = dataSourceName; 

public OracleUtil(){ 
  

public void setDataSourceName(String dataSourceName){ 
  this.dataSourceName = dataSourceName; 

public void init(){ 
  Context initContext; 
  try { 
   initContext = new InitialContext(); 
   ds = (DataSource)initContext.lookup(dataSourceName); 
  } catch (NamingException e) { 
   e.printStackTrace(); 
  } 

public int update(String sql,String[] param){ 
  int result = 0; 
  QueryRunner qr = new QueryRunner(ds); 
  try { 
   result = qr.update(sql,param); 
  } catch (SQLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  return result; 

public Object query(String sql,String[] param,ResultSetHandler rsh){ 
  QueryRunner qr = new QueryRunner(ds); 
  Object result = null; 
  try { 
   result = qr.query(sql, param,rsh); 
  } catch (SQLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  return result; 

public static Connection getConnection(){ 
  Connection conn = null; 
  try { 
   Context context = new InitialContext(); 
   DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds"); 
   conn = ds.getConnection(); 
   QueryRunner qr = new QueryRunner(ds); 
//   PreparedStatement pstmt = conn.prepareStatement("select * from guestbook"); 
//   ResultSet rs = pstmt.executeQuery(); 
//   while(rs.next()){ 
//       System.out.println(rs.getInt("g_id"));  
//    System.out.println(rs.getString("title")); 
//    System.out.println(rs.getString("remark")); 
//   } 
   
  } catch (NamingException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  }catch(SQLException e){ 
   e.printStackTrace(); 
  } 
  return conn; 

        

package com.qg.demo.util; 

import java.util.List; 

public interface Pagination { 
public boolean isLast(); 
public boolean isFirst(); 
public boolean hasNext(); 
public boolean hasPrevious(); 
public int getMaxElements();//最大记录数 
public int getMaxPage();//最大页码 
public int getNext(); 
public int getPrevious(); 
public int getPageSize(); 
public int getPageNumber(); 
public List<Object> getList(); 
public void setPageSize(int pageSize); 
public void setPageNumber(int pageNumber); 

package com.qg.demo.util; 

import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.regex.Pattern; 

import org.apache.commons.dbutils.ResultSetHandler; 
import org.apache.commons.dbutils.handlers.MapListHandler; 

public class OraclePaginationImpl implements Pagination { 
private int pageSize = 20; 
private int pageNumber = 1; 
private int maxElements; 
private int maxPage; 
private String sql; 
private OracleUtil db; 
public  OraclePaginationImpl(String sql){ 
  this.sql = sql; 
  init(); 

public OraclePaginationImpl(String sql,int pageSize, int pageNumber){ 
  this.sql = sql; 
  this.pageSize = pageSize; 
  this.pageNumber = pageNumber; 
  init(); 
  setPageNumber(pageNumber); 

private void init(){ 
  db = new OracleUtil("java:/comp/env/jdbc/oracleds"); 
  db.init(); 
  setMaxElements(); 
  setmaxPage(); 

private void setMaxElements() { 
  //select * from xxx order by xx desc 
  //select count(1) from xxx order by xx desc 
  String regex = "select((.)+)from"; 
  Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); 
  String[] s = p.split(this.sql); 
  String newSql = "select count(1) as total from "+s[1]; 
  ResultSetHandler handler = new ResultSetHandler(){ 
   public Object handle(ResultSet rs) throws SQLException{ 
    if(rs.next()){ 
     return new Integer(rs.getInt("total")); 
    }else{ 
     return null; 
    } 
   } 
  }; 
  this.maxElements = (Integer)db.query(newSql, null, handler); 
  

private void setmaxPage(){ 
  this.maxPage = (maxElements%pageSize == 0 ? maxElements/pageSize : (maxElements/pageSize +1)); 
  

private String sqlModify(String sql,int begin ,int end){ 
  StringBuffer buffer = new StringBuffer(); 
  buffer.append("select * from ( select rownum num,a.* from (") 
        .append(sql) 
        .append(") a where rownum <= ") 
        .append(end) 
        .append(") where num >= ") 
        .append(begin); 
  return buffer.toString(); 

private int getBeginElement() { 
  return (pageNumber-1) * pageSize +1; 

private int getEndElement() { 
  return (pageNumber*pageSize >=maxElements ? maxElements : pageNumber*pageNumber); 

public List<Object> getList() { 
  String newSql = this.sqlModify(sql, getBeginElement(), getEndElement()); 
  return (List)db.query(sql, null, new MapListHandler()); 

public int getMaxElements() { 
  return maxElements; 

public int getMaxPage() { 
  return maxPage; 

public int getNext() { 
   return pageNumber+1 >= maxPage ? maxPage : pageNumber+1; 

public int getPageNumber() { 
  return pageNumber; 

public int getPageSize() { 
  return pageSize; 

public int getPrevious() { 
  return pageNumber-1 <=1 ? 1 :pageNumber -1; 

public boolean hasNext() { 
  return pageNumber < maxPage; 

public boolean hasPrevious() { 
  return pageNumber > 1; 

public boolean isFirst() { 
  return pageNumber == 1; 

public boolean isLast() { 
  return pageNumber == maxPage; 

public void setPageNumber(int pageNumber) { 
  if(pageNumber>maxPage){ 
   this.pageNumber = maxPage; 
  }else if(pageNumber<1){ 
   this.pageNumber = 1; 
  }else{ 
   this.pageNumber = pageNumber; 
  } 

public void setPageSize(int pageSize) { 
  this.pageSize = pageSize; 


时间: 2024-11-01 11:58:58

mysql、sqlserver、oracle分页,java分页统一接口实现的相关文章

深入Mysql,SqlServer,Oracle主键自动增长的设置详解_Mysql

1.把主键定义为自动增长标识符类型MySql在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: 复制代码 代码如下: create table customers(id int auto_increment primary key not null, name varchar(15));insert into customers(name) values("name1"),("name2");select id fr

分页技术原理与实现之Java+Oracle代码实现分页(二)_java

紧接着上篇-分页技术原理与实现之分页的意义及方法(一) ,本篇继续分析分页技术.上篇讲的是分页技术的简单原理与介绍,这篇深入分析一下分页技术的代码实现. 上篇最后讲到了分页的最佳实现是在数据库层进行分页,而且不同的数据库有不同的分页实现,比如Oracle是用三层sql嵌套实现分页的.MySQL是用limit关键字实现的(上篇已讲到). 这篇以Java+Oracle为基础,讲解代码层的实现. 就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pag

java获得mysql和oracle链接的类_java

本文实例讲述了java获得mysql和oracle链接的类.分享给大家供大家参考.具体如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectDB { private static final String MYSQL = "jdbc:mysql://"; private static final String ORA

java分页拦截类实现sql自动分页_java

本文实例为大家分享了完整的java分页拦截类,供大家参考,具体内容如下 package com.opms.interceptor; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import org.apache.ibatis.executor.p

sqlserver的3种分页方式

  sqlserver的3种分页方式,如下: 01 ---sqlServer 2005 分页语句集合 02 ----缺点: 03 -- top:必须用户编写复杂sql,不支持复合主键 04 -- max:必须用户编写复杂sql,不支持非唯一列排序 05 --row:不支持sqlserver2000 06 -------------------------------- 07 select TOP @pagesize id,email,qq,wechart,phone,phone1 FROM co

求oracle数据库的分页显示sql语句

问题描述 求oracle数据库的分页显示sql语句 求大神告知oracle数据库的分页显示sql语句,用rownum查不到 解决方案 http://www.cnblogs.com/xiaopang2010/archive/2012/07/23/2604880.htmlhttp://www.2cto.com/database/201304/206296.html 解决方案二: String querySql = ""; querySql += "select x.* from

java分页,上一页,下一页,123页这种

问题描述 java分页,上一页,下一页,123页这种 求java分页,分成1.2.3.4.5页类型的和上一页下一页结合,谢谢!!!,想研究一下!!!已经会上一页下一页了!!! 解决方案 Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)http://blog.csdn.net/evankaka/article/details/49452201 可以参考下这里 解决方案二: 分页(上一页,下一页)GridView自定义分页样式(上一页,下一页,到第几页)php mys

MySQL大数据量快速分页实现

般刚开始学SQL语句的时候,会这样写 代码如下:  代码如下 复制代码 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 代码如下:  代码如下 复制代码 SELECT * FROM table ORDER BY id LIMIT 1000000, 10; 也许耗费几十秒 网上很多优化的方法是这样的 代码如下:  代码如下 复制代码 SELECT * FROM table WHERE id >= (SELECT

oracle中数据分页详解

今天做项目时要实现分页功能,以前只在mysql上弄过,oracle倒没试过,但知道有这样一个rownum这个东西. 但这个东西也不是那么容易用的,还是有蛮多地方要注意的.它不是物理上存在的一列,而是oracle自己在结果集中进行添加的. 首先我们来看一下我们的表结构先: 我们新建一个表:   也就一个字段ID而已,这方便我们直接地看到结果. 我们先随便插入几条数据: 先弄进去5条吧. 我们直接来一个: Sql代码   select rownum,id from test;     我们看到结果: