转: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)
要实现分页,首先我们要做的就是如何来编写SQL语句,网上也有很多,大家可以搜一下.在这里,我们使用一种比较常用的方式来编写SQL语句.代码如下: ----分页显示 select * from (sel ...
- 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的显示,利用加班的今天偷点闲复制一下下,当自己的一些小资料吧,不会的时候,还可以来看看............稍微有点多,毕竟是从前后 ...
随机推荐
- STM8S awu及看门狗IWDG WWDG应用(转)
源:STM8S awu及看门狗IWDG WWDG应用 AWU的应用(用库函数完成的) //切记要开启中断 且在中断函数中 AWU_GetFlagStatus(); 来清除中断 void AWU_SET ...
- Android L(5.0)源码之开放的图形库接口——OpenGL ES
最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整
- UISegmentedControl——分段控件
分段控件,提供了一组按钮,但是只能激活一个.通过UIControlEventValueChanged事件实现与用户的交互,并通过selectedSegmentIndex判断当前选定的控件,通过titl ...
- (C#)利用Aspose.Cells组件导入导出excel文件
Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...
- MYsql数据库ERROR总结
描述:#Warning: Using a password on the command line interface can be insecure.#ERROR 1045 (28000): Acc ...
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- spark使用总结
背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...
- wukong搜索引擎源码解读
转自:https://ayende.com/blog/171745/code-reading-wukong-full-text-search-engine I like reading code, a ...
- Android应用性能优化方案
1.避免创建不必要的对象 2.如果方法用不到成员变量,可以把方法声明为静态(static),这样性能会提高百分之十五到百分之二十 3.避免使用get/set存取字段,可以把字段声明为public直接访 ...
- php 正则只保留 汉字 字母 数字
$str = "?><?>”\"<喂喂喂555?><|“:L}{P+_)In thsdff0?><M<>\"s ...