关闭

SSH分页(Hibernate实现简单分页查询)

31390人阅读 评论(4) 收藏 举报
分类:
直接正题

一、INewsDao.java(DAO接口):

 1 package cn.dy.dao;
 2 
 3 import java.util.List;
 4 import cn.dy.bean.News;
 5 
 6 public interface INewsDao {
 7 
 8     //其他代码省略
 9     
10     
11     //分页查询
12     public List<News> queryForPage(String hql,int offset,int length);
13     
14     //总记录条数
15     public int getCount(String hql);
16 }
17 

二、dao实现类,因为第13行中q.list().get(0)的返回值为long,所以转换一下。

 1 @SuppressWarnings("unchecked")
 2     @Override
 3     public List<News> queryForPage(String hql,int offset, int length) {
 4         Query q = factory.getCurrentSession().createQuery(hql);
 5         q.setFirstResult(offset);
 6         q.setMaxResults(length);
 7         return q.list();
 8     }
 9 
10     @Override
11     public int getCount(String hql) {
12         Query q = factory.getCurrentSession().createQuery(hql);
13         return Integer.parseInt(q.list().get(0).toString());
14     }

三、INewsService.java业务接口,添加方法

public PageBean queryForPage(int pageSize, int currentPage);

四、业务实现类代码,注意修改参数

 1 @Override
 2     public PageBean queryForPage(int pageSize, int page) {
 3         String hql = "select count(*) from News";
 4         int count = newsDao.getCount(hql); // 总记录数
 5         int totalPage = PageBean.countTotalPage(pageSize, count); // 总页数
 6         int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录
 7         int length = pageSize; // 每页记录数
 8         int currentPage = PageBean.countCurrentPage(page);
 9         List<News> list = newsDao.queryForPage("from News", offset, length); // 该分页的记录
10         // 把分页信息保存到Bean中
11         PageBean pageBean = new PageBean();
12         pageBean.setPageSize(pageSize);
13         pageBean.setCurrentPage(currentPage);
14         pageBean.setAllRow(count);
15         pageBean.setTotalPage(totalPage);
16         pageBean.setList(list);
17         pageBean.init();
18         return pageBean;
19     }

五、action代码:

    private int page;
    private PageBean pageBean;
    
    以及上面两个的get()、set()方法。
   
    public String getPageList() {
        this.pageBean = newsService.queryForPage(6, page);
        return "newsList";
    }

    这个6,是每页6个数据,可以通过页面动态传值。

六、页面代码

1、显示代码:
 1                 <s:iterator value="pageBean.list">
 2                     <tr>
 3                         <td class="tocenter">
 4                             <s:property value="newsId" />
 5                         </td>
 6                         <td colspan="5">
 7                             <s:property value="newsContent" />
 8                         </td>
 9                         <td class="tocenter">
10                             <s:property value="beginTime" />
11                         </td>
12                     </tr>
13                 </s:iterator>

2、分页:

 1                 <tr>
 2                     <td width="13%" class="tocenter">
 3                         共
 4                         <s:property value="pageBean.totalPage" />
 5                         页
 6                     </td>
 7                     <td width="17%" class="tocenter">
 8                         共
 9                         <s:property value="pageBean.allRow" />
10                         条记录
11                     </td>
12                     <td width="15%" class="tocenter">
13                         当前第
14                         <s:property value="pageBean.currentPage" />
15                         页
16                     </td>
17                     <td colspan="4" width="55%" class="tocenter">
18                         <s:if test="%{pageBean.currentPage == 1}">第一页&nbsp;&nbsp;&nbsp;&nbsp;上一页&nbsp;&nbsp;&nbsp;&nbsp;</s:if>
19                         <s:else>
20                             <href="/DyEnigma/news/op_getPageList.do?page=1">第一页&nbsp;&nbsp;&nbsp;&nbsp;</a>
21                             <href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage-1}"/>">上一页&nbsp;&nbsp;&nbsp;&nbsp;</a>
22                         </s:else>
23                         <s:if test="%{pageBean.currentPage != pageBean.totalPage}">
24                             <href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页&nbsp;&nbsp;&nbsp;&nbsp;</a>
25                             <href="/DyEnigma/news/op_getPageList.do?page=<s:property value="pageBean.totalPage"/>">最后一页</a>
26                         </s:if>
27                         <s:else>下一页&nbsp;&nbsp;&nbsp;&nbsp; 最后一页</s:else>
28                     </td>
29                 </tr>

七、PageBean文件

  1package cn.dy.own;
  2
  3import java.util.List;
  4
  5@SuppressWarnings("unchecked")
  6public class PageBean {
  7
  8    private List list;// 要返回的某一页的记录列表
  9    
 10    private int allRow; // 总记录数
 11    private int totalPage; // 总页数
 12    private int currentPage; // 当前页
 13    private int pageSize;// 每页记录数
 14    
 15    @SuppressWarnings("unused")
 16    private boolean isFirstPage; // 是否为第一页
 17    @SuppressWarnings("unused")
 18    private boolean isLastPage;// 是否为最后一页
 19    @SuppressWarnings("unused")
 20    private boolean hasPreviousPage; // 是否有前一页
 21    @SuppressWarnings("unused")
 22    private boolean hasNextPage;// 是否有下一页
 23
 24    public List getList() {
 25        return list;
 26    }

 27
 28    public void setList(List list) {
 29        this.list = list;
 30    }

 31
 32    public int getAllRow() {
 33        return allRow;
 34    }

 35
 36    public void setAllRow(int allRow) {
 37        this.allRow = allRow;
 38    }

 39
 40    public int getTotalPage() {
 41        return totalPage;
 42    }

 43
 44    public void setTotalPage(int totalPage) {
 45        this.totalPage = totalPage;
 46    }

 47
 48    public int getCurrentPage() {
 49        return currentPage;
 50    }

 51
 52    public void setCurrentPage(int currentPage) {
 53        this.currentPage = currentPage;
 54    }

 55
 56    public int getPageSize() {
 57        return pageSize;
 58    }

 59
 60    public void setPageSize(int pageSize) {
 61        this.pageSize = pageSize;
 62    }

 63
 64    /**
 65     * 初始化分页信息
 66     */

 67    public void init() {
 68        this.isFirstPage = isFirstPage();
 69        this.isLastPage = isLastPage();
 70        this.hasPreviousPage = isHasPreviousPage();
 71        this.hasNextPage = isHasNextPage();
 72    }

 73
 74    /**
 75     * 以下判断页的信息,只需getter方法(is方法)即可
 76     * 
 77     * @return
 78     */

 79    public boolean isFirstPage() {
 80        return currentPage == 1// 如是当前页是第1页
 81    }

 82
 83    public boolean isLastPage() {
 84        return currentPage == totalPage; // 如果当前页是最后一页
 85    }

 86
 87    public boolean isHasPreviousPage() {
 88        return currentPage != 1;// 只要当前页不是第1页
 89    }

 90
 91    public boolean isHasNextPage() {
 92        return currentPage != totalPage; // 只要当前页不是最后1页
 93    }

 94
 95    /**
 96     * 计算总页数,静态方法,供外部直接通过类名调用
 97     * 
 98     * @param pageSize每页记录数
 99     * @param allRow总记录数
100     * @return 总页数
101     */

102    public static int countTotalPage(final int pageSize, final int allRow) {
103        int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;
104        return totalPage;
105    }

106
107    /**
108     * 计算当前页开始记录
109     * 
110     * @param pageSize每页记录数
111     * @param currentPage当前第几页
112     * @return 当前页开始记录号
113     */

114    public static int countOffset(final int pageSize, final int currentPage) {
115        final int offset = pageSize * (currentPage - 1);
116        return offset;
117    }

118
119    /**
120     * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
121     * 
122     * @paramPage 传入的参数(可能为空,即0,则返回1)
123     * @return 当前页
124     */

125    public static int countCurrentPage(int page) {
126        final int curPage = (page == 0 ? 1 : page);
127        return curPage;
128    }

129}


OK,完工。 

转载请注明来源http://www.blogjava.net/DyEnigma/
6
0
查看评论

Hibernate分页(sql和hql)两种方法

1、Hibernate原生sql分页 @Transactional public PagerBean findModelLabelAll(PagerBean pager, String dataSource) { PagerBean pagerDto = null; ...
  • kpchen_0508
  • kpchen_0508
  • 2015-08-29 11:16
  • 10997

hibernate 分页的两种方法

criteria分页 public Page getPage(int currentPage,int pageSize,Criterion...crts){ Criteria c=session.createCriteria(House.class); List list=null; for...
  • white__cat
  • white__cat
  • 2017-01-17 21:32
  • 3625

Hibernate第十篇【Hibernate查询详解、分页查询】

前言在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式….到目前为止,我们都是使用一些简单的主键查询阿…使用HQL查询所有的数据….本博文主要讲解Hibernate的查询操作…get/load主键查询由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来...
  • hon_3y
  • hon_3y
  • 2017-05-08 15:58
  • 4453

Hibernate的分页技术

Hibernate的分页技术是透明的,,你理解最好,不能理解先用着呗。。  说白了就是查询语句中你不用写上一堆的分页语句了,Hibernate已经实现了,但最终的查询跟手工的查询没两样,oracle用的还是rownum,mysql还是用的limit。 蔡华江 (资深架构师...
  • you_off3
  • you_off3
  • 2012-05-11 14:27
  • 4707

基于hibernate实现的分页技术

先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可 先上代码:注意传进来的参数有 Page这类,后面有介绍 public List queryByPage(final String ...
  • beyond667
  • beyond667
  • 2012-03-22 23:32
  • 49727

hibernate3与hibernate4实现分页查询的简单方法

1.hibernate3实现分页查询hibernate3实现分页查询需要继承HibernateDaoSupport类,实现代码如下:protected List<T> findByPage(final String hql,final int pageNo,final int pageS...
  • a0b123456
  • a0b123456
  • 2017-03-29 15:59
  • 737

Hibernate实现分页查询

Hibernate实现分页查询 分页查询在实际应用中很普遍,但不同的数据库有不同的方法实现分页查询,但Hibernate框架如何实现分页查询呢,下面这个demo将示例分页查询: package test; import java.util.List; import org.hibe...
  • u011637069
  • u011637069
  • 2015-12-26 15:13
  • 1107

Hibernate分页查询小结

通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1、QBE(Qurey By Example)检索方式 QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对...
  • bitsjx
  • bitsjx
  • 2011-11-04 15:56
  • 8519

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类。利用分页对象进行分页。 但,分页往往带查询条件。   分页类的三个重要数据:【当前页码数】,【数据库中的总记录数】,【每页显示的数据的条数】 原理:select * from  【表名】 where   【字...
  • dbeautifulLife
  • dbeautifulLife
  • 2017-03-21 17:13
  • 993

Hibernate实现分页查询的原理分析

原文链接 Hibernate 可以实现分页查询,例如: 从第2万条开始取出100条记录 Java代码 收藏代码Query q = session.createQuery("from Cat as c");; q.setFirstResult(20000);; q....
  • cztq15
  • cztq15
  • 2016-04-27 21:21
  • 3837
    个人资料
    • 访问:2188419次
    • 积分:17105
    • 等级:
    • 排名:第688名
    • 原创:206篇
    • 转载:212篇
    • 译文:0篇
    • 评论:151条
    最新评论