开发手记---分页查询

来源:互联网 发布:传奇怪物数据论坛 编辑:程序博客网 时间:2024/05/16 04:41

分页查询

JAVA开发中的一个重难题

 

说明:

我做的这个分页类,实现了每次查询取出一页的数据,解决了数据库性能问题.

添加的连接池的支持,解决了连接耗时问题.

 

过程:

首先初始化一个Page类,其中三个参数

分别为:要执行的SQL,操作的表,及每页记录数

初始得到总记录,页.

用getPage调用PageSet得到单页,返回ResultSet

 

 

package shop.Page;

/**
 数据查询分页类
 */

import java.sql.*;
import shop.DbPool.*;//自定义的连接池类


public class Page {

  private int pageCount=0;//总页数
  private int pageNo=1;//当前页
  private int pageSize=10;//每页记录数
  private int rowCount=0;//总记录数
  private String sql="";//查询语句

  private ResultSet rs;
  private Connection con;
  Pool pool;
  ExceuteQuery ex; //自定义CONNECTION查询类,用于查询返回
  PageSet pageset=new PageSet();//子页集
  Statement stmt;

  public Page(String sql,String table,int pageS) {
    //初始化查询
    pageSize=pageS;
    this.sql=sql;
   
    //////////////////查询总记录数//////////////
    //从连接池取得连接
    pool = Pool.getInstance();
    con = pool.getConnection();
    ex = new ExceuteQuery(con);

    //查询
     try{
      rs=ex.execute("select count(*) from "+table);
   
      if (rs.next())
        rowCount = rs.getInt(1);//取得总记录数
    }
    catch(Exception e)
    {
      System.out.println("查询总记录数出错,位置:Page.Page");
    }
   
    pageCount=rowCount/pageSize+1;//计算总页数
   
    pool.freeConnection(con);
  }
 
  //取得一页
 public ResultSet getPage()
 {
   ResultSet rss=null;
   rss=pageset.getPage(sql,(pageNo-1)*pageSize,pageSize);
   return rss;
 }

 //取得指定的一页
 public ResultSet getPage(int pagenum)
 {
   ResultSet rss=null;
   if(pagenum>=1&&pagenum<=pageCount)//指定页数在总页数范围内
   {  
     rss=pageset.getPage(sql,(pagenum-1)*pageSize,pageSize);
     pageNo=pagenum;
   }
   return rss;
 }
 
 //取得前一页
public ResultSet getPrePage()
{
  ResultSet rss=null;
  if(pageNo>1)
  {
    pageNo--;
    rss = pageset.getPage(sql, (pageNo - 2) * pageSize, pageSize);
  }
  return rss;
}

//取得后一页
public ResultSet getNextPage()
{
 ResultSet rss=null;
 if(pageNo<pageCount)
 {
   pageNo++;
   rss = pageset.getPage(sql, pageNo * pageSize, pageSize);
 }
 return rss;
}
 
 
  //首页
  public ResultSet firstPage()
  {
  ResultSet rss=null;
  rss=pageset.getPage(sql,0,pageSize);
  return rss;
  }

  //尾页
  public ResultSet lastPage()
  {
    ResultSet rss=null;
    rss=pageset.getPage(sql,(pageCount-1)*pageSize,pageSize);
    return rss;

  }

  //获得总页数
  public int getPageCount()
  {
    return pageCount;
  }

  //获得总记录数
  public int getRowCount()
  {
    return rowCount;
  }

  //获得页面记录数
  public int getPageSize()
  {
    return pageSize;
  }

  //获得当前页号
 public int getPageNo()
 {
   return pageNo;
 }
 
 //是否有后页
 public boolean next()
 {
   if(pageNo<pageCount)
    {
      pageNo++;
      return true;
     }
  else return false;
 }
 
 //是否有前页
 public boolean pre()
 {
   if(pageNo>1)
     return true;
   else return false;
 }


}

 

 

package shop.Page;

/**
 分页查询,单页查询
 提取单页数据供Page调用
 MySql中使用limit 记录条数 offset 起始记录 来得到一页数据
 */

import java.sql.*;
import shop.DbPool.*; //自定义的连接池类

public class PageSet {

  private ResultSet rs;
  private Connection con;
  Pool pool;
  ExceuteQuery ex; //自定义CONNECTION查询类,用于查询返回

  public PageSet() {

  }

  //返回一页
  public ResultSet getPage(String sql, int start, int size) {

    //从连接池取得连接
    pool = Pool.getInstance();
    con = pool.getConnection();
    ex = new ExceuteQuery(con);

    //构造查询语句
    String st = null;
    String si = null;
    st = st.valueOf(start);
    si = si.valueOf(size);
    String sqll = " limit " + si + " offset " + st; //此句用于在MYSQL中查询特定大小的一页

    //查询
    rs = ex.execute(sql + sqll);
    pool.freeConnection(con);
   
    return rs;
  }

 

}

 
原创粉丝点击