分页查询重构

分页查询中要能根据当前页的页号和页面大小计算出每次分页的第一条数据行号,这样知道了当前要查询页的第一条数据行号和该页共几条记录就能确定分页需要查询的数据范围,在具体实现时可以按如下方式编写
@Override
public Page ListByPage(Map params) {
  Integer currentPage = (Integer)params.get( "pageIndex");
 Integer pageSize  = (Integer)params.get( "pageSize");
  Integer startNo =(currentPage-1)*pageSize;
 return templateQLService.findByPagedSQLBeanQuery("case-shareExpert-list", null, startNo, pageSize, DataVo.class);
}
从上面的例子可以看出,这个方法是个业务层的方法为实现分页查询使用,首先方法接受的参数是个map类型,这是为了集中存放多个传送的参数,经过解析map中的参数后,再根据当前页号和页面上数据个数计算分页时当前页面上的第一条数据行号,最后调用查询数据库的方法做分页查询。
这里显然存在两个问题,一 这个业务方法接收的参数只有当前页号和页面大小两个参数,但还放到了map中传递,这样在接收这两个参数时必然需要解析map再有转换才能得到相应类型的参数,代码看起来显然比较冗长,因此可以直接传递两个参数,而不用map传递; 二 在计算起始数据行号时使用了一个小的计算公式Integer startNo =(currentPage-1)*pageSize;,而在其他模块中经常用到分页功能,在编写分页查询的业务方法时还会多次使用这种计算的功能,因此这种经常被使用的重复的计算公式应被封装到一个对象中,以便今后其他模块调用

因此创建一个类封装计算方法
public class Page implements Serializable {
。。。。。。
 public static int getStartOfPage(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

}
封装后就可以重新构造刚才的分页查询业务方法了,重构后的业务方法如下
@Override
public Page ListByPage(int pageNum, int pageSize) {
int startNo = Page.getStartOfPage(pageNum, pageSize);
return templateQLService.findByPagedSQLBeanQuery("case-shareExpert-list", null, startNo, pageSize, DataVo.class);
}
上一篇:数据仓库-按周的累加和统计月数据


下一篇:redhat 5 在虚拟机vmware中连接ADSL网络方法详述