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后台发送接口时遇到了一些问题,在这里做一个简单的总结. 官方接口 官方给出的接口叫做wx.request,请求方式比较简单,下面是官网给出的请求实 ...

  2. realvnc viewer 5.3.2无需输入用户名和密码访问远程桌面

    我从https://www.realvnc.com/download/viewer/下载了realvnc viewer用于访问远程的Linux桌面,这个版本不需要安装,直接运行就可以了.但在访问远程桌 ...

  3. react programming

    So you're curious in learning this new thing called Reactive Programming, particularly its variant c ...

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

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

  5. css强制折行和隐藏超出部分

    一.强制换行1 word-break: break-all; 只对英文起作用,以字母作为换行依据. 2 word-wrap: break-word; 只对英文起作用,以单词作为换行依据. 3 whit ...

  6. C++ CRTP singleton

    C++ CRTP 是个很有意思的东西,因为解释原理的文章很多,但是讲怎么用的就不是很多了. 今天就稍微写下CRTP(奇异递归模板模式)的一个有趣的用法:Singleton(单例模式) 单例有很多中写法 ...

  7. web前端好学吗?

    最近这段时间许多学生讨论关于WEB前端工程师这个职位的问题.比如:关于前端难不难?好不好找工作?有没有用?好不好学?待遇好不好?好不好转其他的职位? 针对这个问题,课工场露露老师想跟大家谈谈自己对前端 ...

  8. Pearson相关系数

    理解皮尔逊相关的两个角度 其一, 按照高中数学水平来理解, 皮尔逊相关(Pearson Correlation Coefficient)很简单, 可以看做将两组数据首先做Z分数处理之后, 然后两组数据 ...

  9. MVC 视图-模型,动态更新

    <!DOCTYPE html> <html> <head> <title>Binding</title> <script src=&q ...

  10. GOLang(数组操作随篇)

    创建一个类似PHP Array $data["userInfo"] = ["name"=>"Josn","ages" ...