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


创建一个 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高级特性的时候最好做个测试,以保证程序的可靠性。



本文出自 “熔 岩” 博客,转载请与作者联系!