數據庫分頁Java實現


MySQL分頁

主要是MySQL數據庫內置LIMIT函數

注意添加mysql的JAR包mysql-connector-java-5.1.13-bin.jar

 select * from table LIMIT 5,10;  // 檢索記錄行 6-15

在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引。隨着數據量的增加,頁數會越來越多,查看后幾頁的SQL就可能類似:

select * from content order by id desc limit 10000, 10 

一言以蔽之,就是越往后分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。

此時,我們可以通過2種方式:

一,子查詢的分頁方式來提高分頁效率 

select * from 'content' where id <=  (select id from 'content' order by id desc LIMIT ".($page-1)*$pagesize.", 1) order by id desc LIMIT $pagesize;

為什么會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在數據文件上完成的,通常來說,索引文件要比數據文件小得多,所以操作起來也會更有效率。

 經過飄易的實測,使用子查詢的分頁方式的效率比純LIMIT提高了14-20倍!

二,JOIN分頁方式

select * from 'content' as t1 join (select id from 'content' order by id desc LIMIT ".($page-1)*$pagesize.", 1) as t2 where t1.id <= t2.id order by t1.id desc LIMIT $pagesize; 

 經過我的測試,join分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。

MySQL分頁Java實現

 

<%@ page language="java" import="java.util.*,java.sql.*"
    pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>MySQL分頁</title>
    </head>
    <body>
        <table>
            <tr>
                <td>用戶名</td>
                <td>所在城市</td>
                <td>職業</td>
            </tr>
            <%
                //加載驅動
                Class.forName("com.mysql.jdbc.Driver");
                //得到連接
                Connection ct = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/tour", "root", "root");
                Statement sm = ct.createStatement();

                //接收pageNow參數
                String s_pageNow = request.getParameter("pageNow");
                int pageNow = 1;
                if (s_pageNow != null) {
                    pageNow = Integer.parseInt(s_pageNow);
                }

                //查詢總頁數
                int pageCount = 0;//當前為第幾頁
                int pageSize = 3;//每頁顯示幾條記錄
                int rowCount = 0;//總共有多少條記錄

                ResultSet rs = sm.executeQuery("select count(*) from users");
                if (rs.next()) {
                    rowCount = rs.getInt(1);
                    if (rowCount % pageSize == 0) {
                        pageCount = rowCount / pageSize;
                    } else {
                        pageCount = rowCount / pageSize + 1;
                    }
                }
                rs = sm.executeQuery("select  *  from users   limit "+ ((pageNow - 1) * pageSize + 1) +","+pageNow* pageSize+"");
                while (rs.next()) {
                    out.println("<tr>");
                    out.println("<td>" + rs.getString(2) + "</td>");
                    out.println("<td>" + rs.getString(5) + "</td>");
                    out.println("<td>" + rs.getString(6) + "</td>");
                    out.println("</tr>");
                }
                out.println("<tr>");
                //打印總頁數
                for (int i = 1; i < pageCount; i++) {
                    out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i
                            + "頁" + "</a>");
                }
                out.println("</tr>");

                rs.close();
                sm.close();
                ct.close();
            %>

        </table>
    </body>
</html>

Oracle分頁

主要是3層的嵌套查詢

注意添加Oracle的JAR 包classes12.jar

 經典的SQL語句(用ROWNUM實現)

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal) a1 where rownum<=10) where rn >=6;

Oracle分頁java實現 

 

<%@ page language="java" import="java.util.*,java.sql.*"
    pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Oracle分頁</title>
    </head>

    <body>
        <table>
            <tr>
                <td>用戶名</td>
                <td>職業</td>
                <td>薪水</td>
            </tr>
            <%
                //加載驅動
                Class.forName("oracle.jdbc.driver.OracleDriver");
                //得到連接
                Connection ct = DriverManager.getConnection(
                        "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "SCOTT", "scott");
                Statement sm = ct.createStatement();

                //接收pageNow參數
                String s_pageNow = request.getParameter("pageNow");
                int pageNow = 1;
                if (s_pageNow != null) {
                    pageNow = Integer.parseInt(s_pageNow);
                }

                //查詢總頁數
                int pageCount = 0;//當前為第幾頁
                int pageSize = 3;//每頁顯示幾條記錄
                int rowCount = 0;//總共有多少條記錄

                ResultSet rs = sm.executeQuery("select count(*) from emp");
                if (rs.next()) {
                    rowCount = rs.getInt(1);
                    if (rowCount % pageSize == 0) {
                        pageCount = rowCount / pageSize;
                    } else {
                        pageCount = rowCount / pageSize + 1;
                    }
                }
                rs = sm.executeQuery("select * from (select a1.*,rownum rn from (select *  from emp ) a1 where rownum<="
                        + pageNow
                        * pageSize
                        + ") where rn >="
                        + ((pageNow - 1) * pageSize + 1) + "");
                while (rs.next()) {
                    out.println("<tr>");
                    out.println("<td>" + rs.getString(2) + "</td>");
                    out.println("<td>" + rs.getString(3) + "</td>");
                    out.println("<td>" + rs.getString(6) + "</td>");
                    out.println("</tr>");
                }
                out.println("<tr>");
                //打印總頁數
                for (int i = 1; i < pageCount; i++) {
                    out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i
                            + "頁" + "</a>");
                }
                out.println("</tr>");

                rs.close();
                sm.close();
                ct.close();
            %>

        </table>
    </body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM