<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-2  評(píng)論-16  文章-12  trackbacks-0

    這篇文章并沒(méi)有給出如何使用ResultSet的具體例子,只是從ResultSet的功能性上進(jìn)行了詳細(xì)的講述。希望這篇文章對(duì)大家理解ResultSet能夠有所幫助。下面就是這篇文章的具體內(nèi)容。
            
    結(jié)果集(ResultSet)是數(shù)據(jù)中查詢結(jié)果返回的一種對(duì)象,可以說(shuō)結(jié)果集是一個(gè)存儲(chǔ)查詢結(jié)果的對(duì)象,但是結(jié)果集并不僅僅具有存儲(chǔ)的功能,他同時(shí)還具有操縱數(shù)據(jù)的功能,可能完成對(duì)數(shù)據(jù)的更新等。

     

            結(jié)果集讀取數(shù)據(jù)的方法主要是getXXX(),他的參數(shù)可以使整型表示第幾列(是從1開(kāi)始的),還可以是列名。返回的是對(duì)應(yīng)的XXX類型的值。如果對(duì)應(yīng)那列時(shí)空值,XXX是對(duì)象的話返回XXX型的空值,如果XXX是數(shù)字類型,如Float等則返回0boolean返回false。使用getString()可以返回所有的列的值,不過(guò)返回的都是字符串類型的。XXX可以代表的類型有:基本的數(shù)據(jù)類型如整型(int),布爾型(Boolean),浮點(diǎn)型(Float,Double)等,比特型(byte),還包括一些特殊的類型,如:日期類型(java.sql.Date),時(shí)間類型(java.sql.Time),時(shí)間戳類型(java.sql.Timestamp),大數(shù)型(BigDecimalBigInteger)等。還可以使用getArray(int colindex/String columnname),通過(guò)這個(gè)方法獲得當(dāng)前行中,colindex所在列的元素組成的對(duì)象的數(shù)組。使用getAsciiStream(
    int colindex/String colname)
    可以獲得該列對(duì)應(yīng)的當(dāng)前行的ascii流。也就是說(shuō)所有的getXXX方法都是對(duì)當(dāng)前行進(jìn)行操作。

     

        結(jié)果集從其使用的特點(diǎn)上可以分為四類,這四類的結(jié)果集的所具備的特點(diǎn)都是和Statement語(yǔ)句的創(chuàng)建有關(guān),因?yàn)榻Y(jié)果集是通過(guò)Statement語(yǔ)句執(zhí)行后產(chǎn)生的,所以可以說(shuō),結(jié)果集具備何種特點(diǎn),完全決定于Statement,當(dāng)然我是說(shuō)下面要將的四個(gè)特點(diǎn),在Statement創(chuàng)建時(shí)包括三種類型。首先是無(wú)參數(shù)類型的,他對(duì)應(yīng)的就是下面要介紹的基本的ResultSet對(duì)應(yīng)的Statement。下面的代碼中用到的Connection并沒(méi)有對(duì)其初始化,變量conn代表的就是Connection對(duì)應(yīng)的對(duì)象。SqlStr代表的是響應(yīng)的SQL語(yǔ)句。

     

    1    最基本的ResultSet
    之所以說(shuō)是最基本的ResultSet是因?yàn)椋@個(gè)ResultSet他起到的作用就是完成了查詢結(jié)果的存儲(chǔ)功能,而且只能讀去一次,不能夠來(lái)回的滾動(dòng)讀取。這種結(jié)果集的創(chuàng)建方式如下:

     

    Statement st = conn.CreateStatement()
    ResultSet rs = Statement.excuteQuery(sqlStr);

     

    由于這種結(jié)果集不支持,滾動(dòng)的讀去功能所以,如果獲得這樣一個(gè)結(jié)果集,只能使用它里面的next()方法,逐個(gè)的讀去數(shù)據(jù)。

     

    2    可滾動(dòng)的ResultSet類型。
    這個(gè)類型支持前后滾動(dòng)取得紀(jì)錄next()previous(),回到第一行first(),同時(shí)還支持要去的ResultSet中的第幾行absoluteint n),以及移動(dòng)到相對(duì)當(dāng)前行的第幾行relative(int n),要實(shí)現(xiàn)這樣的ResultSet在創(chuàng)建Statement時(shí)用如下的方法。

     

    Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
    ResultSet rs = st.executeQuery(sqlStr)

     

    其中兩個(gè)參數(shù)的意義是:
    resultSetType
    是設(shè)置ResultSet對(duì)象的類型可滾動(dòng),或者是不可滾動(dòng)。取值如下:
           ResultSet.TYPE_FORWARD_ONLY
    只能向前滾動(dòng)
           ResultSet.TYPE_SCROLL_INSENSITIVE
    Result.TYPE_SCROLL_SENSITIVE這兩個(gè)方法都能夠?qū)崿F(xiàn)任意的前后滾動(dòng),使用各種移動(dòng)的ResultSet指針的方法。二者的區(qū)別在于前者對(duì)于修改不敏感,而后者對(duì)于修改敏感。
    resultSetConcurency
    是設(shè)置ResultSet對(duì)象能夠修改的,取值如下:
           ResultSet.CONCUR_READ_ONLY
    設(shè)置為只讀類型的參數(shù)。
           ResultSet.CONCUR_UPDATABLE
    設(shè)置為可修改類型的參數(shù)。
    所以如果只是想要可以滾動(dòng)的類型的Result只要把Statement如下賦值就行了。

     

    Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,
                              ResultSet.CONCUR_READ_ONLY);
    ResultSet rs = st.excuteQuery(sqlStr)

     

    用這個(gè)Statement執(zhí)行的查詢語(yǔ)句得到的就是可滾動(dòng)的ResultSet

     

    3    可更新的ResultSet
    這樣的ResultSet對(duì)象可以完成對(duì)數(shù)據(jù)庫(kù)中表的修改,但是我知道ResultSet只是相當(dāng)于數(shù)據(jù)庫(kù)中表的視圖,所以并不時(shí)所有的ResultSet只要設(shè)置了可更新就能夠完成更新的,能夠完成更新的ResultSetSQL語(yǔ)句必須要具備如下的屬性:
        a
    、只引用了單個(gè)表。
        b
    、不含有join或者group by子句。
        c
    、那些列中要包含主關(guān)鍵字。
        
    具有上述條件的,可更新的ResultSet可以完成對(duì)數(shù)據(jù)的修改,可更新的結(jié)果集的創(chuàng)建方法是:

     


    Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)

     


    這樣的Statement的執(zhí)行結(jié)果得到的就是可更新的結(jié)果集。更新的方法是,把ResultSet的游標(biāo)移動(dòng)到你要更新的行,然后調(diào)用updateXXX(),這個(gè)方法XXX的含義和getXXX()是相同的。updateXXX()方法,有兩個(gè)參數(shù),第一個(gè)是要更新的列,可以是列名或者序號(hào)。第二個(gè)是要更新的數(shù)據(jù),這個(gè)數(shù)據(jù)類型要和XXX相同。每完成對(duì)一行的update要調(diào)用updateRow()完成對(duì)數(shù)據(jù)庫(kù)的寫入,而且是在ResultSet的游標(biāo)沒(méi)有離開(kāi)該修改行之前,否則修改將不會(huì)被提交。
        
    使用updateXXX方法還可以完成插入操作。但是首先要介紹兩個(gè)方法:
        moveToInsertRow()
    是把ResultSet移動(dòng)到插入行,這個(gè)插入行是表中特殊的一行,不需要指定具體那一行,只要調(diào)用這個(gè)方法系統(tǒng)會(huì)自動(dòng)移動(dòng)到那一行的。
        moveToCurrentRow()
    這是把ResultSet移動(dòng)到記憶中的某個(gè)行,通常當(dāng)前行。如果沒(méi)有使用insert操作,這個(gè)方法沒(méi)有什么效果,如果使用了insert操作,這個(gè)方法用于返回到insert操作之前的那一行,離開(kāi)插入行,當(dāng)然也可以通過(guò)next(),previous()等方法離開(kāi)插入行。
        
    要完成對(duì)數(shù)據(jù)庫(kù)的插入,首先調(diào)用moveToInsertRow()移動(dòng)到插入行,然后調(diào)用updateXXX的方法完成對(duì),各列數(shù)據(jù)的更新,完成更新后和更新操作一樣,要寫到數(shù)據(jù)庫(kù),不過(guò)這里使用的是insertRow(),也要保證在該方法執(zhí)行之前ResultSet沒(méi)有離開(kāi)插入列,否則插入不被執(zhí)行,并且對(duì)插入行的更新將丟失。

     

    4    可保持的ResultSet
    正常情況下如果使用Statement執(zhí)行完一個(gè)查詢,又去執(zhí)行另一個(gè)查詢時(shí)這時(shí)候第一個(gè)查詢的結(jié)果集就會(huì)被關(guān)閉,也就是說(shuō),所有的Statement的查詢對(duì)應(yīng)的結(jié)果集是一個(gè),如果調(diào)用Connectioncommit()方法也會(huì)關(guān)閉結(jié)果集。可保持性就是指當(dāng)ResultSet的結(jié)果被提交時(shí),是被關(guān)閉還是不被關(guān)閉。JDBC2.01.0提供的都是提交后ResultSet就會(huì)被關(guān)閉。不過(guò)在JDBC3.0中,我們可以設(shè)置ResultSet是否關(guān)閉。要完成這樣的ResultSet的對(duì)象的創(chuàng)建,要使用的Statement的創(chuàng)建要具有三個(gè)參數(shù),這個(gè)Statement的創(chuàng)建方式也就是,我所說(shuō)的Statement的第三種創(chuàng)建方式。如下:

     

    Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
    ResultSet rs = st.excuteQuery(sqlStr);

     

    前兩個(gè)參數(shù)和兩個(gè)參數(shù)的createStatement方法中的參數(shù)是完全相同的,這里只介紹第三個(gè)參數(shù):
           resultSetHoldability
    表示在結(jié)果集提交后結(jié)果集是否打開(kāi),取值有兩個(gè):
           ResultSet.HOLD_CURSORS_OVER_COMMIT:
    表示修改提交時(shí),不關(guān)閉數(shù)據(jù)庫(kù)。
         ResultSet.CLOSE_CURSORS_AT_COMMIT
    :表示修改提交時(shí)ResultSet關(guān)閉。

     

    不過(guò)這種功能只是在JDBC3.0的驅(qū)動(dòng)下才能成立。

    ResultSet 接口

    ResultSet 接口提供對(duì)數(shù)據(jù)表的訪問(wèn)。ResultSet 對(duì)象通常是通過(guò)執(zhí)行語(yǔ)句來(lái)生成的。

    ResultSet 始終有一個(gè)游標(biāo)指向其當(dāng)前數(shù)據(jù)行。最初,游標(biāo)定位在第一行的前面。next() 方法將游標(biāo)移至下一行。

    getXXX 方法會(huì)檢索當(dāng)前行的列值。可使用列的索引號(hào)或列的名稱來(lái)檢索這些值。通常,使用列索引將更為有效。列是從 1 開(kāi)始編號(hào)的。

    java.sql

    公共接口 ResultSet

    表 102 列示 ResultSet 接口中 DB2 Everyplace 支持的字段。

    102. ResultSet 接口字段

    字段類型

    字段

    static int

    CONCUR_READ_ONLY 該常量指示不能更新的 ResultSet 對(duì)象的并行性方式。 注意DB2 Everyplace 不支持 CONCUR_UPDATABLE。如果在創(chuàng)建語(yǔ)句對(duì)象時(shí)對(duì) ResultSet 對(duì)象的并行性方式指定 CONCUR_UPDATABLE,則 DB2 Everyplace JDBC 驅(qū)動(dòng)程序?qū)?duì)產(chǎn)生語(yǔ)句對(duì)象的連接對(duì)象發(fā)出 SQLWarning 并使用 CONCUR_READ_ONLY 代替。

    static int

    TYPE_FORWARD_ONLY 該常量指示其游標(biāo)只能向前移動(dòng)的 ResultSet 對(duì)象的類型。

    static int

    TYPE_SCROLL_INSENSITIVE 該常量指示可滾動(dòng)但通常對(duì)他人所作的更改不敏感的 ResultSet 對(duì)象的類型。注意:不要經(jīng)常使用此類型的 ResultSet 對(duì)象,原因是它可能會(huì)影響性能。此類型使用 SQL_INSENSITIVE 作為 CLI 語(yǔ)句屬性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有關(guān)詳細(xì)信息,參閱 CLI 函數(shù) SQLSetStmtAttr 的文檔。

    static int

    TYPE_SCROLL_SENSITIVE 該常量指示可滾動(dòng)且通常對(duì)他人所作的更改敏感的 ResultSet 對(duì)象的類型。注意:此類型使用 SQL_UNSPECIFIED 作為 CLI 語(yǔ)句屬性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有關(guān)詳細(xì)信息,參閱 CLI 函數(shù) SQLSetStmtAttr 的文檔。

    表 103 列示 ResultSet 接口中 DB2 Everyplace 支持的方法。

    103. ResultSet 接口方法

    方法返回值類型

    方法

    boolean

    absolute(int row) JDBC 2.0。將游標(biāo)移至結(jié)果集中的給定行號(hào)。

    void

    afterLast() JDBC 2.0。將游標(biāo)移至結(jié)果集的末尾,正好在最后一行的后面。

    void

    beforeFirst() JDBC 2.0。將游標(biāo)移至結(jié)果集的前方,正好在第一行的前面。

    void

    clearWarnings() 清除此 ResultSet 對(duì)象上報(bào)告的所有警告。

    void

    close() 立即釋放此 ResultSet 對(duì)象的數(shù)據(jù)庫(kù)和 JDBC 資源,而不是等待對(duì)象自動(dòng)關(guān)閉時(shí)才釋放它們。

    int

    findColumn(String columnName) 將給定 ResultSet 列名映射至其 ResultSet 列索引。

    boolean

    first() JDBC 2.0。將游標(biāo)移至結(jié)果集中的第一行。

    BigDecimal

    getBigDecimal(int columnIndex) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 對(duì)象形式獲取當(dāng)前行中某個(gè)列的值。Palm OS DB2 Everyplace JDBC 驅(qū)動(dòng)程序不支持此方法。

    BigDecimal

    getBigDecimal(int columnIndex, int scale) Java 編程語(yǔ)言中的 java.math.BigDecim

    BigDecimal

    getBigDecimal(int columnIndex, int scale) Java 編程語(yǔ)言中的 java.math.BigDecimal 對(duì)象形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。Palm OS DB2 Everyplace JDBC 驅(qū)動(dòng)程序不支持此方法。不受支持。

    BigDecimal

    getBigDecimal(String columnName) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 對(duì)象形式獲取當(dāng)前行中某個(gè)列的值。Palm OS DB2 Everyplace JDBC 驅(qū)動(dòng)程序不支持此方法。

    BigDecimal

    getBigDecimal(String columnName, int scale) Java 編程語(yǔ)言中的 java.math.BigDecimal 對(duì)象形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。Palm OS DB2 Everyplace JDBC 驅(qū)動(dòng)程序不支持此方法。不受支持。

    Blob

    getBlob(int columnIndex) JDBC 2.0。獲取此 ResultSet 對(duì)象的當(dāng)前行中的 BLOB 值。

    Blob

    getBlob(String columnName) JDBC 2.0。獲取此 ResultSet 對(duì)象的當(dāng)前行中的 BLOB 值。

    boolean

    getBoolean(int columnIndex) Java 布爾值形式獲取當(dāng)前行中某列的值。

    boolean

    getBoolean(String columnName) Java 布爾值形式獲取當(dāng)前行中某列的值。

    byte

    getByte(int columnIndex) Java 編程語(yǔ)言中的字節(jié)形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    byte

    getByte(String columnName) Java 編程語(yǔ)言中的字節(jié)形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    byte[]

    getBytes(int columnIndex) Java 編程語(yǔ)言中的字節(jié)數(shù)組形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    byte[]

    getBytes(String columnName) Java 編程語(yǔ)言中的字節(jié)數(shù)組形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    int

    getConcurrency() JDBC 2.0。返回結(jié)果集的并行性方式。

    Date

    getDate(int columnIndex) Java 編程語(yǔ)言中的 java.sql.Date 對(duì)象形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    Date

    getDate(int columnIndex, Calendar cal) Java 編程語(yǔ)言中的 java.sql.Date 對(duì)象形式返回此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    Date

    getDate(String columnName) Java 編程語(yǔ)言中的 java.sql.Date 對(duì)象形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    double

    getDouble(int columnIndex) Java 雙精度形式獲取當(dāng)前行中某列的值。

    double

    getDouble(String columnName) Java 雙精度形式獲取當(dāng)前行中某列的值。

    float

    getFloat(int columnIndex) Java 浮點(diǎn)形式獲取當(dāng)前行中某列的值。

    float

    getFloat(String columnName) Java 浮點(diǎn)形式獲取當(dāng)前行中某列的值。

    int

    getInt(int columnIndex) Java 編程語(yǔ)言中的整數(shù)形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    int

    getInt(String columnName) Java 編程語(yǔ)言中的整數(shù)形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    long

    getLong(int columnIndex) Java 長(zhǎng)整型形式獲取當(dāng)前行中某列的值。

    long

    getLong(String columnName) Java 長(zhǎng)整型形式獲取當(dāng)前行中某列的值。

    ResultSetMetaData

    getMetaData() 檢索此 ResultSet 對(duì)象的列的數(shù)目、類型和屬性。

    Object

    getObject(int columnIndex) Java 對(duì)象形式獲取當(dāng)前行中某列的值。

    Object

    getObject(String columnName) Java 對(duì)象形式獲取當(dāng)前行中某列的值。

    int

    getRow() JDBC 2.0。檢索當(dāng)前行號(hào)。

    short

    getShort

    short

    getShort(String columnName) Java 編程語(yǔ)言中的 short 形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    Statement

    getStatement() JDBC 2.0。返回產(chǎn)生此 ResultSet 對(duì)象的語(yǔ)句

    String

    getString(int columnIndex) Java 編程語(yǔ)言中的 String 形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    String

    getString(String columnName) Java 編程語(yǔ)言中的 String 形式獲取此 ResultSet 對(duì)象當(dāng)前行中指定列的值。

    Time

    getTime(int columnIndex) Java 編程語(yǔ)言中的 java.sql.Time 對(duì)象形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    Time

    getTime(String columnName) Java 編程語(yǔ)言中的 java.sql.Date 對(duì)象形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    Timestamp

    getTimestamp(String columnName) Java 編程語(yǔ)言中的 java.sql.Timestamp 對(duì)象形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    Timestamp

    getTimestamp(int columnIndex) Java 編程語(yǔ)言中的 java.sql.Timestamp 對(duì)象形式獲取此 ResultSet 對(duì)象的當(dāng)前行中指定列的值。

    int

    getType() JDBC 2.0。返回此結(jié)果集的類型。

    SQLWarning

    getWarnings() 返回此 ResultSet 上的調(diào)用報(bào)告的首次警告。

    boolean

    isAfterLast() JDBC 2.0。指示游標(biāo)是否在結(jié)果集中的最后一行后面。

    boolean

    isBeforeFirst() JDBC 2.0。指示游標(biāo)是否在結(jié)果集中的第一行前面。

    boolean

    isFirst() JDBC 2.0。指示游標(biāo)是否在結(jié)果集中的第一行上。

    boolean

    isLast() JDBC 2.0。指示游標(biāo)是否在結(jié)果集中的最后一行上。對(duì)于具有類型 TYPE_FORWARD_ONLY 的結(jié)果集,不支持此方法。

    boolean

    last() JDBC 2.0。將游標(biāo)移至結(jié)果集中的最后一行。

    boolean

    next() 將游標(biāo)從當(dāng)前位置向下移動(dòng)一行。

    boolean

    previous() JDBC 2.0。將游標(biāo)移至結(jié)果集中的前一行。

    boolean

    relative(int rows) JDBC 2.0。將游標(biāo)移動(dòng)相對(duì)行數(shù),正數(shù)或負(fù)數(shù)。

    boolean

    wasNull() 報(bào)告讀取的最后一列是否具有值 SQL NULL

     

     

    JDBC API 2.0/3.0ResultSet記錄集的
    JDBC API 2.0/3.0
    ResultSet記錄集的簡(jiǎn)便實(shí)用的新特性


    1
    新定義了若干個(gè)常數(shù)

    這些常數(shù)用于指定ResultSet 的類型游標(biāo)移動(dòng)的方向等性質(zhì),如下所示:
    public static final int FETCH_FORWARD;
    該常數(shù)的作用是指定處理記錄集中行的順序,是由前到后即從第一行開(kāi)始處理一直到最后一行;
    public static final int FETCH_REVERSE;
    該常數(shù)的作用是指定處理記錄集中行的順序,是由后到前即從最后一行開(kāi)始處理一直到第一行;
    public static final int FETCH_UNKNOWN;
    該常數(shù)的作用是不指定處理記錄集中行的順序,由JDBC 驅(qū)動(dòng)程序和數(shù)據(jù)庫(kù)系統(tǒng)決定;
    public static final int TYPE_FORWARD_ONLY;
    該常數(shù)的作用是指定數(shù)據(jù)庫(kù)游標(biāo)的移動(dòng)方向是向前,不允許向后移動(dòng)即只能使用ResultSet 接口的next()方法而不能使用previous()方法否則會(huì)產(chǎn)生錯(cuò)誤;
    public static final int TYPE_SCROLL_INSENSITIVE;
    該常數(shù)的作用是指定數(shù)據(jù)庫(kù)游標(biāo)可以在記錄集中前后移動(dòng),并且當(dāng)前數(shù)據(jù)庫(kù)用戶獲取的記錄集對(duì)其他用戶的操作不敏感;就是說(shuō),當(dāng)前用戶正在瀏覽記錄集中的數(shù)據(jù),與此同時(shí),其他用戶更新了數(shù)據(jù)庫(kù)中的數(shù)據(jù),但是當(dāng)前用戶所獲取的記錄集中的數(shù)據(jù)不會(huì)受到任何影響。
    public static final int TYPE_SCROLL_SENSITIVE;
    該常數(shù)的作用是指定數(shù)據(jù)庫(kù)游標(biāo)可以在記錄集中前后移動(dòng),并且當(dāng)前數(shù)據(jù)庫(kù)用戶獲取的記錄集對(duì)其他用戶的操作敏感,就是說(shuō),當(dāng)前用戶正在瀏覽記錄集,但是其它用戶的操作使數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生了變化,當(dāng)前用戶所獲取的記錄集中的數(shù)據(jù)也會(huì)同步發(fā)生變化,這樣有可能會(huì)導(dǎo)致非常嚴(yán)重的錯(cuò)誤產(chǎn)生建議慎重使用該常數(shù)。
    public static final int CONCUR_READ_ONLY;
    該常數(shù)的作用是指定當(dāng)前記錄集的協(xié)作方式(concurrencymode),為只讀;一旦使用了這個(gè)常數(shù),那么用戶就不可以更新記錄集中的數(shù)據(jù)。
    public static final int CONCUR_UPDATABLE;
    該常數(shù)的作用是指定當(dāng)前記錄集的協(xié)作方式(concurrencymode),為可以更新;一旦使用了這個(gè)常數(shù),那么用戶就可以使用updateXXX()等方法更新記。

    2 ResultSet
    接口提供了一整套的定位方法
    這些可以在記錄集中定位到任意一行:
    public boolean absolute(int row);
    該方法的作用是將記錄集中的某一行設(shè)定為當(dāng)前行,亦即將數(shù)據(jù)庫(kù)游標(biāo)移動(dòng)到指定的行,參數(shù)row 指定了目標(biāo)行的行號(hào),這是絕對(duì)的行號(hào),由記錄集的第一行開(kāi)始計(jì)算不是相對(duì)的行號(hào)。
    public boolean relative(int rows);
    該方法的作用也是將記錄集中的某一行設(shè)定為當(dāng)前行,但是它的參數(shù)rows 表示目標(biāo)行相對(duì)于當(dāng)前行的行號(hào)。
    public boolean first();
    該方法的作用是將當(dāng)前行定位到數(shù)據(jù)庫(kù)記錄集的第一行。
    public boolean last();
    該方法的作用剛好和first()方法相反。
    public boolean isFirst();
    public boolean isFirst(); 該方法的作用是檢查當(dāng)前行是否記錄集的第一行,如果是返回true 否則返回false
    public boolean isLast();
    該方法的作用是檢查當(dāng)前行是否記錄集的最后一行,如果是返回true ,否則返回false
    public void afterLast();
    該方法的作用是將數(shù)據(jù)庫(kù)游標(biāo)移到記錄集的最后,位于記錄集最后一行的后面,如果該記錄集不包含任何的行該方法不產(chǎn)生作用。
    public void beforeFirst();
    該方法的作用是將數(shù)據(jù)庫(kù)游標(biāo)移到記錄集的最前面,位于記錄集第一行的前面,如果記錄集不包含任何的行該方法不產(chǎn)生作用。
    public boolean isAfterLast();
    該方法檢查數(shù)據(jù)庫(kù)游標(biāo)是否處于記錄集的最后面,如果是返回true ,否則返回false
    public boolean isBeforeFirst();
    該方法檢查數(shù)據(jù)庫(kù)游標(biāo)是否處于記錄集的最前面,如果是返回true ,否則返回false
    public boolean next();
    該方法的作用是將數(shù)據(jù)庫(kù)游標(biāo)向前移動(dòng)一位,使得下一行成為當(dāng)前行,當(dāng)剛剛打開(kāi)記錄集對(duì)象時(shí),數(shù)據(jù)庫(kù)游標(biāo)的位置在記錄集的最前面,第一次使用next()方法將會(huì)使數(shù)據(jù)庫(kù)游標(biāo)定位到記錄集的第一行,第二次使用next()方法將會(huì)使數(shù)據(jù)庫(kù)游標(biāo)定位到記錄集的第二行,以此類推。
    public boolean previous();
    該方法的作用是將數(shù)據(jù)庫(kù)游標(biāo)向后移動(dòng)一位,使得上一行成為當(dāng)前行。

    3 ResultSet
    接口添加了對(duì)行操作的支持(最令人心動(dòng)之處)

    修改了的記錄集接口(ResultSet 接口)的方法,使它支持可以滾動(dòng)的記錄集,即數(shù)據(jù)庫(kù)游標(biāo)可以在返回的記錄集對(duì)象中自由地向前或向后滾動(dòng),或者定位到某個(gè)特殊的行。利用ResultSet 接口中定義的新方法,JSP/Servlet 程序員可以用Java 語(yǔ)言來(lái)更新記錄集,比如插入記錄,更新某行的數(shù)據(jù),而不是靠執(zhí)行SQL 語(yǔ)句,這樣就大大方便了程序員的開(kāi)發(fā)工作,享受Java 編程的樂(lè)趣了。
    ResultSet
    接口中新添加的部分方法如下所示:
    public boolean rowDeleted();
    如果當(dāng)前記錄集的某行被刪除了,那么記錄集中將會(huì)留出一個(gè)空位;調(diào)用rowDeleted()方法,如果探測(cè)到空位的存在,那么就返回true 如果沒(méi)有探測(cè)到空位的存在,就返回false 值。
    public boolean rowInserted();
    如果當(dāng)前記錄集中插入了一個(gè)新行,該方法將返回true ,否則返回false
    public boolean rowUpdated();
    如果當(dāng)前記錄集的當(dāng)前行的數(shù)據(jù)被更新,該方法返回true ,否則返回false
    public void insertRow();
    該方法將執(zhí)行插入一個(gè)新行到當(dāng)前記錄集的操作。
    public void updateRow();
    該方法將更新當(dāng)前記錄集當(dāng)前行的數(shù)據(jù)。
    public void deleteRow();
    該方法將刪除當(dāng)前記錄集的當(dāng)前行。
    public void updateString(int columnIndex String x);
    該方法更新當(dāng)前記錄集當(dāng)前行某列的值,該列的數(shù)據(jù)類型是String(Java 數(shù)據(jù)類型是String ,與之對(duì)應(yīng)的JDBC 數(shù)據(jù)類型是VARCHAR NVARCHAR 等數(shù)據(jù)類型) 。該方法的參數(shù)columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此類推,第二個(gè)參數(shù)x 代表新的值,這個(gè)方法并不執(zhí)行數(shù)據(jù)庫(kù)操作,需要執(zhí)行insertRow()方法或者updateRow()方法以后,記錄集和數(shù)據(jù)庫(kù)中的數(shù)據(jù)才能夠真正更新。
    public void updateString(String columnName String x);
    該方法和上面介紹的同名方法差不多,不過(guò)該方法的第一個(gè)參數(shù)是columnName ,代表需要更新的列的列名,而不是columnIndex

    往數(shù)據(jù)庫(kù)當(dāng)前記錄集插入新行的操作流程如下:
    1
    調(diào)用moveToInsertRow()方法;
    2
    調(diào)用updateXXX()方法指定插入行各列的值;
    3
    調(diào)用insertRow()方法往數(shù)據(jù)庫(kù)中插入新的行。

    更新數(shù)據(jù)庫(kù)中某個(gè)記錄的值(某行的值)的方法是:
    1
    定位到需要修改的行(使用absolute() relative()等方法定位)
    2
    使用相應(yīng)updateXXX()方法設(shè)定某行某列的新值;XXX 所代表的Java 數(shù)據(jù)類型,必須可以映射為某列的JDBC 數(shù)據(jù)類型,如果希望rollback 該項(xiàng)操作,請(qǐng)?jiān)谡{(diào)用updateRow()方法以前,使用cancelRowUpdates()方法,這個(gè)方法可以將某行某列的值復(fù)原;
    3
    使用updateRow()方法完成UPDATE 的操作。

    刪除記錄集中某行(亦即刪除某個(gè)記錄)的方法:
    1
    定位到需要修改的行(使用absolute() relative()等方法定位)
    2
    使用deleteRow()

    刪除記錄集中某行(亦即刪除某個(gè)記錄)的方法:
    1
    定位到需要修改的行(使用absolute() relative()等方法定位)
    2
    使用deleteRow()方法。

    JDBC API 3.0
    中還在ResultSet 接口中添加了updateArray() updateBlob() updateClob() updateRef()等方法

     

    1java數(shù)據(jù)庫(kù)操作基本流程

      2、幾個(gè)常用的重要技巧:

      可滾動(dòng)、更新的記錄集

      批量更新

      事務(wù)處理

      java數(shù)據(jù)庫(kù)操作基本流程:取得數(shù)據(jù)庫(kù)連接 - 執(zhí)行sql語(yǔ)句 - 處理執(zhí)行結(jié)果 - 釋放數(shù)據(jù)庫(kù)連接


      1、取得數(shù)據(jù)庫(kù)連接

      1)用DriverManager取數(shù)據(jù)庫(kù)連接

      例子:

    String className,url,uid,pwd;
    className = "oracle.jdbc.driver.OracleDriver";
    url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
    uid = "system";
    pwd = "manager";
    Class.forName(className);
    Connection cn = DriverManager.getConnection(url,uid,pwd);


      2)用jndi(java的命名和目錄服務(wù))方式

      例子

    String jndi = "jdbc/db";
    Context ctx = (Context) new InitialContext().lookup("java:comp/env");
    DataSource ds = (DataSource) ctx.lookup(jndi);
    Connection cn = ds.getConnection();


      多用于jsp

      2、執(zhí)行sql語(yǔ)句

      1)用Statement來(lái)執(zhí)行sql語(yǔ)句

    String sql;
    Statement sm = cn.createStatement();
    sm.executeQuery(sql); //
    執(zhí)行數(shù)據(jù)查詢語(yǔ)句(select
    sm.executeUpdate(sql); //
    執(zhí)行數(shù)據(jù)更新語(yǔ)句(deleteupdateinsertdrop等)statement.close();


      2)用PreparedStatement來(lái)執(zhí)行sql語(yǔ)句

    String sql;
    sql = "insert into user (id,name) values (?,?)";
    PreparedStatement ps = cn.prepareStatement(sql);
    ps.setInt(1,xxx);
    ps.setString(2,xxx);
    ...
    ResultSet rs = ps.executeQuery(); //
    查詢
    int c = ps.executeUpdate(); //
    更新


      3、處理執(zhí)行結(jié)果

      查詢語(yǔ)句,返回記錄集ResultSet

      更新語(yǔ)句,返回?cái)?shù)字,表示該更新影響的記錄數(shù)。

      ResultSet的方法:

      1next(),將游標(biāo)往后移動(dòng)一行,如果成功返回true;否則返回false

      2getInt("id")getSting("name"),返回當(dāng)前游標(biāo)下某個(gè)字段的值。

      3、釋放連接。

    cn.close();


      一般,先關(guān)閉ResultSet,然后關(guān)閉Statement(或者PreparedStatement);最后關(guān)閉Connection

      可滾動(dòng)、更新的記錄集


      1、創(chuàng)建可滾動(dòng)、更新的Statement

    Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);


      該Statement取得的ResultSet就是可滾動(dòng)的

      2、創(chuàng)建PreparedStatement時(shí)指定參數(shù)

    PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

    ResultSet.absolute(9000);


      批量更新

      1Statement

    Statement sm = cn.createStatement();
    sm.addBatch(sql1);
    sm.addBatch(sql2);
    ...
    sm.executeBatch()


      一個(gè)Statement對(duì)象,可以執(zhí)行多個(gè)sql語(yǔ)句以后,批量更新。這多個(gè)語(yǔ)句可以是deleteupdateinsert等或兼有

      2PreparedStatement

    PreparedStatement ps = cn.preparedStatement(sql);
    {
     ps.setXXX(1,xxx);
     ...
     ps.addBatch();
    }
    ps.executeBatch();


      一個(gè)PreparedStatement,可以把一個(gè)sql語(yǔ)句,變換參數(shù)多次執(zhí)行,一次更新。

      事務(wù)的處理

      1、關(guān)閉Connection的自動(dòng)提交

    cn.setAutoCommit(false);


      2、執(zhí)行一系列sql語(yǔ)句

      要點(diǎn):執(zhí)行每一個(gè)新的sql語(yǔ)句前,上一次執(zhí)行sql語(yǔ)句的Statement(或者PreparedStatemet)必須先close

    Statement sm ;
    sm = cn.createStatement(insert into user...);
    sm.executeUpdate();
    sm.close();

    sm = cn.createStatement("insert into corp...);
    sm.executeUpdate();
    sm.close();


      3、提交

    cn.commit();


      4、如果發(fā)生異常,那么回滾

    cn.rollback();

    posted on 2006-03-07 09:15 fadesea 閱讀(18654) 評(píng)論(5)  編輯  收藏

    評(píng)論:
    # re: ResultSet 簡(jiǎn)單介紹 2007-09-01 23:18 | lisa
    寫的很詳細(xì)啊,謝謝啊,我剛好找這方面的資料。  回復(fù)  更多評(píng)論
      
    # re: ResultSet 簡(jiǎn)單介紹 2011-06-01 22:08 | lv
    # re: ResultSet 簡(jiǎn)單介紹 2012-08-22 22:54 | IT愛(ài)好者
    干得不錯(cuò)啊!  回復(fù)  更多評(píng)論
      
    # re: ResultSet 簡(jiǎn)單介紹 2012-12-07 14:18 | Jackie
    非常感謝你!謝謝  回復(fù)  更多評(píng)論
      
    # re: ResultSet 簡(jiǎn)單介紹[未登錄](méi) 2013-06-14 09:26 | Andy
    Thank you for your contribution  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 卡1卡2卡3卡4卡5免费视频| 亚洲一区二区三区免费| 亚洲一区二区三区精品视频| 免费不卡在线观看AV| 亚洲小说区图片区另类春色| 国产精品综合专区中文字幕免费播放 | 亚洲色大成网站www尤物| 久久久久久久91精品免费观看| 亚洲精品在线播放| 亚洲一区免费视频| 毛片基地免费视频a| 亚洲a∨国产av综合av下载| 日本特黄特色aa大片免费| 亚洲精品日韩一区二区小说| 韩国欧洲一级毛片免费| 免费亚洲视频在线观看| 国产亚洲精品影视在线产品| 免费黄网站在线看| 亚洲一线产区二线产区精华| 成人看的午夜免费毛片| 男人j进女人p免费视频| 久久亚洲精品成人| 成人免费男女视频网站慢动作| 边摸边吃奶边做爽免费视频网站| 国产亚洲精品看片在线观看| 亚洲国产精品免费在线观看| 亚洲日韩国产一区二区三区在线 | 亚洲黄色免费电影| 亚洲av日韩av永久在线观看| 最新精品亚洲成a人在线观看| 99久久人妻精品免费二区| 亚洲精品无码久久久久秋霞| 亚洲综合日韩久久成人AV| 亚洲精品国产免费| 美女尿口扒开图片免费| 午夜亚洲AV日韩AV无码大全| 在线观看免费污视频| 99久久免费国产精品热| 亚洲AV成人影视在线观看| 亚洲一区二区三区无码中文字幕| 99久久99这里只有免费费精品|