背景介绍:
在做网上商城的项目时,有一个非常高频的功能需求,那就是做Web前端开发都知道的分页显示数据。当然要实现这个功能方法是非常多的,在我之前的做的项目接口管理系统中,使用的实现方式是假分页的方式,即将所有的数据查询出来,在前端进行分页,这个分页是使用前端框架的表格控件来完成的。因此我们在开发的时候,并没有在分页的实现上下多大的功夫,当然也就谈不上什么抽象和封装之类的编程技巧了。
当然,真分页的方式也实现过,就是在底层封装一些分页查询的方法,将分页信息比如起始页以及每页显示多少条记录等参数信息传入,然后在方法内部使用原生的SQL和传入的参数一起组成SQL语句,执行SQL语句来实现分页。显然这也没有使用面向对象的思想来实现分页功能。
那么如何用面向对象的方式来实现分页的功能呢?请往下看:
正文部分:
首先我们先来封装一个分页实体类PageBean,代码如下:
分页类PageBean
<span style="font-size:18px;">public class PageBean<T> {
private int page; //当前页数
private int totalCount; //总记录数
private int totalPage; //总页数
private int limit; //每页显示的记录数
private List<T> list; //每页显示数据记录的集合;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}</span>
那么如何使用封装好的分页类呢?接着往下看:
Action类业务方法
<span style="font-size:18px;">//根据分类的ID查询商品
public String findByCid(){
PageBean<Product> pageBean=productService.findByPageCid(cid,page);//根据一级分类查询带分页的商品
//将PageBean存入到值栈中
ActionContext.getContext().getValueStack().set("pageBean", pageBean);
return "findByCid";
}</span>
Service类业务方法
<span style="font-size:18px;">//根据一级分类的cid带分页的查询商品
public PageBean<Product> findByPageCid(Integer cid, int page) {
PageBean<Product> pageBean= new PageBean<Product>();
//设置当前页数
pageBean.setPage(page);
//设置每页显示的记录数
int limit =8;
pageBean.setLimit(limit);
//设置总记录数
int totalCount=0;
totalCount = productDao.findCountCid(cid);
pageBean.setTotalCount(totalCount);
//设置总页数
int totalPage=0;
if(totalCount % limit ==0){
totalPage=totalCount/limit;
}else {
totalPage= totalCount/limit +1;
}
pageBean.setTotalPage(totalPage);
//每页显示的数据集合
//从哪开始
int begin=(page-1)*limit;
List<Product> list=productDao.findByPageCid(cid,begin,limit);
pageBean.setList(list);
return pageBean;
}</span>
Dao类业务方法
<span style="font-size:18px;">public List<Product> findByPageCid(Integer cid, int begin, int limit) {
String hql="select p from Product p join p.categorySecond cs join cs.category c where c.cid=?";
//分页的另一种方法
List<Product> list=this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql, new Object[]{cid}, begin, limit));
if(list!=null && list.size()>0){
return list;
}
return null;
}</span>
小结一下:
其实在之前做的项目中根本没有想到过使用类去对分页进行封装,在遇到分页的功能需求时,总是想着底层分页方法的编写和客户端分页如何实现,亦或是借助前端分页控件实现,将面向对象的编程思想跑到了九霄云外,可能是对面向对象的理解还不够深刻,因此根本没有那个想法,不怕不知道,就怕不知道,就是这个道理。