Java資料分頁通用封裝
阿新 • • 發佈:2019-01-04
原理
資料庫分頁,從客戶角度來看,主要是提供兩個引數:每頁數量(pageSize),當前頁(currentPage)。從後臺處理來看,主要是分頁查詢資料庫,查詢總數;所以只需處理好這兩個引數就可以完成分頁了。
本文內容
本文的封裝參考easyjweb pageList名字,(只是以前用過,繼承關係實現應該都不一樣)。
本文中總共設計到了兩個核心介面:
IPageList: 資料查詢和結果承載的主介面
IPager: 頁面相關處理介面
另外,提供了抽象類,做公共處理,見AbstractPageList、AbstractPager。
- 如因為持久層使用技術的不同,要實現使用該介面,請繼承AbstractPageList類,實現抽象方法。
- 如想實現自己的頁面顯示的分頁元件,請繼承AbstractPager類,實現抽象方法。
本文,下面的下載中,會有ibatis和mybatis的兩個IPageList實現的實現。這就是說,如果您的專案使用的是上述兩種持久層,則可以直接拿來使用。否則,請繼承AbstractPageList實現響應持久層的程式碼。
使用方法
- IPageList pList=new XxxPageList([param]);//初始化,設定引數
- pList.doList();//發出實際查詢
- pList.getResult();//可選操作,得到並處理相應資料
- IPager pager=new XxxPager(pageList);//建立分頁元件類
- pager.save2Request(request,"listName");//儲存資料,以及分頁元件到頁面
- 頁面合適的位置放置${pager}
如果這裡看的不是很明白,我舉個web三次應用中的實際程式碼,方便大家理解(struts2+spring+mybatis)
- 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"; }
- service層,只需透明傳遞到dao
- 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)