• 利用SQL语句实现分页


    1.概述

    在网页中如果显示的数据太多就会占据过多的页面,而且显示速度也会很慢。为了控制每次在页面上显示数据的数量,就可以利用分页来显示数据。

    2.技术要点

    在SQL Server中要实现SQL分页,需要使用子查询来获取上一页的数据进行对比,进而获取最新的数据。使用子查询获取分页数据的语法格式如下:

    "SELECT TOP [pageSize] * FROM [table] WHERE id NOT IN(
    
                         SELECT TOP [preNum] id FROM [table] ORDER BY ID DESC) ORDER BY ID DESC";

     

    a. pageSize:数据分页的分页大小。

    b. preNum:上一页数据查询的起始范围。

    c. table:数据表名称。

    例如要从数据库的第10条数据开始查询5条数据,编写的 SQL查询语句如下:

    "SELECT TOP 5 * FROM tb_SQLServerFenye WHERE id NOT IN(
    
                             SELECT TOP 10 id FROM tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";

     

    在JDBCDao数据库操作类的getPageArgs()方法中就使用getProducts()方法中就使用了该语法获取指定页码的分页数据,关键代码如下:

    // 定义查询数据库的SQL语句
    
    String sql = "SELECT TOP " + pageSize + " * FROM tb_SQLServerFenye" +
    
    " WHERE id NOT IN(SELECT TOP " + (page - 1) * pageSize + " id FROM" +
    
    " tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";
    
    stmt = conn.createStatement();
    
    rs = stmt.executeQuery(sql); // 执行SQL并获取查询结果集

    3.实现过程

    (1)创建操作数据库类UserDao。通过构造方法UserDao()加载数据库驱动,定义Connection()方法创建与数据库的连接,定义selectStatic()方法执行查询操作,定义closeConnection()方法关闭数据库。其关键代码如下:

    public class UserDao {
          String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_database04";     //url,数据库
          String username="sa";                                                     //用户名
          String password="";                                                       //密码
             private Connection con = null;
             private Statement stmt = null;
             private ResultSet rs = null;
             public UserDao() {                                                          //通过构造方法加载数据库驱动
            try {
                      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
                } catch (Exception ex) {
                   System.out.println("数据库加载失败");
                }    
             }
             public boolean Connection() {                                             //创建数据库连接
            try {
                     con = DriverManager.getConnection(url, username, password);
                } catch (SQLException e) {
                     System.out.println(e.getMessage());
                   System.out.println("creatConnectionError!");
                }
                return true;
             }
        
             public ResultSet selectStatic(String sql) throws SQLException {  //对数据库的查询操作
          ResultSet rs=null;
                if (con == null) {
                     Connection();
                }
               try {
                      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
                rs = stmt.executeQuery(sql);
         } catch (SQLException e) {
            e.printStackTrace();
         }
            return rs;
             }
             public void closeConnection() {                                         //关闭数据库的操作
            if (con != null && stmt != null && rs != null) {
                     try {
                           rs.close();
                              stmt.close();
                              con.close();
                  } catch (SQLException e) {
                           e.printStackTrace();
                              System.out.println("Failed to close connection!");
                  } finally {
                           con = null;
                     }
                }
             }
    }

    (2)创建index.jsp页面。首先通过JavaBean标签调用数据可靠操作类UserDao,并定义在分页输出数据中使用的参数;

    <%@page contentType="text/html" pageEncoding="GBK" import="java.sql.*,java.util.*,java.lang.*"%>
    <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao"></jsp:useBean>
    <%!
          int CountPage = 0;
          int CurrPage = 1;
          int PageSize = 5;
          int CountRow = 0; 
    %>

    然后,设置接收数据的参数,当第一次显示页面参数为空时,设为1。根据当前页面的参数获取到显示的数据集。代码如下:

    <%
          String StrPage = request.getParameter("Page");
          if (StrPage == null) {                                  //判断当页面的值为空时
                CurrPage = 1;                               //赋值为1
          } else {
                CurrPage = Integer.parseInt(StrPage);           //如果不为空则获取该值
          }
          String SQL = "Select * From tb_ClassList";          //定义查询语句
          ResultSet Rs = selectall.selectStatic(SQL);           //执行查询语句
          Rs.last();                                            //获取查询结果集
          int i = 0;                                             //定义数字变量
          CountRow = Rs.getRow();                          //获取查询结果集的行数
          CountPage = (CountRow / PageSize);                  //计算将数据分成几页
          if (CountRow % PageSize > 0)                    //判断如果页数大于0
                CountPage++;                               //则增加该值
          Integer n = (CurrPage - 1) * 5 + 1;                            //定义变量上一页的结束值
          SQL = "select top 5 * from tb_ClassList where CID>=" + "("
                                                            + "Select Max(CID) From (Select top " + n.toString()
                                                            + " * From tb_ClassList) as Class" + ")";
          Rs = selectall.selectStatic(SQL);                  //执行查询语句
          while (Rs.next()) {                              //循环输出查询结果
    %>
    <tr>
          <td nowrap><span class="style3"><%=Rs.getString("CID")%></span></td>
          <td nowrap><span class="style3"><%=Rs.getString("CName")%></span></td>
          <td nowrap><span class="style3"><%=Rs.getString("CStartDate")%></span></td>
    </tr>
    <%
          }
          selectall.closeConnection();                         //关闭数据库
    %>

    设置下一页、上一页和最后一页超级链接,链接到index.jsp页面,指定Page作为栏目标识,将页数作为参数值,代码如下:

    <tr>
          <td width="251">
                [<%=CurrPage%>/<%=CountPage%>] 每页5条 共<%=CountRow%>条记录<%=(CurrPage - 1) * 5 + 1%>
          </td>
          <td width="260"><div align="right">
    <% if (CurrPage > 1) {   %>
          <a href="index.jsp?Page=<%=CurrPage - 1%>">上一页</a>
    <% }    %>
    <% if (CurrPage < CountPage) { %>
          <a href="index.jsp?Page=<%=CurrPage + 1%>">下一页</a>
    <% }    %>
          <a href="index.jsp?Page=<%=CountPage%>">最后一页</a></div>
          </td>
    </tr>
  • 相关阅读:
    windows 7 wifi热点配置
    Java中的try catch finaly先后调用顺序
    redis php扩展
    mysql索引
    cmd操作数据库的常用命令
    php ajax解决跨越问题
    git常用命令
    php,redis分布式锁防并发
    php商城下单,可以购买多件商品,redis防高并发
    php商城秒杀,redis防高并发
  • 原文地址:https://www.cnblogs.com/zkn11199/p/5576536.html
Copyright © 2020-2023  润新知