背景介绍:
在做网上商城的项目时,有一个非常高频的功能需求,那就是做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>
小结一下:
其实在之前做的项目中根本没有想到过使用类去对分页进行封装,在遇到分页的功能需求时,总是想着底层分页方法的编写和客户端分页如何实现,亦或是借助前端分页控件实现,将面向对象的编程思想跑到了九霄云外,可能是对面向对象的理解还不够深刻,因此根本没有那个想法,不怕不知道,就怕不知道,就是这个道理。