分頁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眾分頁查詢的實現原理。現在要做的就是在第二層和最外層將數據庫記錄的最大值和最小值替換成我們需要的值。
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類,沒有進行特殊的整合,湊合着吧,原理就是這樣:
在分頁顯示時,每頁顯示數據量是固定的,假設每頁顯示10條數據,第1頁的編號就是1到10,當用戶單擊第二頁時顯示的數據編號為11--20,以此類推,限制最后一頁。
這樣我們可以總結出一個規律:
每頁顯示的第一條數據行號應該等於 【每頁顯示的數據量*(當前頁碼-1)+1】。-----可以看出上面的SQL的最外層 R>【每頁顯示的數據量*(當前頁碼-1)】,這樣行號才匹配。
每頁顯示的最后一條數據行號等於【每頁顯示的數據量*當前頁碼】。
經過分析,我們對上面的SQL進行修改,得到下面的代碼:
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.
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 <a href="pageTest.jsp?pageIndex=1">首頁</a> 47 <a href="pageTest.jsp?pageIndex=<%=pageIndex-1 %>">上一頁</a> 48 <a href="pageTest.jsp?pageIndex=<%=pageIndex+1 %>">下一頁</a> 49 <a href="pageTest.jsp?pageIndex=<%=totalpages%>">末頁</a> 50 <br/> 51 <p style="color:red"">當前頁數:<%=pageIndex%></p> 52 </body> 53 </html>
最后,我們在瀏覽器訪問這個JSP文件.
本文來源於:
http://blog.csdn.net/yulei_qq/article/details/16829695
