要實現分頁,首先咱們要作的就是如何來編寫SQL語句,網上也有不少,你們能夠搜一下.在這裏,咱們使用一種比較經常使用的方式來編寫SQL語句。代碼以下:java
- select * from (select rownum as r,t.* from
- (select emp.* from emp order by hiredate desc) t where rownum<=10)
- 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進行修改,獲得下面的代碼:
- 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(){
-
- 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).獲得下面的顯示效果:
當咱們單擊下一頁或上一頁的時候會顯示不一樣的數據: