JDBC数据集(RowSet)--- JdbcRowSet

转载地址:http://hi.baidu.com/wtx521/item/62f5c8460fc7803bfa8960af


JdbcRowSet对象实际上是一个加强版的ResultSet对象。就像ResultSet对象一样,它维持一个到数据源的连接。最大的不同在于它有一系列的属性设置和一套事件监听机制。JdbcRowSet的最大用途是它使一个原本不支持数据库游标滚动或更新操作的ResultSet具备这些能力。下面介绍如何使用JdbcRowSet对象。

创建JdbcRowSet对象
       你可以通过两种方法创建JdbcRowSet对象:
          1)使用带有ResultSet对象的JdbcRowSet对象的构造函数。
          2)使用不带参数的JdbcRowSet对象的构造函数。
       下面将详细介绍如何通过以上两种方式创建JdbcRowSet对象。
       1. 通过给构造函数传递ResultSet对象
          构造JdbcRowSet对象最简单的方法是将一个ResultSet对象传递给JdbcRowSetImpl对象的构造函数,这样做不仅仅创建了一个JdbcRowSet对象,而且还将ResultSet对象的数据导入到此创建的JdbcRowSet对象之中。如下所示:(在下面的代码中变量con是一个Connection对象的实例)
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery("select * from COFFES");
          JdbcRowSet jdbcRs = new JdbcRowSetImpl(rs);
    注意,当在调用createStatement时没有传递任何参数时,对于由此Statement创建的ResultSet对象将不具有滚动或更新功能,只能将数据库的游标向前移动而且不能改变其中的数据。然而,你可以将此rs用jdbcRs修饰,通过修饰的rs将具备以上功能。实际上,当使用此方法构造JdbcRowSet对象时,其构造函数完成了如下属性的设置:
       1)type --- ResultSet.TYPE_SCROLLL_INSENSITIVE(使数据集的数据游标可以滚动)
       2)concurrency --- ResultSet.CONCUR_UPDATABLE(使数据集中的数据可以更新)
       3)escapeProcessing --- true (使Jdbc驱动处理转义符)(the driver will do escape processing)
       4) maxRows --- 0 (对数据集的行数没有限制)(no limit on the number of rows)
       5)maxFieldSize—0 (对列数据的大小没有限制)(no limit on the number of bytes for a column value;
            applies only to columns that store BINARY, VARBINARY, LONGVARBINARY,
            CHAR, VARCHAR, and LONGVARCHAR values)
       6)queryTimeout—0 (对执行查询的时间没有限制)(has no time limit for how long it takes to execute a query)
     7)showDeleted—false (删除的行不可见)(deleted rows are not visible)
       8)transactionIsolation—Connection.TRANSACTION_READ_COMMITTED (只从提交的数据集中读取数据)(reads only data that has been committed)
       9)typeMap—null (the type map associated with a Connection object used by this RowSet object is null)
    
    2. 使用缺省的构造函数
       可以使用如下方式创建一个JdbcRowSet对象:
          JdbcRowSet jdbcRs2 = new JdbcRowSetImpl();
       为了使jdbcRs2拥有数据,你需要一个携带着目标数据的ResultSet。这意味着你将建立一个Jdbc连接,然后在此连接上执行SQL查询,这些都要求你在此jdbcRs2上合理的设置一些属性以获得连接。为了获得所需数据,你需要设置如下属性:
       username --- 数据库用户名
       password --- 数据库密码
       url --- JDBC 连接串
       datasourceName --- 在JNDI服务中注册的DataSource对象的名称。
       注意:如果没有使用DataSource对象获取数据源,将不用设置datasourceName属性,只需要设置url属性。
       例子:
             jdbcRs2.setUsername("yaohai2000");
             jdbcRs2.setPassword("secret");
             jdbcRs2.setUrl("jdbc:mySubprotocol:mySubname");
       你需要设置另外一个重要的属性 command 。这个属性用于执行查询并决定将什么数据装入JdbcRowSet对象之中。例如:
             jdbcRs2.setCommand("select * from COFFEES");
       一旦你设置好了command属性和用于建立数据库连接的属性,你可以执行下面这个简单的语句将数据库的数据注入到jdbcRs2中:
             jdbcRs2.execute();
       execute方法将执行许多事情:
             1. 使用url、username和password属性和数据库建立连接
             2. 执行command属性设置的命令
             3. 从一个ResultSet中读出数据将其注入到jdbcRs2中。
       在设置command属性时,可以使用SQL的where命令来设置条件以获得所需要的数据,可以按照像"select * from COFFEES where PRICE < 7.99"的语句设置command属性,另外也可以使用"select * from COFFEES where PRICE < ?"的语句设置command属性。其中"?"为占位符,如果使用此方法获取数据,还要在jdbcRs2上设置关于占位符的信息,设置占位符的方法需要两个参数,第一个为此占位符在语句中的位置(从 1 起),第二个为此占位符的值。例如:jdbcRs2.setBigDecimal(1,new BigDecimal("7.99")。
        
浏览JdbcRowSet对象
    1. 逐条浏览JdbcRowSet对象中的数据
       while(jdbcRs.next()){
          String name = jdbcRs.getString("COF_NAME");
          BigDecimal price = jdbcRs.getBigDecimal("PRICE");
          System.out.println(name + "    " + price);
       }
    2. 获得任意游标位置的数据
       jdbcRs.absolute(4);
       jdbcRs.previous();
       previous方法和next方法类似,只不过是将游标向前移动一个位置,而next是将游标向后移动一个位置。
    3. 将游标置于数据集最后       
        jdbcRs.afterLast();
    4. 将游标置于数据集起始位置
       jdbcRs.beforefirst();
更新某列的数据
    如果想要更新数据集中第三条记录内容,可以执行:
       jdbcRs.absolute(3);
       jdbcRs.updateBigDecimal("PRICE",new BigDecimal("10.99"));//更新PRICE列的数值
       jdbcRs.updateRow();
插入新数据
    jdbcRs.moveToInsertRow();
    jdbcRs.updateString("COF_NAME", "House_Blend");
    jdbcRs.updateInt("SUP_ID", 49);
    jdbcRs.updateBigDecimal("PRICE", new BigDecimal("7.99"));
    jdbcRs.updateInt("SALES", 0);
    jdbcRs.updateInt("TOTAL", 0);
    jdbcRs.insertRow();
    jdbcRs.moveToCurrentRow();

    jdbcRs.moveToInsertRow();
    jdbcRs.updateString("COF_NAME", "House_Blend_Decaf");
    jdbcRs.updateInt("SUP_ID", 49);
    jdbcRs.updateBigDecimal("PRICE", new BigDecimal("8.99"));
    jdbcRs.updateInt("SALES", 0);
    jdbcRs.updateInt("TOTAL", 0);
    jdbcRs.insertRow();
    jdbcRs.moveToCurrentRow();
    当你执行inserRow()方法后,新的行会插入到jdbcRs中,同时也写到后台的数据库之中。
删除一条数据
    首先移动游标到所要删除的行,然后执行删除方法
    jdbcRs.last();
    jdbcRs.deleteRow();

完整实例
import java.sql.*;
import javax.sql.rowset.*;
import com.sun.rowset.*;
import java.math.BigDecimal;

public class JdbcRowSetSample {
public static void main(String args[]) {
    String strUrl = "jdbc:datadirect:oracle://129.158.229.21:1521;SID=ORCL9";
    String strUserId = "scott";
    tring strPassword = "tiger";
    String className = "com.ddtek.jdbc.oracle.OracleDriver";
    JdbcRowSet jdbcRs;
    ResultSet rs;
    Statement stmt;
    Connection con;
    BigDecimal b;
    try {
        Class.forName(className);
    } catch(java.lang.ClassNotFoundException e) {
        System.err.print("ClassNotFoundException: ");
        System.err.println(e.getMessage());
    }
    try {
        con = DriverManager.getConnection(strUrl, strUserId, strPassword);
        con.setAutoCommit(false);
        stmt = con.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        stmt.addBatch("drop table COFFEES");
        stmt.addBatch("create table COFFEES(COF_ID INTEGER, " +
            "COF_NAME VARCHAR(20), SUP_ID INTEGER, " +
            "PRICE DECIMAL(6,2))");
        b = new BigDecimal("7.99");
        stmt.addBatch("insert into COFFEES values " +
            "(1250, ’Colombian’, 101, "+b+")");
        b = new BigDecimal("8.99");
        stmt.addBatch("insert into COFFEES values " +
            "(1300, ’French_Roast’, 49, "+b+")");
        b = new BigDecimal("9.99");
        stmt.addBatch("insert into COFFEES values " +
            "(1800, ’Espresso’, 150, "+b+")");
        b = new BigDecimal("8.99");
        stmt.addBatch("insert into COFFEES values " +
            "(2250, ’Colombian_Decaf’, 101, "+b+")");
        stmt.executeBatch();
        rs = stmt.executeQuery("select * from COFFEES");
        jdbcRs = new JdbcRowSetImpl(rs);
        jdbcRs.absolute(3);
        jdbcRs.updateBigDecimal("PRICE", new BigDecimal("9.99"));
        jdbcRs.updateRow();
        jdbcRs.first();
        jdbcRs.moveToInsertRow();
        jdbcRs.updateString("COF_NAME", "House_Blend");
        jdbcRs.updateInt("SUP_ID", 49);
        jdbcRs.updateBigDecimal("PRICE", new BigDecimal("7.99"));
        jdbcRs.insertRow();
        jdbcRs.moveToCurrentRow();
        jdbcRs.moveToInsertRow();
        jdbcRs.updateString("COF_NAME", "House_Blend_Decaf");
        jdbcRs.updateInt("SUP_ID", 49);
        jdbcRs.updateBigDecimal("PRICE", new BigDecimal("8.99"));
        jdbcRs.insertRow();
        jdbcRs.moveToCurrentRow();
        jdbcRs.last();
        jdbcRs.deleteRow();
        con.close();
        jdbcRs.close();
    } catch(SQLException sqle) {
        System.out.println("SQL Exception encountered: " + sqle.getMessage());
    }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值