JDBC可滚动可更新感知更新结果集
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
|
JDBC可滚动可更新感知更新结果集
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); } } }
控制台输出:
[行号: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
产生Statement对象最复杂的方法就是下面这个方法了:
二、详解构建Statement对象的方法参数
此方法来自于Connection接口:
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException
上面方法参数有三个,形成三组:
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高级特性的时候最好做个测试,以保证程序的可靠性。
本文出自 “熔 岩” 博客,转载请与作者联系! |