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());
    }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章