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

 

JSP 分页显示数据 (Oracle)

标签: Oracle分页JSP分页
 分类:

要实现分页,首先咱们要作的就是如何来编写SQL语句,网上也有不少,你们能够搜一下.在这里,咱们使用一种比较经常使用的方式来编写SQL语句。代码以下:java

[sql]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  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;  

查询的结果以下:mysql


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

1)最内层的select 语句数据库

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

2)第二层的select 语句oracle

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

3)最外层的select 语句post

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

 

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

 

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

这样咱们能够总结出一个规律:

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

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

通过分析,咱们对上面的SQL进行修改,获得下面的代码:

[sql]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  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类,没有进行特殊的整合,凑合着吧,原理就是这样:

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


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

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


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

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