`

后台分页思路

    博客分类:
  • java
阅读更多
总结一下后台分页的思路。
只要获取到一个结果集(List)和总记录数就可以了。这样就可以计算出当前页,总页数,上一页,下一页等。

引用

wuhuajun 写道
楼主的意思是全部加在到内存再分页,不然怎么会把内存吃光。。。



不是全部加到内存啊。我用的是mysql,select xxxxx from talbe where whereSql limit ?,?
难道这样会全部加到内存里分页吗?
分享到:
评论
15 楼 rolenz 2011-04-11  
想问一下, select * from table where in(ids),其中IDs为500+,这样的需求有没有好的分页方法
14 楼 phoenixup 2011-04-11  
分页这个问题,如果你要自实现,我有段代码可以供你参考,这个是几年前参考Hibernate官方的一篇文章修改的,应该还是可以用的。
public interface Page<T> {

    /**
     * @return 是否是首页(第一页),第一页页码为1
     */
    public boolean isFirst();

    /**
     * @return 是否是最后一页
     */
    public boolean isLast();

    /**
     * @return 是否有下一页
     */
    public boolean hasNext();

    /**
     * @return 是否有上一页
     */
    public boolean hasPrevious();


    /**
     * @return 当前页的数据内容
     */
    public List<T> getThisPageElements();

    /**
     * @return 数据总的条目数量
     */
    public int getTotalNumberOfElements();

    /**
     * @return 当前页的首条数据的行编码
     */
    public int getFirstElementNumber();

    /**
     * @return 当前页的末条数据的行编码
     */
    public int getLastElementNumber();

    /**
     * @return 当前页编码
     */
    public int getPageNumber();

    /**
     * @return 下一页编码
     */
    public int getNextPageNumber();

    /**
     * @return 上一页编码
     */
    public int getPreviousPageNumber();

    /**
     * @return 获取最后一页页码,也就是总页数
     */
    public int getLastPageNumber();

    /**
     * @return 每一页显示的条目数
     */
    public int getPageSize();
}

基于Hibernate的实现:
public class HibernatePage<T> implements Page<T> {

    private List<T> elements;
    private int pageSize;
    private int pageNumber;
    private int totalElements = 0;

    /**
     * 构建HibernatePage对象,完成Hibernate的Query数据的分页处理
     *
     * @param query
     *            Hibernate的Query对象
     * @param pageNumber
     *            当前页编码,从1开始,如果传的值为Integer.MAX_VALUE表示获取最后一页。
     *            如果你不知道最后一页编码,传Integer.MAX_VALUE即可。如果当前页超过总页数,也表示最后一页。
     *            这两种情况将重新更改当前页的页码,为最后一页编码。
     * @param pageSize
     *            每一页显示的条目数
     */
    public HibernatePage(Query query, int pageNumber, int pageSize) {
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        try {
            ScrollableResults scrollableResults = query.scroll();
            // get the total elements number
            scrollableResults.last();
            this.totalElements = scrollableResults.getRowNumber();
            if (Integer.MAX_VALUE == this.pageNumber || this.pageNumber > getLastPageNumber()) // last page
            {
                this.pageNumber = getLastPageNumber();
            }
            elements = query.setFirstResult(
                    (this.pageNumber - 1) * this.pageSize).setMaxResults(
                    this.pageSize + 1).list();
        } catch (HibernateException e) {
            throw new RuntimeException(e);
        }
    }

    public boolean isFirst() {
        return getPageNumber() == 1;
    }

    public boolean isLast() {
        return getPageNumber() >= getLastPageNumber();
    }

    public boolean hasNext() {
        return getLastPageNumber() > getPageNumber();
    }

    public boolean hasPrevious() {
        return getPageNumber() > 1;
    }

    public int getLastPageNumber() {
        return totalElements % this.pageSize == 0 ? totalElements / this.pageSize : totalElements / this.pageSize + 1;
    }

    /**
     * 返回List类型数据
     *
     * @return List数据源
     */
    public List<T> getThisPageElements() {
        return elements;
    }

    public int getTotalNumberOfElements() {
        return totalElements;
    }

    public int getFirstElementNumber() {
        return (getPageNumber() - 1) * getPageSize() + 1;
    }

    public int getLastElementNumber() {
        int fullPage = getFirstElementNumber() + getPageSize() - 1;
        return getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()
                : fullPage;
    }

    public int getNextPageNumber() {
        return getPageNumber() + 1;
    }

    public int getPreviousPageNumber() {
        return getPageNumber() - 1;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPageNumber() {
        return pageNumber;
    }
}

基于JPA的实现:
public class JPAPage<T> implements Page<T> {

    private List<T> elements;
    private Integer pageSize;
    private Integer pageNumber;
    private Integer totalElements = 0;

    /**
     * 构建JPAPage对象,完成JPAPage的Query数据的分页处理
     *
     * @param countQuery
     *            Hibernate的查询总数的Query对象
     * @param pageNumber
     *            当前页编码
     * @param pageSize
     *            每一页显示的条目数
     * @param dataQuery
     *            Hibernate的查询结果的Query对象
     */
    public JPAPage(Query countQuery, int pageNumber, int pageSize,
            Query dataQuery) {
        // 设置
        this.pageSize = pageSize;
        this.pageNumber = pageNumber;
        // 验证
        if (this.pageNumber < 1) {
            this.pageNumber = 1;
        }
        if (Integer.MAX_VALUE == this.pageNumber || this.pageNumber > getLastPageNumber()) // last page
        {
            this.pageNumber = getLastPageNumber();
        }
        // 注入数据
        try {
            Object obj = countQuery.getSingleResult();
            if (obj != null && obj instanceof Long) {
                this.totalElements = ((Long) obj).intValue();
            } else {
                throw new NumberFormatException("[countQuery is error.]");
            }

            elements = dataQuery.setFirstResult(
                    (this.pageNumber - 1) * this.pageSize).setMaxResults(
                    this.pageSize + 1).getResultList();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public boolean isFirst() {
        return getPageNumber() == 1;
    }

    public boolean isLast() {
        return getPageNumber() >= getLastPageNumber();
    }

    public boolean hasNext() {
        return getLastPageNumber() > getPageNumber();
    }

    public boolean hasPrevious() {
        return getPageNumber() > 1;
    }

    public int getLastPageNumber() {
        return totalElements % this.pageSize == 0 ? totalElements / this.pageSize : totalElements / this.pageSize + 1;
    }

    /**
     * 返回List类型数据
     *
     * @return List数据源
     */
    public List<T> getThisPageElements() {
        return elements;
    }

    public int getTotalNumberOfElements() {
        return totalElements;
    }

    public int getFirstElementNumber() {
        return (getPageNumber() - 1) * getPageSize() + 1;
    }

    public int getLastElementNumber() {
        int fullPage = getFirstElementNumber() + getPageSize() - 1;
        return getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()
                : fullPage;
    }

    public int getNextPageNumber() {
        return getPageNumber() + 1;
    }

    public int getPreviousPageNumber() {
        return getPageNumber() - 1;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPageNumber() {
        return pageNumber;
    }
}

同样,基于JDBC的实现或者其他什么数据结构查询的实现都很简单。使用Freemarker/Velocity分页宏编写也很容易。

这个分页虽然粗糙,但是一般的应用足够了,不过在排序方面还有待改进。
13 楼 ouyangshixiong 2011-04-11  
parwin2 写道
这方法貌似不可取,不能全部结果集全部列出,拿出该页显示的条数即可。否则对于数据比较多的时候速度慢、导致服务器崩溃,多并发的时候那可是严重的问题。

都已经拿出来分好页了,下次直接缓存取不就快了。
我觉得这里的问题不在性能上。问题是万一每页size变了咋办,也不好缓存,每次都去db拉列表,比较杯具。
12 楼 hyneng 2011-04-11  
huqingwei311 写道
比较理想的分页方式是用几条记录就到数据库查几条

难道我现在的方法不是吗?
11 楼 huqingwei311 2011-04-11  
比较理想的分页方式是用几条记录就到数据库查几条
10 楼 hyneng 2011-04-11  
wuhuajun 写道
楼主的意思是全部加在到内存再分页,不然怎么会把内存吃光。。。



不是全部加到内存啊。我用的是mysql,select xxxxx from talbe where whereSql limit ?,?
难道这样会全部加到内存里分页吗?
9 楼 parwin2 2011-04-11  
这方法貌似不可取,不能全部结果集全部列出,拿出该页显示的条数即可。否则对于数据比较多的时候速度慢、导致服务器崩溃,多并发的时候那可是严重的问题。
8 楼 seyaa 2011-04-11  
算出 要分页的所有符合条件数据总数  传过来 一个 pageNo和一个pageSize  计算出 分页的起始点和结束点 得到要取得的数据 就ok了 全部加载到内存 数据太多就会有问题的
7 楼 royboy 2011-04-11  
这种分页不可取吧。这种分页方式只能是数据量相对小的情况下。如果你的系统对性能要求很高而且硬件环境可能得到满足的话,那那把结果集一次性读出,写到缓存里是可以的。看系统实际生产环境吧。
6 楼 lydawen 2011-04-11  
wuhuajun 写道
楼主的意思是全部加在到内存再分页,不然怎么会把内存吃光。。。

那楼主就不会提获取总记录数了,直接 list.size()
5 楼 wuhuajun 2011-04-11  
楼主的意思是全部加在到内存再分页,不然怎么会把内存吃光。。。
4 楼 heavensay 2011-04-11  
微雨骑驴入剑门 写道
如果List的记录很多,是否会把内存吃光?
这种情况考虑过没?

  list 里面 应该只能 分页的记录和表示总数的记录。不会很多
3 楼 微雨骑驴入剑门 2011-04-11  
如果List的记录很多,是否会把内存吃光?
这种情况考虑过没?
2 楼 hyneng 2011-04-11  
yoyo837 写道
我有一个 Class级别的+hibernate的分页 抽象类,,,,改天贴出来看看,在公司电脑;...


期待着,兄弟如果贴出来通知我一下
1 楼 yoyo837 2011-04-10  
我有一个 Class级别的+hibernate的分页 抽象类,,,,改天贴出来看看,在公司电脑;...

相关推荐

    java web常用到的ajax分页思路

    这篇博客“java web常用到的ajax分页思路”可能就是探讨如何结合Ajax与后端技术实现高效、动态的分页。 在传统的Web应用中,用户每次点击分页按钮,整个页面都会重新加载。而使用Ajax,我们可以在后台获取新的分页...

    超简单实用的PHP操作MYSQL数据库类 与分页思路

    分页是当数据量过大时,为了提高用户体验和网站性能而采用的一种策略。`fy.php`可能是实现分页功能的脚本。分页的基本步骤包括: 1. **计算总页数**:根据查询结果中的记录总数和每页显示的记录数来计算。 2. **...

    Java实现分页的前台页面和后台代码

    Java实现分页的前台页面和后台代码 Java实现分页的前台页面和后台代码是指使用Java语言开发的分页功能,包括前台页面的设计和后台代码的实现。下面是对Java实现分页的前台页面和后台代码的详细介绍。 一、前台页面...

    easyUI 实现的后台分页与前台显示功能示例

    后台分页的基本思路是在服务器端进行数据处理,根据前端传来的页码和每页大小来决定 SQL 查询的数据范围。这样可以显著减少数据传输量,提高页面加载速度。在本示例中,使用了 `pageNumber` 表示当前页码,`...

    jsp servlet javaBean后台分页实例代码解析

    1. **分页思路** 后台分页的基本思想是:先从数据库获取所有需要分页的数据,将其存储在一个List集合中,然后根据用户请求的页码,利用List的`subList()`方法对集合进行切割,只将当前页所需的数据传递给前端展示。 ...

    JSP +分页技术+JSP经典分页代码+servlet +分页

    在IT行业中,分页技术是Web开发中不可或缺的一部分,特别是在处理大数据量的展示时,它能够提高用户体验,...通过深入理解这个经典案例,你可以了解到分页实现的基本思路和最佳实践,为自己的项目开发提供有力的支持。

    .net 类的JQuery分页.net 类的JQuery分页

    总的来说,这个项目展示了如何在.NET环境中利用jQuery实现客户端分页,并通过自定义的服务器端处理程序(Handler)和后台代码处理分页请求,有效地分发和加载数据。同时,配置文件、HTML页面、CSS样式和JavaScript...

    PHP自动适应范围的页码分页程序

    本文将详细解析一个PHP自适应范围页码分页程序的设计思路与实现细节,帮助读者理解并掌握其核心原理。 #### 程序背景与目标 在浏览具有大量数据的网页时(如论坛、博客等),传统的分页显示可能会导致页码过多,...

    存储过程写的分页方便 只需要传参 就行

    下面将详细介绍其设计思路、参数含义及实现细节。 ##### 参数定义 - **@Tables**: 数据表名,支持多表联合查询。 - **@PrimaryKey**: 主键字段名,用于排序。 - **@Sort**: 排序字段,默认为主键字段。 - **@...

    java 分页、批量删除

    1. **基础原理**:分页的基本思路是通过SQL查询获取当前页的数据,通常会使用LIMIT或OFFSET关键字来限制返回的记录数。配合着页码和每页记录数,可以计算出要查询的范围。 2. **实现方式**:在JSP中,通常会创建一...

    WPF自定义分页控件

    3. **事件处理**:在后台代码中实现事件处理逻辑。例如,`PageButton_Click`事件处理程序可以更新当前页数,然后触发数据刷新事件。 4. **数据绑定**:使用MVVM(Model-View-ViewModel)模式,将控件的属性绑定到...

    android listview分页查询显示

    分页查询的基本思路是:初次加载时显示前10条数据,当用户滚动到ListView底部(上拉加载)时,触发加载更多的数据。为了实现这一功能,我们需要监听ListView的滚动事件,通常可以通过OnScrollListener接口来实现。在...

    java+servelt+mysql实现简单分页

    网上的分页代码有很多,但是发现许多实例都把数据放到前台处理,后来参考了大神的意见,决定使用后台sql分页代替前台处理。 主要的思路是分为前台和后台,前台主要用html+js+jquery实现,后台采用了jdbc+servelt+...

    asp.net access数据库分页

    分页查询的基本思路是在后台服务器上执行SQL语句,限制返回的数据量,然后在前端展示相应的页面。在Access数据库中,由于不直接支持像SQL Server那样的TOP或LIMIT关键字进行分页,我们需要利用ORDER BY和子查询来...

    winform 分页程序带源码

    - 编写后台代码,处理按钮的Click事件,实现数据的分页加载。 3. **源码解析**: - 假设我们有一个名为`LoadDataByPage`的方法,接收页码(PageIndex)和页大小(PageSize)作为参数,从数据库查询相应数据。 - ...

    jquery分页插件

    《jQuery分页插件详解与应用实践》 在网页开发中,数据的展示往往需要进行分页处理,以便用户能够更有效地浏览大量信息。...在实际应用中,合理配置参数,结合后台数据处理,可以构建出用户体验良好的分页系统。

    查询数据分页的实现

    在IT行业中,数据分页是常见的用户界面设计技术...但基本思路就是前端与后端的协同工作,前端控制分页界面,后端负责根据前端传递的参数执行合适的SQL查询。通过这种方式,我们可以有效地管理和呈现大量的数据库数据。

    jsp+javabean分页

    在Java Web开发中,"jsp+javabean分页"是一个常见的需求,特别是在处理大量数据时,为了提高页面加载速度和用户...在实际开发中,可能还需要考虑其他因素,如分页样式、查询性能优化、动态加载等,但基础思路就是这样。

    vue实现分页栏效果

    在现代Web开发中,尤其是涉及数据管理的应用程序,分页功能几乎成为必不可少的一部分。使用Vue.js框架来实现分页栏效果可以大大提高用户体验。...但总体上,以上提供的核心思路和方法可以作为实现Vue分页栏效果的基础。

Global site tag (gtag.js) - Google Analytics