基于_JDBC_2.0_驱动的分页代码实现

本文介绍了一种使用JDBC2.0滚动游标机制实现数据库分页的方法,该方法在MySQL、SQLServer、Access、Oracle等数据库下经过测试验证,相较于复合SQL语句查询分页方案,性能更优。文中提供了详细的JavaDoc解释和代码实现,包括如何使用ResultSet的absolute方法定位结果集中的特定行,以及如何计算总记录数和总页数。此外,还包含了一个简单的测试方法来验证分页功能。

这个分页代码基于 JDBC 2.0 的滚动游标的机制, 核心观念就是利用 ResultSet 类里面的 boolean absolute( int row ) throws SQLException 方法进行数据的跳转.

经过测试(数据小于1万条, SQL Server 2000), 这个方法比用复合 SQL 语句查询分页的方案要快很多.

详细 JavaDoc 如下:

Moves the cursor to the given row number in this ResultSet object.

If the row number is positive, the cursor moves to the given row number with respect to the beginning of the result set. The first row is row 1, the second is row 2, and so on.

If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method absolute(-2) moves the cursor to the next-to-last row, and so on.

An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first row or after the last row.

Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last().

Parameters:

row the number of the row to which the cursor should move. A positive number indicates the row number counting from the beginning of the result set; a negative number indicates the row number counting from the end of the result set

Returns:

true if the cursor is on the result set; false otherwise

Throws:

SQLException if a database access error occurs, or the result set type is TYPE_FORWARD_ONLY

@since

1.2

/*

* @(#)Pager.java 1.00 2004-8-12

*

* Copyright 2004 . All rights reserved.

* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

*/

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Vector;

/**

* Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.

* @author 刘长炯

* @version 1.0 2004-8-12

*/

public class Pager {

/** Used database connection */

Connection conn = null;

public Pager() {

}

/**

* 分页功能, 返回当页的数据(JDBC 2.0 实现).

* 

* @param currentPage

* 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)

* @param pageCount

* 每页显示记录数

* 

* @return a Vector - 数据列表

*/

public Vector pageData(int currentPage, int pageCount) {

Vector results = new Vector();

String tableName = "table_name";// 要处理的表格名

ResultSet rs = null;

String sql = "SELECT * FROM " + tableName;

Statement stmt = null;

try {

// TODO: open connection

// 生成可滚动的结果集表达式

stmt = conn.createStatement(ResultSet.

TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);

rs = stmt.executeQuery(sql);

int count = recordCount(); // 总记录数

int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数

if (currentPage <= 0) {

currentPage = 1;

}

// 超出页码范围, 不返回数据

if (currentPage > totalPage) {

currentPage = totalPage;

return results;

}

if ((currentPage - 1) * pageCount > 0) {

// 移动结果集数据到当前页

rs.absolute((currentPage - 1) * pageCount);

}

// rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor

// position (0) is invalid

int i = 0; // Readed pages

while (rs.next() && i < pageCount) {

i++;

// TODO: Read each row and process to value object

ValueObject bean = new ValueObject();

// TODO: Read value to value object

result.add(bean);

}

} catch (Exception exception) {

System.out.println("Occur a error in " + getClass()

+ ".pageData() : " + exception.getMessage());

// exception.printStackTrace();

} finally {

closeJDBCResource(stmt);

closeJDBCResource(rs);

closeJDBCResource(conn);

}

return results;

}

/**

* 返回当前数据库中记录的总数.

* 

* @return int 记录总数

*/

public int recordCount() {

int allCount = -1;

String tableName = "table_name";// 要处理的表格名

String sql = "SELECT COUNT(*) FROM " + tableName;

ResultSet rs = null;

Statement stmt = null;

try {

// TODO: open connection

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

if (rs.next()) {

allCount = rs.getInt(1);

}

} catch (Exception exception) {

System.out

.println("Occur a error in " + getClass()

+ ".recordCount() : " + exception.getMessage());

} finally {

closeJDBCResource(stmt);

closeJDBCResource(rs);

closeJDBCResource(conn);

}

return allCount;

}

/**

* Close a jdbc resource, such as ResultSet, Statement, Connection.... All

* these objects must have a method signature is void close().

* 

* @param resource -

* jdbc resouce to close

*/

public static void closeJDBCResource(Object resource) {

try {

Class clazz = resource.getClass();

java.lang.reflect.Method method = clazz.getMethod("close", null);

method.invoke(resource, null);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* Test page.

* @param args

*/

public static void main(String[] args) {

// 分页, 读取第一页数据, 共读取5个记录

Vector data = new Pager().pageData(1, 5);

// TODO: process value object, 更改类名

for(int i = 0; results != null && i < data.size(); i++) {

ValueObject bean = (ValueObject)data.get(i);

}

}

}


文章来源:http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值