java分页加排序代码 java分页page类( 七 )


//调整待显示的页码
if(intPageintPageCount) intPage = intPageCount;
%
table border="1" cellspacing="0" cellpadding="0"
tr
th姓名/th
th年龄/th
/tr
%
if(intPageCount0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(iintPageSize!sqlRst.isAfterLast()){
%
tr
td%=sqlRst.getString(1)%/td
td%=sqlRst.getString(2)%/td
/tr
%
sqlRst.next();
i++;
}
}
%
/table
很显然,这种方法没有考虑到代码重用的问题,不仅代码数量巨大,而且在代码需要修改的情况下 , 将会无所适从 。
使用Vector进行分页
还见过另一些实现分页的类 , 是先将所有记录都select出来,然后将ResultSet中的数据都get出来 , 存入Vector等集合类中,再根据所需分页的大小,页数,定位到相应的位置,读取数据 。或者先使用前面提到的两种分页方法,取得所需的页面之后,再存入Vector中 。
扔开代码的效率不说,单是从程序结构和使用的方便性上讲,就是很糟糕的 。比如,这种做法支持的字段类型有限 , int, double, String类型还比较好处理,如果碰到Blob, Text等类型 , 实现起来就很麻烦了 。这是一种更不可取的方案 。
一个新的Pageable接口及其实现
很显然,看过上面三种实现方法后,我们对新的分页机制有了一个目标,即:不与具体数据库相关;尽可能做到代码重用;尽可能与原JDBC接口的使用方法保持一致;尽可能高的效率 。
首先 , 我们需要提供一个与java.sql.ResultSet向下兼容的接口 , 把它命名为Pageable,接口定义如下:
public interface Pageable extends java.sql.ResultSet{
/**返回总页数
*/
int getPageCount();
/**返回当前页的记录条数
*/
int getPageRowsCount();
/**返回分页大小
*/
int getPageSize();
/**转到指定页
*/
void gotoPage(int page) ;
/**设置分页大小
*/
void setPageSize(int pageSize);
/**返回总记录行数
*/
int getRowsCount();
/**
* 转到当前页的第一条记录
* @exception java.sql.SQLException 异常说明 。
*/
void pageFirst() throws java.sql.SQLException;
/**
* 转到当前页的最后一条记录
* @exception java.sql.SQLException 异常说明 。
*/
void pageLast() throws java.sql.SQLException;
/**返回当前页号
*/
int getCurPage();
}
这是一个对java.sql.ResultSet进行了扩展的接口,主要是增加了对分页的支持 , 如设置分页大?。?跳转到某一页,返回总页数等等 。
接着,我们需要实现这个接口,由于这个接口继承自ResultSet , 并且它的大部分功能也都和ResultSet原有功能相同,所以这里使用了一个简单的Decorator模式 。
PageableResultSet2的类声明和成员声明如下:
public class PageableResultSet2 implements Pageable {
protected java.sql.ResultSet rs=null;
protected int rowsCount;
protected int pageSize;
protected int curPage;
protected String command = "";
}
可以看到,在PageableResultSet2中,包含了一个ResultSet的实例(这个实例只是实现了ResultSet接口,事实上它是由各个数据库厂商分别实现的),并且把所有由ResultSet继承来的方法都直接转发给该实例来处理 。
PageableResultSet2中继承自ResultSet的主要方法:
//……
public boolean next() throws SQLException {
return rs.next();
}
//……

推荐阅读