这里有新鲜出炉的 Java 并发编程示例,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
这篇文章主要为大家详细介绍了 Java 分页简介的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
什么是分页技术
分页, 是一种将所有数据分段展示给用户的技术. 用户每次看到的不是全部数据, 而是其中的一部分, 如果在其中没有找到自习自己想要的内容, 用户可以通过制定页码或是翻页的方式转换可见内容, 直到找到自己想要的内容为止. 其实这和我们阅读书籍很类似.
分页的意义
分页确实有效, 但它一定会加大系统的复杂度, 但可否不分页呢? 如果数据量少的话当然可以. 但是对于企业信息系统来说数据量不会限制在一个小范围内. 如果不顾一切的 Select * from 某个表, 再将返回的数据一古脑的扔给客户, 即使客户能够忍受成千上万足够让人眼花缭乱的表格式数据, 繁忙的网络, 紧张的服务器也会提出它们无声的抗议, 甚至有时会以彻底的罢工作为终结. 这个结局有点像古代为所欲为的暴君和他忍无可忍的臣民之间的故事.
程序员不是暴君, 他希望程序使生活变得更好而不是更糟. 考虑到企业信息系统多是三层甚至更多层架构的事实, 程序员在向客户展示数据时都应该采取分页的形式. 如果他不想被抱怨淹没或是半夜被电话惊醒的话.
从请求发起到返回数据的整个过程
现在你已经下定决心想要分页了, 在动手书写代码之前, 先让我们回想一下, 在典型的三层架构中, 从请求发起到返回数据的整个过程. 如下所示:
在哪里进行分页
从上面的图中我们可以观察得知, 在 SQL 语句处理完毕后, 数据库, webApplication 和 Browser 都能进行分页, 那在哪里分页好呢
判断的标准是速度, 显而易见, 数据库服务器, Web 应用服务器和客户端之间是网络, 如果网络传递的数据量越少, 则客户端获得响应的速度越快. 而且一般来说, 数据库服务器和 Web 应用服务器的处理能力一般比客户端要强很多. 从这两点来看, 在客户端分页的方案是最不可取的.
其次就剩下了在 Web 服务器端分页和在数据库端分页两种方式了, 如果选择在 Web 服务器端分页的话, 大部分的被过滤掉的数据还是被传输到了 Web 应用服务器端, 与其这样还不如直接在数据库端进行分页.
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据.这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程.而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了.
分页的 SQL 语句
如果我们是通过 JDBC 的方式访问数据库, 那么就有必要根据数据库类型采取不同的 SQL 分页语句, 对于 MySQL 数据库, 我们可以采用 limit 语句进行分页, 对于 Oracle 数据库, 我们可以采用 rownum 的方式进行分页.
(1)MySql 的 Limit m,n 语句
Limit 后的两个参数中,参数 m 是起始下标,它从 0 开始;参数 n 是返回的记录数.我们需要分页的话指定这两个值即可
(2)Oracle 数据库的 rownum
在 Oracle 数据库中, 分页方式没有 MySql 这样简单, 它需要依靠 rownum 来实现.
Rownum 表示一条记录的行号, 值得注意的是它在获取每一行后才赋予. 因此, 想指定 rownum 的区间来取得分页数据在一层查询语句中是无法做到的, 要分页还要进行一次查询.
其中最内层的查询 SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句.ROWNUM <= 40 和 RN>= 21 控制分页查询的每页的范围.
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
上面给出的这个分页查询语句,在大多数情况拥有较高的效率.分页的目的就是控制输出结果集大小,将结果尽快的返回.在上面的分页查询语句中,这种考虑主要体现在 WHERE ROWNUM <= 40 这句上.
选择第 21 到 40 条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过 ROWNUM <= 40 来控制最大值,在查询的最外层控制最小值.而另一种方式是去掉查询第二层的 WHERE ROWNUM <= 40 语句,在查询的最外层控制分页的最小值和最大值.这是,查询语句如下:
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多.
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
这是由于 CBO 优化模式下,Oracle 可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率.对于第一个查询语句,第二层的查询条件 WHERE ROWNUM <= 40 就可以被 Oracle 推入到内层查询中,这样 Oracle 查询的结果一旦超过了 ROWNUM 限制条件,就终止查询将结果返回了.
而第二个查询语句,由于查询条件 BETWEEN 21 AND 40 是存在于查询的第三层,而 Oracle 无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道 RN 代表什么).因此,对于第二个查询语句,Oracle 最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据.数据的过滤在最外层完成,显然这个效率要比第一个查询低得多.
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效.
来源: http://www.phperz.com/article/18/0115/355137.html