1. 程式人生 > >Java資料分頁通用封裝

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<String,String> param=new HashMap<String,String>();
    	param.put("userName", userName);
    	param.put("phone", phone);
    	param.put("currentPage", currentPage);
    	param.put("pageSize", pageSize);
    		
    	IPageList<UserInfo> pList=service.selectList(param);
    	IPager pager=new MiniPager(pList);
    	pager.save2Request(request, "list");
    		
    	return "list";
    }
  2. service層,只需透明傳遞到dao
  3. dao層
    public IPageList<UserInfo> selectList(HashMap param){
    	IPageList<HashMap> pList=new MyBatisPageList<HashMap>(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<R> {
	/**
	 * 發出查詢
	 */
	void doList();
	/**
	 * 得到查詢的結果,個數為pageSize的個數
	 * @return
	 */
	List<R> 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<R> implements IPageList<R>{
	private int pageSize=20;//預設20
	private int currentPage=1;//預設1
	private int totalCount;
	private int totalPage;
	/**
	 * 資料
	 */
	private List<R> 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<R> 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<R> 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)