Hibernate动态条件查询并分页(二)

介绍:

    分页查询很常用的一个功能,在SSH网上商城中用到了几次,在DRP中也出现了,就拉出来总结总结,其实套路都是一样的,要知道第几页、共多少页、每页多少条数据、一共多少数据,最后查询的时候需要两个参数begin和pagesize(从那条数据开始,查询几条),下面详细看一下!


分页很常用,所以一般会封装一个分页类,这里这个类为PageBean.java,里面是定义我们要用到的几个参数,然后提供参数的get和set方法,其实和我们之前写的实体类很像…

[java]  view plain  copy
  1. package cn.itcast.shop.utils;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 分页类的封装 
  7.  * @author wxr 
  8.  * @param <T> 
  9.  * 
  10.  */  
  11. public class PageBean<T> {  
  12.     private int page;   //当前页数  
  13.     private int totalCount;   //总记录数  
  14.     private int totalPage;    //总页数  
  15.     private int limit;        //每页显示的记录数  
  16.     private List<T> list;     //每页显示数据的集合  
  17.     public int getPage() {  
  18.         return page;  
  19.     }  
  20.     public void setPage(int page) {  
  21.         this.page = page;  
  22.     }  
  23.     public int getTotalCount() {  
  24.         return totalCount;  
  25.     }  
  26.     public void setTotalCount(int totalCount) {  
  27.         this.totalCount = totalCount;  
  28.     }  
  29.     public int getTotalPage() {  
  30.         return totalPage;  
  31.     }  
  32.     public void setTotalPage(int totalPage) {  
  33.         this.totalPage = totalPage;  
  34.     }  
  35.     public int getLimit() {  
  36.         return limit;  
  37.     }  
  38.     public void setLimit(int limit) {  
  39.         this.limit = limit;  
  40.     }  
  41.     public List<T> getList() {  
  42.         return list;  
  43.     }  
  44.     public void setList(List<T> list) {  
  45.         this.list = list;  
  46.     }  
  47. }  


JSP需要从后台获取值显示:

[java]  view plain  copy
  1. <tr align="center">  
  2.      <td colspan="4">  
  3.           第<s:property value="pageBean.page"/>/<s:property value="pageBean.totalPage"/>页       
  4.             <s:if test="pageBean.page!=1">  
  5.                <a href="${pageContext.request.contextPath }/adminProduct_findAll.action?page=1">首页</a>|       
  6.                <a href="${pageContext.request.contextPath }/adminProduct_findAll.action?page=<s:property value="pageBean.page-1"/>">上一页</a>|   
  7.             </s:if>  
  8.             <s:if test="pageBean.page!=pageBean.totalPage">  
  9.                <a href="${pageContext.request.contextPath }/adminProduct_findAll.action?page=<s:property value="pageBean.page+1"/>">下一页</a>|   
  10.                <a href="${pageContext.request.contextPath }/adminProduct_findAll.action?page=<s:property value="pageBean.totalPage"/>">尾页</a>              
  11.             </s:if>  
  12.      </td>  
  13. </tr>  

需要在adminProduct.Action中进行查询FindAll

[java]  view plain  copy
  1. //带分页的查询商品的执行方法  
  2. public String findAll(){  
  3.     //调用Service完成查询操作  
  4.     PageBean<Product> pageBean =productService.findByPage(page);  
  5.     //将数据传递到页面上  
  6.     ActionContext.getContext().getValueStack().set("pageBean", pageBean);  
  7.     //页面跳转  
  8.     return "findAll";     
  9. }  


Action调用业务逻辑层Service

[java]  view plain  copy
  1. //业务层查询商品带分页的方法  
  2. public PageBean<Product> findByPage(Integer page) {  
  3.      PageBean<Product> pageBean=new PageBean<Product>();  
  4.      //设置当前页数;  
  5.      pageBean.setPage(page);  
  6.      //设置每页显示记录数  
  7.       int limit=10;  
  8.       pageBean.setLimit(limit);  
  9.       //设置总记录条数  
  10.       int totalCount=productDao.findCount();  
  11.       pageBean.setTotalCount(totalCount);  
  12.       //设置总页数  
  13.       int totalPage=0;  
  14.       if(totalCount % limit==0){  
  15.        totalPage=totalCount/limit;  
  16.       }else{  
  17.         totalPage=totalCount/limit+1;  
  18.       }  
  19.        pageBean.setTotalPage(totalPage);  
  20.        //设置显示到页面的数据的集合  
  21.        int begin=(page-1)*limit;  
  22.        List<Product> list=productDao.findByPage(begin,limit);  
  23.        pageBean.setList(list);  
  24.        return pageBean;  
  25. }  

 在这方面中设置分页查询需要的两个参数begin(从那条开始查)limit(查询几条也就是每页显示几条)

 

然后调用Dao层从数据库中进行查询

[java]  view plain  copy
  1.  //带分页查询商品的方法  
  2.  public List<Product> findByPage(int begin, int limit) {  
  3. Session session = this.getSession();     
DetachedCriteria dc = myDetachedCriteria(person);  
    List<Person> list = dc.getExecutableCriteria(session)  
        .setFirstResult(begin).setMaxResults(limit).list();
    //List<Person> list=(List<Person>) this.getHibernateTemplate().findByCriteria(dc,begin,limit); 
    if(list!=null && list.size()>0){  
    return list;  
    }  
    return null; 
  }  

   HibernateTemplate提供了非常多的常用方法来完成数据库的基本操作,使得持久层访问摸板化;HibernateCallback是Hibernate的复杂用法,提供了更为灵活的方式操作数据库,这里把参数传进去分页查询就完成了,很方面!

总结:

     思路缕明白了,不管是.net实现还是java实现其实都是一样的,主要是这两个环境的调用不太一样,不断总结,加油!

猜你喜欢

转载自blog.csdn.net/weixin_42124622/article/details/80458483
今日推荐