JDBC可滚动可更新感知更新结果集

JDBC可滚动可更新感知更新结果集


2009-12-08 21:33:33
 标签: JDBC ResultSet   [ 推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
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_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 以下 ResultSet 常量之一: ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE
resultSetHoldability - 以下 ResultSet 常量之一: ResultSet.HOLD_CURSORS_OVER_COMMITResultSet.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高级特性的时候最好做个测试,以保证程序的可靠性。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值