分页查询
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;
}
}