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_ONLYResultSet.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,如需转载请自行联系原作者
相关文章
|
Java 大数据 数据库连接
【大数据系列之JDBC】(八):使用PreparedStatement获取结果集对象
【大数据系列之JDBC】(八):使用PreparedStatement获取结果集对象
285 0
|
SQL 存储 Java
JDBC之通过ResultSet对象对结果集进行处理
JDBC之通过ResultSet对象对结果集进行处理
|
Java 数据库连接
(反射+内省机制的运用)处理jdbc的结果集
(反射+内省机制的运用)处理jdbc的结果集
82 0
|
Java 数据库连接 数据库
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
274 0
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
|
Java 数据库连接 数据库
JDBC判断数据库查询结果集是否为空
通常来说都是用rs.next()来判断结果集是否为空,但是由于执行rs.next()后指针指向的是结果集中的第一条记录,此时再用while(rs.next())取结果集中的数据就会导致第一条数据无法得到。
1409 0
|
4月前
|
SQL Java 关系型数据库
MySQL之JDBC(二)
MySQL之JDBC(二)
34 0
|
4月前
|
关系型数据库 MySQL Java
MySQL之JDBC(一)
MySQL之JDBC
35 0
|
27天前
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
36 0
|
6天前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据