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>

利用SQL语句实现分页的更多相关文章

  1. (转载)sql语句解决分页问题

    <来源网址:http://www.delphifans.com/infoview/Article_353.html>sql语句解决分页问题日期:2005年1月17日 作者:treemon2 ...

  2. 使用传入的总记录数实现一条sql语句完成分页查询

    使用传入的总记录数实现一条sql语句完成分页查询     问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...

  3. Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数

    Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ...

  4. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...

  5. 【转载】Sqlserver的SQL语句实现分页查询

    在应用程序的开发中,如果数据库中的数据量过于的庞大,则需要针对查询数据做分页处理,取出对应分页中的数据,在Sqlserver分页的语句写法中,有两种比较常用,一种是数据表中含有自增量Id的情况,可以根 ...

  6. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[name] f ...

  7. mysql详解常用命令操作,利用SQL语句创建数据表—增删改查

    关系型数据库的核心内容是 关系 即 二维表 MYSQL的启动和连接show variables; [所有的变量] 1服务端启动 查看服务状态 sudo /etc/init.d/mysql status ...

  8. 利用SQL语句产生分组序号

    partition  by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition  by用于给结果集分组,如果没 ...

  9. 利用sql语句进行增删改查

    1.查询 函数:raw(sql语句) 语法:Entry.objects.raw(sql) 返回:QuerySet 2.增删改 from django.db import connection def ...

随机推荐

  1. IOS_Note

    关键字:可以搜索这些关键字找到具体内容 退回输入键盘.CGRect.CGPoint & CGSize.设置透明度.设置背景色.自定义颜色. 竖屏.横屏.状态栏高  (显示时间和网络状态). 导 ...

  2. uva 10313 Pay the Price(完全背包)

    题目连接:10313 - Pay the Price 题目大意:有0~300这300种价值的金额. 现在可能给出参数: 1个:n, 输出可以组成价值n的方式的个数. 2个:n, a输出用个数小于a的价 ...

  3. Linux中处理需要传输的IP报文流程

    本文主要讲解了Linux中处理需要传输的IP报文流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linux中处理需要传输的IP报文流程进行了讲解,希望可以对 ...

  4. 用c#开发微信(10) JSSDK 基本用法 分享接口“发送到朋友”

    微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享. ...

  5. DelphiXE8怎么使用调试模式(朱建强)

    需求:在开发Android程序时,大家一直是使用ShowMessage.其实XE是支持下断点的. 操作: 1.小米手机用USB线,连到电脑上. 2.小米手机-设置-关于手机-"MIUI版本& ...

  6. 在windows下如何配置RTT开发环境?

    之前一直使用MDK查看和编译RTT的源码,这几天无聊想起RTT官方提供使用scons工具编译RTT,因此想试试这种方法,做下此笔记,以供入门者参考. 注 1 下载安装Python2.7 论坛中很多人说 ...

  7. Android——内存调试

    因调试某个重大问题,怀疑到了内存,专门写了个測试脚本.记录一下. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/37928823 一 ...

  8. swap函數 进阶探讨与实现

    相信以下這個C程序非常多人都見過啦.當時自己看 美少女战士谭浩强 写的那本书上的解释.反正我当时是没看太懂详细是什么意思.谱架啊~~~ #include <stdio.h> void sw ...

  9. Android SurfaceView实战 打造抽奖转盘

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...

  10. Eclipse用法和技巧十五:自动添加未实现方法1

    java代码中经常要实现一些接口,这个也是java代码独有的地方.实现接口,就意味着要实现这个接口中定义的方法,如果一个个去码出方法就需要记得方法名称等等,就算有内容辅助快捷键帮助,也是很麻烦的.这里 ...