hibernate分页详细源码.docx
《hibernate分页详细源码.docx》由会员分享,可在线阅读,更多相关《hibernate分页详细源码.docx(38页珍藏版)》请在冰点文库上搜索。
hibernate分页详细源码
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
publicinterfaceMemberDao{
//省略了其他的代码
/***//**
*分页查询
*@paramhql查询的条件
*@paramoffset开始记录
*@paramlength一次查询几条记录
*@return
*/
publicListqueryForPage(finalStringhql,finalintoffset,finalintlength);
/***//**
*查询所有记录数
*@paramhql查询的条件
*@return总记录数
*/
publicintgetAllRowCount(Stringhql);
}
2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:
publicclassMemberDaoImplextendsHibernateDaoSupportimplementsMemberDao{
//省略了其他的代码
/***//**
*分页查询
*@paramhql查询的条件
*@paramoffset开始记录
*@paramlength一次查询几条记录
*@return
*/
publicListqueryForPage(finalStringhql,finalintoffset,finalintlength){
Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){
publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
Queryquery=session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
Listlist=query.list();
returnlist;
}
});
returnlist;
}
/***//**
*查询所有记录数
*@return总记录数
*/
publicintgetAllRowCount(Stringhql){
returngetHibernateTemplate().find(hql).size();
}
}
3、下面我们来新建一个保存分页信息的类PageBean,具体代码如下:
publicclassPageBean{
privateListlist; //要返回的某一页的记录列表
privateintallRow; //总记录数
privateinttotalPage; //总页数
privateintcurrentPage; //当前页
privateintpageSize; //每页记录数
privatebooleanisFirstPage; //是否为第一页
privatebooleanisLastPage; //是否为最后一页
privatebooleanhasPreviousPage; //是否有前一页
privatebooleanhasNextPage; //是否有下一页
publicListgetList(){
returnlist;
}
publicvoidsetList(Listlist){
this.list=list;
}
publicintgetAllRow(){
returnallRow;
}
publicvoidsetAllRow(intallRow){
this.allRow=allRow;
}
publicintgetTotalPage(){
returntotalPage;
}
publicvoidsetTotalPage(inttotalPage){
this.totalPage=totalPage;
}
publicintgetCurrentPage(){
returncurrentPage;
}
publicvoidsetCurrentPage(intcurrentPage){
this.currentPage=currentPage;
}
publicintgetPageSize(){
returnpageSize;
}
publicvoidsetPageSize(intpageSize){
this.pageSize=pageSize;
}
/***//**
*初始化分页信息
*/
publicvoidinit(){
this.isFirstPage=isFirstPage();
this.isLastPage=isLastPage();
this.hasPreviousPage=isHasPreviousPage();
this.hasNextPage=isHasNextPage();
}
/***//**
*以下判断页的信息,只需getter方法(is方法)即可
*@return
*/
publicbooleanisFirstPage(){
returncurrentPage==1; //如是当前页是第1页
}
publicbooleanisLastPage(){
returncurrentPage==totalPage; //如果当前页是最后一页
}
publicbooleanisHasPreviousPage(){
returncurrentPage!
=1; //只要当前页不是第1页
}
publicbooleanisHasNextPage(){
returncurrentPage!
=totalPage; //只要当前页不是最后1页
}
/***//**
*计算总页数,静态方法,供外部直接通过类名调用
*@parampageSize每页记录数
*@paramallRow总记录数
*@return总页数
*/
publicstaticintcountTotalPage(finalintpageSize,finalintallRow){
inttotalPage=allRow%pageSize==0?
allRow/pageSize:
allRow/pageSize+1;
returntotalPage;
}
/***//**
*计算当前页开始记录
*@parampageSize每页记录数
*@paramcurrentPage当前第几页
*@return当前页开始记录号
*/
publicstaticintcountOffset(finalintpageSize,finalintcurrentPage){
finalintoffset=pageSize*(currentPage-1);
returnoffset;
}
/***//**
*计算当前页,若为0或者请求的URL中没有"?
page=",则用1代替
*@parampage传入的参数(可能为空,即0,则返回1)
*@return当前页
*/
publicstaticintcountCurrentPage(intpage){
finalintcurPage=(page==0?
1:
page);
returncurPage;
}
}
4、Service层接口的设计:
publicinterfaceMemberService{
//省略其他的代码
/***//**
*分页查询
*@paramcurrentPage当前第几页
*@parampageSize每页大小
*@return封闭了分页信息(包括记录集list)的Bean
*/
publicPageBeanqueryForPage(intpageSize,intcurrentPage);
}
5、Service层实现类的部分内码如下:
publicclassMemberServiceImplimplementsMemberService{
//通过applicationContext.xml配置文件注入MemberDao的值
privateMemberDaomemberDao;
publicvoidsetMemberDao(MemberDaomemberDao){
this.memberDao=memberDao;
}
/***//**
*分页查询
*@paramcurrentPage当前第几页
*@parampageSize每页大小
*@return封闭了分页信息(包括记录集list)的Bean
*/
publicPageBeanqueryForPage(intpageSize,intpage){
finalStringhql="fromMember"; //查询语句
intallRow=memberDao.getAllRowCount(hql); //总记录数
inttotalPage=PageBean.countTotalPage(pageSize,allRow); //总页数
finalintoffset=PageBean.countOffset(pageSize,page); //当前页开始记录
finalintlength=pageSize; //每页记录数
finalintcurrentPage=PageBean.countCurrentPage(page);
Listlist=memberDao.queryForPage(hql,offset,length); //"一页"的记录
//把分页信息保存到Bean中
PageBeanpageBean=newPageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
returnpageBean;
}
6、在Struts2中调用queryForPageMemberService层的queryForPage()方法即可return一个包含分页信息、符合条件的结果集list,代码如下:
publicclassListMemberextendsActionSupport{
//通过applicationContext.xml配置文件注入memberService的值
privateMemberServicememberService;
publicvoidsetMemberService(MemberServicememberService){
this.memberService=memberService;
}
privateintpage; //第几页
privatePageBeanpageBean; //包含分布信息的bean
publicintgetPage(){
returnpage;
}
publicvoidsetPage(intpage){ //若URL中无此参数,会默认为第1页
this.page=page;
}
publicPageBeangetPageBean(){
returnpageBean;
}
publicvoidsetPageBean(PageBeanpageBean){
this.pageBean=pageBean;
}
@Override
publicStringexecute()throwsException{
//分页的pageBean,参数pageSize表示每页显示记录数,page为当前页
this.pageBean=memberService.queryForPage(2,page);
returnSUCCESS;
}
}
7、最后在listMember.jsp页面中,用到了Struts2标签:
iteratorvalue="pageBean.list">
propertyvalue="title"/>
id=propertyvalue="id"/>">modify
id=propertyvalue="id"/>"onclick="returnaskDel()"/>delete
iterator>
共propertyvalue="pageBean.allRow"/>条记录
共propertyvalue="pageBean.totalPage"/>页
当前第propertyvalue="pageBean.currentPage"/>页
iftest="%{pageBean.currentPage==1}">
第一页上一页
if>
else>
page=1">第一页
page=propertyvalue="%{pageBean.currentPage-1}"/>">上一页
else>
iftest="%{pageBean.currentPage!
=pageBean.totalPage}">
page=propertyvalue="%{pageBean.currentPage+1}"/>">下一页
page=propertyvalue="pageBean.totalPage"/>">最后一页
if>
else>
下一页最后一页
else>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我也发发我的SSH分页
dao方法:
Java代码
/**
*getappCodesbyPagination
*
*@paramappCode
*@parampagination
*/
@SuppressWarnings("unchecked")
publicPaginationgetAppCodes(finalAppCodeappCode,finalPaginationpagination){
HibernateCallbackcallback=newHibernateCallback(){
@Override
publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
inttotalRow=0;
ListobjList=newArrayList();
try{
Criteriacriteria=session.createCriteria(AppCode.class);
//只查状态有效的
criteria.add(Restrictions.eq("status",CConstants.VALID));
totalRow=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
pagination.setTotalRow(totalRow);
objList=criteria.addOrder(Order.asc("category")).addOrder(Order.asc("codeId")).setFirstResult(pagination.getStartRow()).setMaxResults(pagination.getPageSize()).list();
pagination.setObjList(objList);
}catch(Exceptione){
log.error("uhoh,getappCodesbyPaginationfailed...");
e.printStackTrace();
}
returnpagination;
}
};
return(Pagination)getHibernateTemplate().execute(callback);
}
Service方法:
Java代码
/**
*getappCodesbyPagination
*@paramappCode
*@parampagination
*/
publicPaginationgetAppCodes(AppCodeappCode,Paginationpagination){
returnappCodeDao.getAppCodes(appCode,pagination);
}
/**
*getappCodesbyPaginationforFlex
*@parammap
*@parampagination
*/
publicPaginationquery(Mapmap,Paginationpagination){
if(map.isEmpty()){
returngetAppCodes(newAppCode(),pagination);
}
AppCodeappCode=newAppCode();
if(StringUtils.isNotEmpty(map.get("id"))){
appCode.setId(map.get("id"));
}
if(StringUtils.isNotEmpty(map.get("codeId"))){
appCode.setCodeId(map.get("codeId"));
}
if(StringUtils.isNotEmpty(map.get("codeName"))){
appCode.setCodeName(map.get("codeName"));
}
if(StringUtils.isNotEmpty(map.get("category"))){
appCode.setCategory(map.get("category"));
}
if(StringUtils.isNotEmpty(map.get("categoryDesc"))){
appCode.setCategoryDesc(map.get("categor