分页处理一直是我想做的,心里面总觉得它很难,现在把它搞出来了,不过还是心有余悸。
一般的分页处理有2种方式,方式一是一次把所有的数据都读出来,然后使用游标进行每次移动固定的次数。
方式二是使用limit关键字,在每次执行的时候传递不同的参数进行执行。
显然在数据量比较少的时候使用方式一和方式二没有太大的区别,但是当数据量比较大的时候,显然是用方式二比较合适。因为方式一一次读出所有的数据会占用大量的内存。
我使用的是第二种方式,这个地方使用到了2条sql语句,第一句是将所有的行数读出来,这个时候使用count关键字效率会比较高,第二句是分次读出数据。代码如下:
public HashMap<String, Integer> findUserNumberByDatesLimit(String filePath,String offSetParam) {
Connection conn=null;
ResultSet rs = null;
this.filePath=filePath;
if (offSetParam == null)
offSet = 0;
else
offSet = Integer.parseInt(offSetParam);
String sqlString="";
Map<String,Integer> resultSetMap=new HashMap<String,Integer>();
try{
conn=this.getDataSource().getConnection();
conn.setAutoCommit(false);
rs= query2ResultSet(conn,DBSql.SELECT_ALL_CREATEUSER_COUTNS);
while(rs.next()){
this.total=rs.getInt(1);
}
// this.total=totalRecode(rs);
// 设置当前页数和总页数
totalPages = (int)Math.ceil((double)this.total/this.maxLine);
currentPages = (int)Math.floor((double)offSet/this.maxLine+1);
if(total>0){
sqlString = DBSql.SELECT_ALL_CREATEUSER_COUNTS_LIMIT + " LIMIT " + offSet + " , " + maxLine;
rs= query2ResultSet(conn,sqlString);
}
while(rs.next()){
resultSetMap.put(rs.getString(1), rs.getInt(2));
}
}catch(SQLException e){
SQLUtil.rolback(conn);
e.printStackTrace();
}finally{
SQLUtil.close(conn);
}
return (HashMap<String, Integer>) resultSetMap;
}
//**********显示翻页提示栏*************
// 显示首页、下页、上页、尾页
@Override
public String pageLegend(String startTime,String endTime) {
String str = "";
int first, next, prev, last;
first = 0;
next = offSet + maxLine;
prev = offSet - maxLine;
last = (this.totalPages - 1) * maxLine;
if(offSet >= maxLine){
str += " <A href=" + filePath + "?offset=" + first + "startTime="+startTime+"endTime="+endTime+" ><strong> 首页 </strong></A> ";
}
else{
str += "<strong> 首页 </strong>";
}
if(prev >= 0){
str += " <A href=" + filePath + "?offset=" + prev + "&startTime="+startTime+"&endTime="+endTime+"><strong> 前页 </strong></A> ";
}
else{
str += "<strong> 前页 </strong>";
}
if(next < total){
str += " <A href=" + filePath + "?offset=" + next + "&startTime="+startTime+"&endTime="+endTime+"><strong> 后页 </strong></A> ";
}
else{
str += "<strong> 后页 </strong>";
}
if(totalPages != 0 && currentPages < totalPages){
str += " <A href=" + filePath + "?offset=" + last + "&startTime="+startTime+"&endTime="+endTime+ "><strong> 尾页 </strong></A>";
}
else{
str += "<strong> 尾页 </strong>";
}
str += "<strong> 页次:" + getCurrentPages() + "/" + getTotalPages() + "页 ";
str += maxLine + "条/页 " + "共" + total + "条</strong>";
return str;
}
我看网上很多的分页处理是使用得存储过程,这个东西也是我一直很畏惧的,以后遇到了再学吧。^-^~~