Java数据分页通用封装

原理

数据库分页,从客户角度来看,主要是提供两个参数:每页数量(pageSize),当前页(currentPage)。从后台处理来看,主要是分页查询数据库,查询总数;所以只需处理好这两个参数就可以完成分页了。

本文内容

本文的封装参考easyjweb pageList名字,(只是以前用过,继承关系实现应该都不一样)。

本文中总共设计到了两个核心接口:

IPageList: 数据查询和结果承载的主接口

IPager: 页面相关处理接口

另外,提供了抽象类,做公共处理,见AbstractPageList、AbstractPager。

  1. 如因为持久层使用技术的不同,要实现使用该接口,请继承AbstractPageList类,实现抽象方法。
  2. 如想实现自己的页面显示的分页组件,请继承AbstractPager类,实现抽象方法。

本文,下面的下载中,会有ibatis和mybatis的两个IPageList实现的实现。这就是说,如果您的项目使用的是上述两种持久层,则可以直接拿来使用。否则,请继承AbstractPageList实现响应持久层的代码。

使用方法

  1.  IPageList pList=new XxxPageList([param]);//初始化,设置参数
  2. pList.doList();//发出实际查询
  3. pList.getResult();//可选操作,得到并处理相应数据
  4. IPager pager=new XxxPager(pageList);//创建分页组件类
  5. pager.save2Request(request,"listName");//保存数据,以及分页组件到页面
  6. 页面合适的位置放置${pager}

如果这里看的不是很明白,我举个web三次应用中的实际代码,方便大家理解(struts2+spring+mybatis)

  1. action层
    public String doList(){
    	HttpServletRequest request=ServletActionContext.getRequest();
    	String callNum=request.getParameter("userName");
    	String accNum=request.getParameter("phone");
    		
    	if(StringUtils.isBlank(userName)&&StringUtils.isBlank(phone)){
    		request.setAttribute("message", "查询参数不能全空");
    		return "list";
    	}
    	//获得分页参数
    	String currentPage=request.getParameter("currentPage");
    	String pageSize=request.getParameter("pageSize");
    		
    	HashMap param=new HashMap();
    	param.put("userName", userName);
    	param.put("phone", phone);
    	param.put("currentPage", currentPage);
    	param.put("pageSize", pageSize);
    		
    	IPageList pList=service.selectList(param);
    	IPager pager=new MiniPager(pList);
    	pager.save2Request(request, "list");
    		
    	return "list";
    }
  2. service层,只需透明传递到dao
  3. dao层
    public IPageList selectList(HashMap param){
    	IPageList pList=new MyBatisPageList(sqlSession, "user.selectList", "user.selectListCount", param);
    	pList.doList();
    	return pList;
    }

这样写大家应该都能对这个比较容易理解了吧。页面上,只需在table列表下面加上${pager}就可以了,里面包含了js,和页面需要的html等内容。

主要的接口和抽象实现

IPageList.java

import java.util.List;

/**
 * 
 * 分页接口,对于采用不同持久化方案的分页,继承该类并实现相应方法即可使用
 * 使用方法:
 * 1.IPageList pList=new XxxPageList([param]);//初始化,设置参数
 * 2.pList.doList();//发出实际查询
 * 3.pList.getResult();//可选,得到并处理相应数据
 * 4.IPager pager=new XxxPager(pageList);//创建分页组件类
 * 5.pager.save2Request(request,"listName");//保存数据,以及分页组件到页面
 * 6.页面合适的位置放置${pager}
 * 
 * 注意,sql语句要带有分页参数startNum, endNum
 * @author wutb1
 * 2013-10-31 上午11:02:23
 * @version 1.0.0.0
 */
public interface IPageList {
	/**
	 * 发出查询
	 */
	void doList();
	/**
	 * 得到查询的结果,个数为pageSize的个数
	 * @return
	 */
	List getResult();
	/**
	 * 设置每页大小
	 * @param pageSize
	 */
	void setPageSize(int pageSize);
	/**
	 * 得到当前设置的每页大小
	 * @return
	 */
	int getPageSize();
	/**
	 * 设置当前页
	 * @param currentPage
	 */
	void setCurrentPage(int currentPage);
	/**
	 * 得到设置的当前页
	 * @return
	 */
	int getCurrentPage();
	/**
	 * 得到符合记录的总个数
	 * @return
	 */
	int getTotalCount();
	/**
	 * 得到总的分页数
	 * @return
	 */
	int getTotalPage();
}

IPager.java

import javax.servlet.http.HttpServletRequest;

/**
 * 页面上分页组件的抽象
 * 1.定义页面分页组件
 * 2.返回页面参数
 * 使用方式
 * 1.IPager pager=new XxxPager(IPageList);
 * 2.pager.save2Request(request,"listName");
 * 
 * @author wutb1
 * 2014-4-22 下午07:36:15
 * @version 1.0.0.0
 */
public interface IPager {
	
	void setPageList(IPageList pList);
	IPageList getPageList();
	
	/**
	 * 保存PageList中的数据到页面
	 * @param request
	 * @param listName
	 */
	void save2Request(HttpServletRequest request,String listName);
	
	/**
	 * 得到页面分页组件,一般包含
	 * 1.组件的html
	 * 2.分页用隐藏域
	 * 3.组件响应的js处理方法
	 * 
	 * @return
	 */
	String getPager();
	
	
}

AbstractPageList.java

import java.util.List;

/*
 * 分页抽象类,实现公用的部分
 * 1.分页参数的处理pageSize、currentPage、totalCount、totalPage
 * 2.查询生命周期
 * @non javadocs
 * @see IPageList
 */
public abstract class AbstractPageList implements IPageList{
	private int pageSize=20;//默认20
	private int currentPage=1;//默认1
	private int totalCount;
	private int totalPage;
	/**
	 * 数据
	 */
	private List result;
	
	
	public void doList(){
		beforeQuery();
		result=queryList();
		totalCount=queryTotalCount();
		//计算总页数
		calTotalPage();
		afterQuery();
	}
	/**
	 * 计算总页数
	 */
	private void calTotalPage(){
		totalPage=(int)Math.ceil((double)totalCount/pageSize);
	}
	/**
	 * 抽象方法,根据currentPage和pageSize查询数据
	 * @return
	 */
	protected abstract List queryList();
	/**
	 * 抽象方法,查询总的数据数量
	 * @return
	 */
	protected abstract int queryTotalCount();
	/**
	 * 两个回调函数
	 */
	protected abstract void beforeQuery();
	protected abstract void afterQuery();
	

	
	
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getTotalCount() {
		return totalCount;
	}

	public int getTotalPage() {
		return totalPage;
	}
	
	public List getResult() {
		return result;
	}
}

AbstractPager.java

public abstract class AbstractPager implements IPager{
	private IPageList pageList;
	
	public IPageList getPageList() {
		return this.pageList;
	}

	public void setPageList(IPageList pageList) {
		this.pageList=pageList;
	}

	/*
	 * (non-Javadoc)
	 * @see cn.com.jiexun.utils.IPageUtil#save2Request(javax.servlet.http.HttpServletRequest, java.lang.String)
	 */
	public void save2Request(HttpServletRequest request, String listName) {
		saveCommon(request);
		request.setAttribute(listName, getPageList().getResult());
	}

	private void saveCommon(HttpServletRequest request){
		request.setAttribute("pageSize", getPageList().getPageSize());
		request.setAttribute("currentPage", getPageList().getCurrentPage());
		request.setAttribute("totalCount", getPageList().getTotalCount());
		request.setAttribute("totalPage", getPageList().getTotalPage());
		//html页面,分页组件
		request.setAttribute("pager", getPager());
	}
}

下载地址

http://pan.baidu.com/s/1hqgg8Bi



--------------------------

如果你对java、swing、各种框架、javascript、css、linux、数据库编程等知识很感兴趣,或者正在从事这些工作,

欢迎加入我的qq技术交流群:java不瘸腿(219345774)

 

你可能感兴趣的:(java,web)