JSP 分页显示数据 (Oracle)
要实现分页,首先我们要做的就是如何来编写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)的更多相关文章
- 转:JSP 分页显示数据 (Oracle)
JSP 分页显示数据 (Oracle) 标签: Oracle分页JSP分页 2013-11-19 20:40 3598人阅读 评论(1) 收藏 举报 分类: Web(11) 版权声明:本文为博主原 ...
- JSP分页显示实例(基于Bootstrap)
首先介绍一款简单利落的分页显示利器:bootstrap-paginator 效果截图: GitHub官方下载地址:https://github.com/lyonlai/bootstrap-pagina ...
- ASP.NET(五):ASP.net实现真分页显示数据
导读:在上篇文章中,介绍了用假分页实现数据的分页显示 ,而避免了去拖动滚动条.但,假分页在分页的同时,其实是拖垮了查询效率的.每一次分页都得重新查询一遍数据,那么有没有方法可以同时兼顾效率和分页呢,那 ...
- ASP.NET(四):ASP.net实现假分页显示数据
导读:在做数据查询的时候,有的时候查询到的数据有很多.通常呢,我们一般都是去拖动右侧边的滚动条.但是,有了分页后,我们就可以不必是使用滚动条,而直接通过分页查看我们想要的数据.在分页的过程中,有分为真 ...
- 简单的JSP分页显示
1.mysql的limit关键字 (DAO) select * from tablename limit startPoint, numberPerPage; tablename 就是要分页显示的那张 ...
- repeater 分页显示数据
表名:ChinaStates 控件:Repeater 查询代码DA: public class ChinaStatesDA { private DataClassesDataContext Conte ...
- JSP页面分页显示数据
效果如上图所示!最多显示10条:完整jsp和后台代码如下: <%@ page contentType="text/html;charset=UTF-8" %> < ...
- JSP分页显示
首先要定义四个变量: int pageSize: //每页显示多少条记录 int pageNow: //希望显示第几页 int pageCount: //一共有多少页 int rowCount: // ...
- ligerui做分页显示数据
现在前台技术用到的是ligerui,一直想写一个有关ligerui的显示,利用加班的今天偷点闲复制一下下,当自己的一些小资料吧,不会的时候,还可以来看看............稍微有点多,毕竟是从前后 ...
随机推荐
- Jstorm与RocketMQ整合
如果是经常关注阿里巴巴的朋友们,看到我这篇博客的题目,就知道我在参加今年的中间件比赛. 好了,废话不说,开始了. 首先我们知道,rocketmq的consumer有两种,一种是DefaultMQPus ...
- 12 SharedPreferences
SharedPreferences 创建方式 SharedPreferences preferences = getPreferences(Context context ,int mode); 参数 ...
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- Win 10 下 android studio显示 Intel haxm无法安装,以及VT-X和hyper-x的冲突问题
我 的电脑是神舟战神k650c i7 D4,处理器是Intel core i7 4710-MQ,系统是win 10的 我心血来潮想学习一下安卓开发,就首先安装了android s ...
- Android初级教程理论知识(第一章快速入门)
一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...
- Hadoop分布式存储系统HDFS
1.hadoop fs 指令 -ls -ls <路径> 查看指定路径的当前目录结构 -lsr -lsr <路径> 递归查看指定路径的目录结构 -du -du <路径> ...
- Chapter 2 User Authentication, Authorization, and Security(5):使用固定服务器角色
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38844999,专题目录:http://blog.csdn.net/dba_huangzj ...
- Linux信号实践(5) --时间与定时器
三种不同精度的睡眠 1.sleep #include <unistd.h> unsigned int sleep(unsigned int seconds); RETURN VALUE Z ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- python 多窗口编辑
同时打开多个文件: 1,vim filename1 filename2 在打开的多个文件中 :next 转到下个文件中 :prev 转到上个文件中 :last/:first 分别到最后一个和第一个文件 ...