基于_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

基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值