JDBC的结果集有很多类型。这些结果集有不同的特性,以满足各种需要。这在高性能的JDBC数据操作中有着重要应用。下面是一个应用实例:
一、测试代码
package lavasoft.common;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC可滚动可更新感知更新结果集测试
*
* @author leizhimin 2009-12-8 20:09:03
*/
public class TestResultSet {
public static void main(String[] args) {
testScrollResultSet();
testUpdateResultSet();
}
/**
* 可更新结果集更新测试
*/
public static void testUpdateResultSet() {
Connection conn = DBToolkit.getConnection();
String sql = "SELECT * FROM book";
try {
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(sql);
System.out.println( "---------原结果集--------");
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "---------插入一条记录--------");
rs.first();
//将光标移动到插入行上
rs.moveToInsertRow();
//构建行数据
rs.updateString(2, "xxxx");
rs.updateString(3, "x");
//插入一行
rs.insertRow();
System.out.println( "-------------更新一条记录-------------");
rs.absolute(3);
//构建行数据
rs.updateString(2, "uuuu");
rs.updateString(3, "u");
rs.updateRow();
System.out.println( "---------插入更新后的结果集--------");
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBToolkit.closeConnection(conn);
}
}
/**
* 可滚动结果集滚动测试
*/
public static void testScrollResultSet() {
Connection conn = DBToolkit.getConnection();
String sql = "SELECT * FROM book";
try {
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------前滚操作-----");
//将光标移动到此 ResultSet 对象的上一行
rs.previous();
rs.previous();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------绝对定位-----");
//将光标移动到此 ResultSet 对象的给定行编号。
rs.absolute(3);
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------移动到第一行-----");
//将光标移动到此 ResultSet 对象的第一行。
if (rs.first()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------移动到最后一行-----");
//将光标移动到此 ResultSet 对象的第一行。
if (rs.last()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------移动到第一行之前-----");
//将光标移动到此 ResultSet 对象的开头,正好位于第一行之前
rs.beforeFirst();
rs.next();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------移动到最后一行之后-----");
//将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
rs.afterLast();
rs.previous();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------相对当前行做移动-----");
rs.relative(-2);
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBToolkit.closeConnection(conn);
}
}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC可滚动可更新感知更新结果集测试
*
* @author leizhimin 2009-12-8 20:09:03
*/
public class TestResultSet {
public static void main(String[] args) {
testScrollResultSet();
testUpdateResultSet();
}
/**
* 可更新结果集更新测试
*/
public static void testUpdateResultSet() {
Connection conn = DBToolkit.getConnection();
String sql = "SELECT * FROM book";
try {
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(sql);
System.out.println( "---------原结果集--------");
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "---------插入一条记录--------");
rs.first();
//将光标移动到插入行上
rs.moveToInsertRow();
//构建行数据
rs.updateString(2, "xxxx");
rs.updateString(3, "x");
//插入一行
rs.insertRow();
System.out.println( "-------------更新一条记录-------------");
rs.absolute(3);
//构建行数据
rs.updateString(2, "uuuu");
rs.updateString(3, "u");
rs.updateRow();
System.out.println( "---------插入更新后的结果集--------");
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBToolkit.closeConnection(conn);
}
}
/**
* 可滚动结果集滚动测试
*/
public static void testScrollResultSet() {
Connection conn = DBToolkit.getConnection();
String sql = "SELECT * FROM book";
try {
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------前滚操作-----");
//将光标移动到此 ResultSet 对象的上一行
rs.previous();
rs.previous();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------绝对定位-----");
//将光标移动到此 ResultSet 对象的给定行编号。
rs.absolute(3);
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------移动到第一行-----");
//将光标移动到此 ResultSet 对象的第一行。
if (rs.first()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------移动到最后一行-----");
//将光标移动到此 ResultSet 对象的第一行。
if (rs.last()) {
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
}
System.out.println( "------移动到第一行之前-----");
//将光标移动到此 ResultSet 对象的开头,正好位于第一行之前
rs.beforeFirst();
rs.next();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------移动到最后一行之后-----");
//将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
rs.afterLast();
rs.previous();
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
System.out.println( "------相对当前行做移动-----");
rs.relative(-2);
System.out.println( "[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBToolkit.closeConnection(conn);
}
}
}
控制台输出:
[行号:1] 1 aaa a
[行号:2] 2 bbb b
[行号:3] 3 ccc c
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
------前滚操作-----
[行号:7] 7 ggg g
------绝对定位-----
[行号:3] 3 ccc c
------移动到第一行-----
[行号:1] 1 aaa a
------移动到最后一行-----
[行号:8] 8 hhh h
------移动到第一行之前-----
[行号:1] 1 aaa a
------移动到最后一行之后-----
[行号:8] 8 hhh h
------相对当前行做移动-----
[行号:6] 6 fff f
---------原结果集--------
[行号:1] 1 aaa a
[行号:2] 2 bbb b
[行号:3] 3 ccc c
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
---------插入一条记录--------
-------------更新一条记录-------------
---------插入更新后的结果集--------
[行号:1] 1 aaa a
[行号:2] 2 bbb b
[行号:3] 3 uuuu u
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
[行号:9] 9 xxxx x
Process finished with exit code 0
[行号:2] 2 bbb b
[行号:3] 3 ccc c
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
------前滚操作-----
[行号:7] 7 ggg g
------绝对定位-----
[行号:3] 3 ccc c
------移动到第一行-----
[行号:1] 1 aaa a
------移动到最后一行-----
[行号:8] 8 hhh h
------移动到第一行之前-----
[行号:1] 1 aaa a
------移动到最后一行之后-----
[行号:8] 8 hhh h
------相对当前行做移动-----
[行号:6] 6 fff f
---------原结果集--------
[行号:1] 1 aaa a
[行号:2] 2 bbb b
[行号:3] 3 ccc c
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
---------插入一条记录--------
-------------更新一条记录-------------
---------插入更新后的结果集--------
[行号:1] 1 aaa a
[行号:2] 2 bbb b
[行号:3] 3 uuuu u
[行号:4] 4 ddd d
[行号:5] 5 eee e
[行号:6] 6 fff f
[行号:7] 7 ggg g
[行号:8] 8 hhh h
[行号:9] 9 xxxx x
Process finished with exit code 0
产生Statement对象最复杂的方法就是下面这个方法了:
二、详解构建Statement对象的方法参数
此方法来自于Connection接口:
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException
-
创建一个
Statement
对象,该对象将生成具有给定类型、并发性和可保存性的ResultSet
对象。此方法与上述createStatement
方法相同,但它允许重写默认结果集类型、并发性和可保存性。 -
- 参数:
-
resultSetType
- 以下ResultSet
常量之一:ResultSet.TYPE_FORWARD_ONLY
、ResultSet.TYPE_SCROLL_INSENSITIVE
或ResultSet.TYPE_SCROLL_SENSITIVE
-
resultSetConcurrency
- 以下ResultSet
常量之一:ResultSet.CONCUR_READ_ONLY
或ResultSet.CONCUR_UPDATABLE
-
resultSetHoldability
- 以下ResultSet
常量之一:ResultSet.HOLD_CURSORS_OVER_COMMIT
或ResultSet.CLOSE_CURSORS_AT_COMMIT
- 返回:
-
一个新的
Statement
对象,该对象将生成具有给定类型、并发性和可保存性的ResultSet
对象
上面方法参数有三个,形成三组:
1、结果集类型:设置是否滚动,以及设置滚动结果集是否感知数据的更新。
ResultSet.TYPE_FORWARD_ONLY:只能向前
ResultSet.TYPE_SCROLL_INSENSITIVE
:可滚动,不感知数据变化。
ResultSet.TYPE_SCROLL_SENSITIVE
可滚动,并感知数据变化。
2、并发性:设置是否允许更新。
ResultSet.CONCUR_READ_ONLY:只读
ResultSet.CONCUR_UPDATABLE
:可更新
3、可保存性:设置提交时候是否关闭结果集。
ResultSet.HOLD_CURSORS_OVER_COMMIT :在提交后结果集还可用
ResultSet.CLOSE_CURSORS_AT_COMMIT:在提交时候关闭结果集
由于这些特性比较高级,不同数据库驱动对此实现也不一样。因此在使用JDBC高级特性的时候最好做个测试,以保证程序的可靠性。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/240385,如需转载请自行联系原作者