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

----分页显示
select * from (select rownum as r,t.* from
(select emp.* from emp order by hiredate desc) t where rownum<=10)
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进行修改,得到下面的代码:

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

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

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

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

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class EmpDao {
private Connection conn=null;
private PreparedStatement psmt=null;
private ResultSet rs=null;
/**
* 获得数据库连接
*/
private void openConn(){
//首先定义下连接数据的URL、用户名、密码
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user="scott";
String password="yulei123";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 获得所有员工数据
*/
public List getAllemp(){
List list=new ArrayList();
openConn();
String sql="select * from emp order by hiredate desc";
try {
psmt=conn.prepareStatement(sql);
rs=psmt.executeQuery();
while(rs.next()){
Map emps=new HashMap();
emps.put("empno", rs.getString("empno"));
emps.put("ename",rs.getString("ename"));
emps.put("sal", rs.getString("sal"));
list.add(emps);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 获取第几页的数据
*/
public List getAllempByPage(int pageSize,int pageIndex){
List list =new ArrayList();
String sql="select * from (select rownum as r,t.* from " +
"(select emp.* from emp order by hiredate desc) t where rownum<="+(pageSize*pageIndex)
+") where r>"+pageSize*(pageIndex-1);
try {
psmt=conn.prepareStatement(sql);
rs=psmt.executeQuery();
while(rs.next()){
Map map=new HashMap();
map.put("empno", rs.getString("empno"));
map.put("ename",rs.getString("ename"));
map.put("sal", rs.getString("sal"));
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 获取员工的总数
*
*/
public int countEmp(){
int count=0;
String sql="select count(*) from emp";
openConn();
try {
psmt=conn.prepareStatement(sql);
rs=psmt.executeQuery();
while(rs.next()){
count=rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
/**
* 根据每页显示的数量,得到总页数
*/
public int getTotalPage(int pageSize){
int totalPage=countEmp();
return (totalPage%pageSize==0)?(totalPage/pageSize):(totalPage/pageSize+1);
}
}

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

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.dao.EmpDao"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Oracle分页</title>
</head>
<body>
<%
EmpDao ed=new EmpDao();
int pageSize=4;//每页显示的记录
int totalpages=ed.getTotalPage(pageSize); //最大页数
String currentPage=request.getParameter("pageIndex"); //获得当前的页数,即第几页
if(currentPage==null){
currentPage="1";
}
int pageIndex=Integer.parseInt(currentPage);
//添加逻辑判断,防止页数异常
if(pageIndex<1){
pageIndex=1;
}else if(pageIndex>totalpages){
pageIndex=totalpages;
}
List list= ed.getAllempByPage(pageSize,pageIndex); //返回特定页数的数据
%>
<!-- 循环显示员工的数据 -->
<table border="1">
<tr>
<td>员工工号</td>
<td>员工姓名</td>
<td>员工工资</td>
</tr>
<%
Map map=null;
for(int i=0;i<list.size();i++){
map=(Map)list.get(i);
%>
<tr>
<td><%=map.get("empno") %></td>
<td><%=map.get("ename") %></td>
<td><%=map.get("sal")%></td>
</tr>
<% }%>
</table>
<a href="pageTest.jsp?pageIndex=1">首页</a> 
<a href="pageTest.jsp?pageIndex=<%=pageIndex-1 %>">上一页</a>
<a href="pageTest.jsp?pageIndex=<%=pageIndex+1 %>">下一页</a>
<a href="pageTest.jsp?pageIndex=<%=totalpages%>">末页</a>
<br/>
<p style="color:red"">当前页数:<%=pageIndex%></p>
</body>
</html>

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

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

分页的大概原理就是这样,有什么疑问的可以留言,谢谢!

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

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

    JSP 分页显示数据 (Oracle) 标签: Oracle分页JSP分页 2013-11-19 20:40 3598人阅读 评论(1) 收藏 举报  分类: Web(11)  版权声明:本文为博主原 ...

  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. 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器

     1  Lucene卡发包结构分析 包名 功能 org.apache.lucene.analysis Analysis提供自带的各种Analyzer org.apache.lucene.colla ...

  2. Mybatis源码分析之缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  3. shell 数据流重定向操作符总结

    最近看了鸟哥私房菜关于shell数据流重定向的内容,总结一下. 操作符: 1.标准输入(stdin):代码为0,符号:< 或者<< 2.标准输出(stdout):代码为1,符号:&g ...

  4. 【Android应用开发】Android Studio - MAC 版 - 快捷键详解

    博客地址 : http://blog.csdn.net/shulianghan/article/details/47321177 作者 : 韩曙亮 要点总结 : -- 熟练使用快捷键 : 在任何编程环 ...

  5. React Native自动化测试

    大凡做软件开发,肯定会涉及到很多的测试,本地测试,Junit测试,用例测试等,今天就来说说RN的测试. React Native的官方代码仓库里有一些测试代码,你可以在贡献代码之后回归测试一下,以检测 ...

  6. THE SCHOOLS WHERE APPLE, GOOGLE, AND FACEBOOK GET THEIR RECRUITS

  7. [Mysql]备份同库中一张表的历史记录 insert into ..select

    需求 现在有个这么一个需求,mysql中有个表,数据增长的很快,但是呢这个数据有效期也就是1个月,一个月以前的记录不太重要了,但是又不能删除.为了保证这个表的查询速度,需要一个简单的备份表,把数据倒进 ...

  8. path和classpath的区别

    path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6 ...

  9. iOS中 自定义系统相机 作者:韩俊强

    需要框架: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> 布局如下 ...

  10. pig强制转换(字符到整数):首位0怎么处理,‘01’到1的转化,

    pig支持的类型转换(cast) Pig Latin supports casts as shown in this table. from / to bag tuple map int long f ...