当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
计算机二级辅导:JDBC可滚动可更新感知更新结果集
发布时间:2010/3/13 9:18:26 来源:城市学习网 编辑:MOON
  JDBC的结果集有很多类型。这些结果集有不同的特性,以满足各种需要。这在高性能的JDBC数据操作中有着重要应用。下面是一个应用实例:
  package lavasoft.common;
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.Statement;
  /**
  * JDBC可滚动可更新感知更新结果集测试
  *
  */
  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对象最复杂的方法就是下面这个方法了:
  此方法来自于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高级特性的时候最好做个测试,以保证程序的可靠性。
  :
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved