- 浏览: 249336 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (159)
- java (38)
- extjs (6)
- jquery (3)
- struts2 (0)
- hibernate (3)
- spring (1)
- flex (1)
- css (2)
- js (3)
- html (4)
- android (4)
- linux (9)
- swing (0)
- java E-mail (0)
- 心情故事 (11)
- mysql (4)
- jbpm (7)
- 我的搜索之路 (2)
- MyBatis (3)
- 玩转svn (3)
- 生活无处不美 (0)
- 工具 (4)
- 数据统计与分析 (1)
- quartz (1)
- webservices (2)
- jboss (1)
- php (1)
- hadoop (3)
- maven (5)
- Discuz! (1)
- windows (1)
- 站长之家 (1)
- OSGi (1)
- 软件测试 (2)
- redis (4)
- git (5)
- MongoDB (4)
- lucene (3)
- freemarker (5)
- html5 (4)
- itext (1)
- nginx (1)
最新评论
-
kiansoung:
在Slave机器需不需开SecondaryNameNode程序 ...
快速了解Hadoop架构 -
忧郁的小老虎:
openjdk和jdk的区别与联系 -
TheMatrix:
...
MyBatis入门实例 -
lishl:
非常感谢分享。详细,务实。赞一个。
Lucene学习笔记【2013-04-10更新】 -
派尔人事:
关于JPA一对一关系的删除问题,有请大家帮忙,感激不尽
总结一下后台分页的思路。
只要获取到一个结果集(List)和总记录数就可以了。这样就可以计算出当前页,总页数,上一页,下一页等。
wuhuajun 写道
楼主的意思是全部加在到内存再分页,不然怎么会把内存吃光。。。
不是全部加到内存啊。我用的是mysql,select xxxxx from talbe where whereSql limit ?,?
难道这样会全部加到内存里分页吗?
都已经拿出来分好页了,下次直接缓存取不就快了。
我觉得这里的问题不在性能上。问题是万一每页size变了咋办,也不好缓存,每次都去db拉列表,比较杯具。
难道我现在的方法不是吗?
不是全部加到内存啊。我用的是mysql,select xxxxx from talbe where whereSql limit ?,?
难道这样会全部加到内存里分页吗?
那楼主就不会提获取总记录数了,直接 list.size()
list 里面 应该只能 分页的记录和表示总数的记录。不会很多
期待着,兄弟如果贴出来通知我一下
只要获取到一个结果集(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官方的一篇文章修改的,应该还是可以用的。
基于Hibernate的实现:
基于JPA的实现:
同样,基于JDBC的实现或者其他什么数据结构查询的实现都很简单。使用Freemarker/Velocity分页宏编写也很容易。
这个分页虽然粗糙,但是一般的应用足够了,不过在排序方面还有待改进。
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在线视频教程之基础教程(更新完)
2013-06-03 22:54 39JAVA基础教程(更新完) 孔浩老师JAVA基 ... -
使用jcrop+springmvc实现头像上传与裁剪
2013-05-24 09:15 36使用jcrop+springmvc实现头像上传与裁剪功能 ... -
根据文章内容获取摘要的解决方案
2013-03-26 22:23 1167如果有一篇文章,根据文章内容提取出一个简短的摘要,有哪些实现方 ... -
Spring与工厂模式
2013-03-26 16:37 19731. 前言 我相信很多在刚刚使用Sprin ... -
登录成功后不刷新页面,在页面怎样获取登录用户的信息
2013-03-11 22:50 1677用ajax登录,登录成功后不刷新页面,在页面怎样获取 ... -
面试老碰壁,是不是由于基础不够牢固
2013-03-08 14:05 1850最近面试老碰壁,虽然有一定的开发经验,但问的问题虽然比较基础 ... -
这样的面试题,你能回答几个
2013-02-28 10:52 13661 ,了解hbase么,为什么存储速度快? 2理解sprin ... -
获取文章中的图片
2013-01-30 09:48 1138瀑布流的功能开发完了,感觉还不错,地址是:http:/ ... -
java cms 在线安装原理及详细步骤
2013-01-26 13:16 1133java cms 在线安装原理及详细步骤,详细代码请 ... -
java反射详解(一)_Class类
2012-11-17 09:24 694Class类 Java类用于描述一类事物的共性, ... -
领悟书生写论坛之类图设计
2012-09-20 00:37 1046大家好,今晚设计了BBS的类图,和大家分享一下。其实也比较简单 ... -
获取web根目录下的文件与类路径下的文件的方法
2012-08-06 21:41 11341.获取web项目根目录下的文件 读取web项目根目录下的某 ... -
JasperReports结合iReport制作报表-使用JasperReports生成报表
2012-06-11 22:54 1702《JasperReports结合iReport制作报表-使用i ... -
JasperReports结合iReport制作报表-使用iReport设计报表
2012-06-11 13:56 2524下载 iReport iReport ... -
学习笔记系统文章(提供PDF下载,2012-06-08 23:27更新)
2012-06-08 13:23 21022012-06-11 JasperReports结合i ... -
Java日期操作总汇
2012-06-06 08:35 831字符串转为Date对象 public sta ... -
ubuntu学习笔记2
2012-06-01 22:37 1128安装jdk <!--[if !support ... -
尚学堂科技_张志宇_SERVLET_JSP_视频教程下载地址(每集分开下载)
2012-05-27 23:49 1073由于师弟在学校的流量有限,下载也不方便,他委托我帮 ... -
移动用户资费统计系统学习笔记续一(下载附件更易阅读)
2012-05-26 23:04 792接着上一节的需求,我们再来整理一下费用明细,因为我看了好几次才 ... -
移动用户资费统计系统学习笔记
2012-05-26 08:46 816前天学习了移动用户资 ...
相关推荐
这篇博客“java web常用到的ajax分页思路”可能就是探讨如何结合Ajax与后端技术实现高效、动态的分页。 在传统的Web应用中,用户每次点击分页按钮,整个页面都会重新加载。而使用Ajax,我们可以在后台获取新的分页...
分页是当数据量过大时,为了提高用户体验和网站性能而采用的一种策略。`fy.php`可能是实现分页功能的脚本。分页的基本步骤包括: 1. **计算总页数**:根据查询结果中的记录总数和每页显示的记录数来计算。 2. **...
Java实现分页的前台页面和后台代码 Java实现分页的前台页面和后台代码是指使用Java语言开发的分页功能,包括前台页面的设计和后台代码的实现。下面是对Java实现分页的前台页面和后台代码的详细介绍。 一、前台页面...
后台分页的基本思路是在服务器端进行数据处理,根据前端传来的页码和每页大小来决定 SQL 查询的数据范围。这样可以显著减少数据传输量,提高页面加载速度。在本示例中,使用了 `pageNumber` 表示当前页码,`...
1. **分页思路** 后台分页的基本思想是:先从数据库获取所有需要分页的数据,将其存储在一个List集合中,然后根据用户请求的页码,利用List的`subList()`方法对集合进行切割,只将当前页所需的数据传递给前端展示。 ...
在IT行业中,分页技术是Web开发中不可或缺的一部分,特别是在处理大数据量的展示时,它能够提高用户体验,...通过深入理解这个经典案例,你可以了解到分页实现的基本思路和最佳实践,为自己的项目开发提供有力的支持。
总的来说,这个项目展示了如何在.NET环境中利用jQuery实现客户端分页,并通过自定义的服务器端处理程序(Handler)和后台代码处理分页请求,有效地分发和加载数据。同时,配置文件、HTML页面、CSS样式和JavaScript...
本文将详细解析一个PHP自适应范围页码分页程序的设计思路与实现细节,帮助读者理解并掌握其核心原理。 #### 程序背景与目标 在浏览具有大量数据的网页时(如论坛、博客等),传统的分页显示可能会导致页码过多,...
下面将详细介绍其设计思路、参数含义及实现细节。 ##### 参数定义 - **@Tables**: 数据表名,支持多表联合查询。 - **@PrimaryKey**: 主键字段名,用于排序。 - **@Sort**: 排序字段,默认为主键字段。 - **@...
1. **基础原理**:分页的基本思路是通过SQL查询获取当前页的数据,通常会使用LIMIT或OFFSET关键字来限制返回的记录数。配合着页码和每页记录数,可以计算出要查询的范围。 2. **实现方式**:在JSP中,通常会创建一...
3. **事件处理**:在后台代码中实现事件处理逻辑。例如,`PageButton_Click`事件处理程序可以更新当前页数,然后触发数据刷新事件。 4. **数据绑定**:使用MVVM(Model-View-ViewModel)模式,将控件的属性绑定到...
分页查询的基本思路是:初次加载时显示前10条数据,当用户滚动到ListView底部(上拉加载)时,触发加载更多的数据。为了实现这一功能,我们需要监听ListView的滚动事件,通常可以通过OnScrollListener接口来实现。在...
网上的分页代码有很多,但是发现许多实例都把数据放到前台处理,后来参考了大神的意见,决定使用后台sql分页代替前台处理。 主要的思路是分为前台和后台,前台主要用html+js+jquery实现,后台采用了jdbc+servelt+...
分页查询的基本思路是在后台服务器上执行SQL语句,限制返回的数据量,然后在前端展示相应的页面。在Access数据库中,由于不直接支持像SQL Server那样的TOP或LIMIT关键字进行分页,我们需要利用ORDER BY和子查询来...
- 编写后台代码,处理按钮的Click事件,实现数据的分页加载。 3. **源码解析**: - 假设我们有一个名为`LoadDataByPage`的方法,接收页码(PageIndex)和页大小(PageSize)作为参数,从数据库查询相应数据。 - ...
《jQuery分页插件详解与应用实践》 在网页开发中,数据的展示往往需要进行分页处理,以便用户能够更有效地浏览大量信息。...在实际应用中,合理配置参数,结合后台数据处理,可以构建出用户体验良好的分页系统。
在IT行业中,数据分页是常见的用户界面设计技术...但基本思路就是前端与后端的协同工作,前端控制分页界面,后端负责根据前端传递的参数执行合适的SQL查询。通过这种方式,我们可以有效地管理和呈现大量的数据库数据。
在Java Web开发中,"jsp+javabean分页"是一个常见的需求,特别是在处理大量数据时,为了提高页面加载速度和用户...在实际开发中,可能还需要考虑其他因素,如分页样式、查询性能优化、动态加载等,但基础思路就是这样。
在现代Web开发中,尤其是涉及数据管理的应用程序,分页功能几乎成为必不可少的一部分。使用Vue.js框架来实现分页栏效果可以大大提高用户体验。...但总体上,以上提供的核心思路和方法可以作为实现Vue分页栏效果的基础。