2013-11-19 20:40 3598人阅读 评论(1) 收藏 举报
 分类:
Web(11) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

要实现分页,首先我们要做的就是如何来编写SQL语句,网上也有很多,大家可以搜一下.在这里,我们使用一种比较常用的方式来编写SQL语句。代码如下:

  1. ----分页显示
  2. select * from (select rownum as r,t.* from
  3. (select emp.* from emp order by hiredate desc) t where rownum<=10)
  4. where r>5;

查询的结果如下:


这个SQL,使用了三层嵌套的查询方式:

1)最内层的select 语句

最内层的Select语句是一条普通的查询语句,它的执行结果,将是emp表中的所有数据按照受雇日期降序排列.

2)第二层的select 语句

这一层的Select 语句使用了rownum,这条语句的执行结果就是从最内层语句的查询结果中按照rownum的顺序取出前10条.实际上,中间层的select 语句的执行结果是限制查询记录数量的最大记录数。

3)最外层的select 语句

既然中间层的select语句控制了查询过程中数据的最大记录数,那么最外层的select语句就要控制查询过程中的最小记录数。由此可以得出的结论是:上面SQL的执行结果就是查询emp表中第6条~~~第10条的数据记录.

通过以上的分析,我们了解了在Oracle众分页查询的实现原理。现在要做的就是在第二层和最外层将数据库记录的最大值和最小值替换成我们需要的值。

在分页显示时,每页显示数据量是固定的,假设每页显示10条数据,第1页的编号就是1到10,当用户单击第二页时显示的数据编号为11--20,以此类推,限制最后一页。

这样我们可以总结出一个规律:

每页显示的第一条数据行号应该等于 【每页显示的数据量*(当前页码-1)+1】。-----可以看出上面的SQL的最外层 R>【每页显示的数据量*(当前页码-1)】,这样行号才匹配。

每页显示的最后一条数据行号等于【每页显示的数据量*当前页码】。

经过分析,我们对上面的SQL进行修改,得到下面的代码:

  1. String sql="select * from (select rownum as r,t.* from " +
  2. "(select emp.* from emp order by hiredate desc) t where  rownum<="+(pageSize*pageIndex)
  3. +") where r>"+pageSize*(pageIndex-1);

上面就是下面将要使用的分页查询的SQL语句,并使用到了两个变量,分别是pageSize和pageIndex,其中pageSize表示每页显示的数据条数,而pageIndex变量表示当前页的页码。

下面的代码是简单的实现了Oracle分页查询在JSP分页展示数据的实现。写的比较简单,在JSP中嵌套Java代码比较乱,建议使用Servlet。

首先,需要编写一个是实现分页查询的java类,没有进行特殊的整合,凑合着吧,原理就是这样:

  1. package com.dao;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. public class EmpDao {
  12. private Connection conn=null;
  13. private PreparedStatement psmt=null;
  14. private ResultSet rs=null;
  15. /**
  16. * 获得数据库连接
  17. */
  18. private void openConn(){
  19. //首先定义下连接数据的URL、用户名、密码
  20. String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
  21. String user="scott";
  22. String password="yulei123";
  23. try {
  24. Class.forName("oracle.jdbc.driver.OracleDriver");
  25. conn=DriverManager.getConnection(url,user,password);
  26. } catch (ClassNotFoundException e) {
  27. e.printStackTrace();
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. /**
  33. * 获得所有员工数据
  34. */
  35. public List getAllemp(){
  36. List list=new ArrayList();
  37. openConn();
  38. String sql="select * from emp order by hiredate desc";
  39. try {
  40. psmt=conn.prepareStatement(sql);
  41. rs=psmt.executeQuery();
  42. while(rs.next()){
  43. Map emps=new HashMap();
  44. emps.put("empno", rs.getString("empno"));
  45. emps.put("ename",rs.getString("ename"));
  46. emps.put("sal", rs.getString("sal"));
  47. list.add(emps);
  48. }
  49. } catch (SQLException e) {
  50. e.printStackTrace();
  51. }
  52. return list;
  53. }
  54. /**
  55. *  获取第几页的数据
  56. */
  57. public List getAllempByPage(int pageSize,int pageIndex){
  58. List list =new ArrayList();
  59. String sql="select * from (select rownum as r,t.* from " +
  60. "(select emp.* from emp order by hiredate desc) t where  rownum<="+(pageSize*pageIndex)
  61. +") where r>"+pageSize*(pageIndex-1);
  62. try {
  63. psmt=conn.prepareStatement(sql);
  64. rs=psmt.executeQuery();
  65. while(rs.next()){
  66. Map map=new HashMap();
  67. map.put("empno", rs.getString("empno"));
  68. map.put("ename",rs.getString("ename"));
  69. map.put("sal", rs.getString("sal"));
  70. list.add(map);
  71. }
  72. } catch (SQLException e) {
  73. e.printStackTrace();
  74. }
  75. return list;
  76. }
  77. /**
  78. *  获取员工的总数
  79. *
  80. */
  81. public int countEmp(){
  82. int count=0;
  83. String sql="select count(*) from emp";
  84. openConn();
  85. try {
  86. psmt=conn.prepareStatement(sql);
  87. rs=psmt.executeQuery();
  88. while(rs.next()){
  89. count=rs.getInt(1);
  90. }
  91. } catch (SQLException e) {
  92. e.printStackTrace();
  93. }
  94. return count;
  95. }
  96. /**
  97. *  根据每页显示的数量,得到总页数
  98. */
  99. public int getTotalPage(int pageSize){
  100. int totalPage=countEmp();
  101. return (totalPage%pageSize==0)?(totalPage/pageSize):(totalPage/pageSize+1);
  102. }
  103. }

接下来就是编写JSP文件,命名为pageTest.jsp.

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@page import="com.dao.EmpDao"%>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>Oracle分页</title>
  7. </head>
  8. <body>
  9. <%
  10. EmpDao ed=new EmpDao();
  11. int pageSize=4;//每页显示的记录
  12. int totalpages=ed.getTotalPage(pageSize); //最大页数
  13. String currentPage=request.getParameter("pageIndex"); //获得当前的页数,即第几页
  14. if(currentPage==null){
  15. currentPage="1";
  16. }
  17. int pageIndex=Integer.parseInt(currentPage);
  18. //添加逻辑判断,防止页数异常
  19. if(pageIndex<1){
  20. pageIndex=1;
  21. }else if(pageIndex>totalpages){
  22. pageIndex=totalpages;
  23. }
  24. List list= ed.getAllempByPage(pageSize,pageIndex);  //返回特定页数的数据
  25. %>
  26. <!-- 循环显示员工的数据 -->
  27. <table border="1">
  28. <tr>
  29. <td>员工工号</td>
  30. <td>员工姓名</td>
  31. <td>员工工资</td>
  32. </tr>
  33. <%
  34. Map map=null;
  35. for(int i=0;i<list.size();i++){
  36. map=(Map)list.get(i);
  37. %>
  38. <tr>
  39. <td><%=map.get("empno") %></td>
  40. <td><%=map.get("ename") %></td>
  41. <td><%=map.get("sal")%></td>
  42. </tr>
  43. <% }%>
  44. </table>
  45. <a href="pageTest.jsp?pageIndex=1">首页</a>
  46. <a href="pageTest.jsp?pageIndex=<%=pageIndex-1 %>">上一页</a>
  47. <a href="pageTest.jsp?pageIndex=<%=pageIndex+1 %>">下一页</a>
  48. <a href="pageTest.jsp?pageIndex=<%=totalpages%>">末页</a>
  49. <br/>
  50. <p style="color:red"">当前页数:<%=pageIndex%></p>
  51. </body>
  52. </html>

最后,我们在浏览器访问这个JSP文件.(http://127.0.0.1:7001/jsp/day4/pageTest.jsp).得到下面的显示效果:

当我们单击下一页或上一页的时候会显示不同的数据:

转:JSP 分页显示数据 (Oracle)的更多相关文章

  1. JSP 分页显示数据 (Oracle)

    要实现分页,首先我们要做的就是如何来编写SQL语句,网上也有很多,大家可以搜一下.在这里,我们使用一种比较常用的方式来编写SQL语句.代码如下: ----分页显示 select * from (sel ...

  2. JSP分页显示实例(基于Bootstrap)

    首先介绍一款简单利落的分页显示利器:bootstrap-paginator 效果截图: GitHub官方下载地址:https://github.com/lyonlai/bootstrap-pagina ...

  3. ASP.NET(五):ASP.net实现真分页显示数据

    导读:在上篇文章中,介绍了用假分页实现数据的分页显示 ,而避免了去拖动滚动条.但,假分页在分页的同时,其实是拖垮了查询效率的.每一次分页都得重新查询一遍数据,那么有没有方法可以同时兼顾效率和分页呢,那 ...

  4. ASP.NET(四):ASP.net实现假分页显示数据

    导读:在做数据查询的时候,有的时候查询到的数据有很多.通常呢,我们一般都是去拖动右侧边的滚动条.但是,有了分页后,我们就可以不必是使用滚动条,而直接通过分页查看我们想要的数据.在分页的过程中,有分为真 ...

  5. 简单的JSP分页显示

    1.mysql的limit关键字 (DAO) select * from tablename limit startPoint, numberPerPage; tablename 就是要分页显示的那张 ...

  6. repeater 分页显示数据

    表名:ChinaStates 控件:Repeater 查询代码DA: public class ChinaStatesDA { private DataClassesDataContext Conte ...

  7. JSP页面分页显示数据

    效果如上图所示!最多显示10条:完整jsp和后台代码如下: <%@ page contentType="text/html;charset=UTF-8" %> < ...

  8. JSP分页显示

    首先要定义四个变量: int pageSize: //每页显示多少条记录 int pageNow: //希望显示第几页 int pageCount: //一共有多少页 int rowCount: // ...

  9. ligerui做分页显示数据

    现在前台技术用到的是ligerui,一直想写一个有关ligerui的显示,利用加班的今天偷点闲复制一下下,当自己的一些小资料吧,不会的时候,还可以来看看............稍微有点多,毕竟是从前后 ...

随机推荐

  1. Java中的条件编译(转)

    源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/ ...

  2. easyui 异步json tree跨域访问问题解决

    最近在用easyui中的异步tree时发现了跨域访问问题,我们都知道jquery ajax提供get请求的跨域访问.所以解决easyui tree跨域访问的问题便是将数据通过jquery ajax将数 ...

  3. 微信小程序之----弹框组件modal

    modal modal类似于javascript中的confirm弹框,默认情况下是一个带有确认取消的弹框,不过点击取消后弹框不会自动隐藏,需要通过触发事件调用函数来控制hidden属性. 官方文档 ...

  4. JavaScript高级程序设计-8:BOM

    1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...

  5. Oracle用户管理和角色管理

    原博:http://liwx.iteye.com/blog/1182251 一.创建用户的Profile文件 SQL> create profile student limit // stude ...

  6. centOS IP能ping通但是域名ping不通

    centOS IP能ping通但是域名ping不通, 导致了yum update 无更新. 百度了很久,最后有个方法试过解决了: iptables -X iptables -F 然后重新 yum up ...

  7. 25+免费的Bootstrap HTML5网站模板

    在前端框架中,Bootstrap可以说是非常有名的高级网站设计框架.网上也有很多使用Bootstrap程序创建的免费模板.这些模板设计成响应式模式,因此你可以使用它们来为所有的设备平台和浏览器创建网站 ...

  8. C#中如何使用IComparable<T>与IComparer<T>接口(转载)

    本分步指南描述如何使用两个接口: IComparer和IComparable.在同一篇文章中讨论这些接口有两个原因.经常在一起,使用这些接口和接口类似 (并且有相似的名称),尽管它们用于不同用途. 如 ...

  9. EhLib DBGridEh组件在Delphi中应用全攻略总结(转)

    EhLib DBGridEh组件在Delphi中应用全攻略总结(转) http://blog.sina.com.cn/s/blog_94b1b40001013xn0.html 优化SQL查询:如何写出 ...

  10. Oracle 表空间迁移

    迁移表空间databump 使用databump导入导出,两个库用户必须一致,否则另一个库导入的时候会报错.所以两个库都是用helei用户. 给两个数据库的用户分别授予dba权限,这里只是实验更清晰而 ...