关键步骤如下。
- 正确编写分页查询 SQL 。
- 编写存储过程实现分页查询。
- 在程序中调用存储过程。
3.3.1 分页查询及其实现
1.生活中的分页
在进行网页浏览时,很多情况下都可以看到分页显示的应用,如网上购物时的商品
展示;查看电子邮箱时的电子邮件列表,如图 3.4 所示。
使用分页最大的优势在于。
- 数据清晰直观
- 页面不再冗长
- 不受数据量的限制
- 降低数据服务器查询压力
图 3.4 生活中的分页应用
2. 数据分页查询
分页如何实现呢?其实,在实际应用过程中,分页的实现分为两个部分,首先是数
据分页查询,其次才是数据分页显示。数据分页查询的实现步骤如下。
(1)确定每页显示的数据数量。
(2)确定需要显示的数据总数量。
示例 3
查询新闻信息系统中新闻的总记录数。
关键代码:
……
//编写查询新闻总数量的 SQL 语句
String sql = "select count(*) from news_detail";
//通过 JDBC 执行 SQL 语句
Object[] params={};
ResultSet rs= this.executeSQL(sql,params);
……
//获取总记录数
totalCount=rs.getInt();
……
(3)计算显示的页数。
示例 4
根据新闻信息系统新闻总记录数,计算所需的总页数。
关键代码:
……
//总页数
private int totalPageCount = 1;
//页面大小,即每页显示记录数
private int pageSize = 0;
//记录总数
private int recordCount =0;
……
//设置总页数
private void setTotallPageCountByRs(){
if(this.recordCount%this.pageSize==0)
this.totalPageCount=this.recordCount/this.pageSize;
else if(this.recordCount%this.pageSize>0)
this.totalPageCount=this.recordCount/this.pageSize+1;
else
this.totalPageCount=0;
}
……
了解具体实现请扫描二维码。
(4)编写分页查询 SQL 语句。
示例 5
编码实现新闻信息的分页查询。
关键代码:
……
List<news> newsList = new ArrayList<News>();
//编写分页查询 SQL 语句
String sql = "……";
Page page = new Page();
page.setCurrPageNo(pageNo); //设置当前页码
page.setPageSize(pageSize); //每页显示记录数
//执行分页查询
……
至此,分页查询的任务就基本完成。
3.分页查询小结
请注意实现分页查询过程中的如下几个关键点。
(1)计算总页数。
1)如果总记录数能够被每页显示记录数整除,那么:
总页数 = 总记录数/每页显示记录数
2)如果总记录数不能够被每页显示记录数整除,那么:
总页数 = 总记录数/每页显示记录数+1;
(2)计算分页查询时的起始记录数。
起始记录的下标 =(当前页码 - 1)*每页显示的记录数
3.3.2 使用存储过程封装分页查询
实现分页查询,有时可能会将数据分页查询的 SQL 语句编写成存储过程,这样就
需要在程序中对存储过程进行调用,这就涉及 CallableStatement 接口的使用。
1.CallableStatement 接口概述
CallableStatement 接口继承自 PreparedStatement 接口。使用 CallableStatement 接口
可以实现对存储过程的调用,而 CallableStatement 接口的常用方法如表 3-3 所示。
方法 | 返回类型 | 说明 |
---|---|---|
execute() | boolean | 执行SQL 语句,如果第一个结果是 ResultSet 对象,则返 回 true :如果第一个结果是更新计数或者没有结果,则返回 false |
registerOutParameter(int parameter Index,int sqlType) | void | 按参数的顺序位置 parameterIndex 将 OUT 参数注册为 JDBC类型 sqlType,sqlType 为 Type 类中常量 |
getType (Int parameterIndex) | Type | 根据参数的序号获取指定的 JDBC 参数的值 |
使用 CallableStatement 接口调用存储过程的语法如下。
{call<procedure-name[(<arg1>,<arg2>,…)]}
- procedure-name:存储过程名称。
- arg:参数,多个参数之间以逗号分隔。
2. CallableStatement 接口的应用
使用 CallableStatement 接口调用存储过程的步骤如下。
1)修改程序执行的 SQL 语句。
2)执行存储过程。
3)对参数的类型进行设置。