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

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

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

    隨筆-2  評論-16  文章-12  trackbacks-0

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

     

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

     

        結果集從其使用的特點上可以分為四類,這四類的結果集的所具備的特點都是和Statement語句的創建有關,因為結果集是通過Statement語句執行后產生的,所以可以說,結果集具備何種特點,完全決定于Statement,當然我是說下面要將的四個特點,在Statement創建時包括三種類型。首先是無參數類型的,他對應的就是下面要介紹的基本的ResultSet對應的Statement。下面的代碼中用到的Connection并沒有對其初始化,變量conn代表的就是Connection對應的對象。SqlStr代表的是響應的SQL語句。

     

    1    最基本的ResultSet
    之所以說是最基本的ResultSet是因為,這個ResultSet他起到的作用就是完成了查詢結果的存儲功能,而且只能讀去一次,不能夠來回的滾動讀取。這種結果集的創建方式如下:

     

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

     

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

     

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

     

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

     

    其中兩個參數的意義是:
    resultSetType
    是設置ResultSet對象的類型可滾動,或者是不可滾動。取值如下:
           ResultSet.TYPE_FORWARD_ONLY
    只能向前滾動
           ResultSet.TYPE_SCROLL_INSENSITIVE
    Result.TYPE_SCROLL_SENSITIVE這兩個方法都能夠實現任意的前后滾動,使用各種移動的ResultSet指針的方法。二者的區別在于前者對于修改不敏感,而后者對于修改敏感。
    resultSetConcurency
    是設置ResultSet對象能夠修改的,取值如下:
           ResultSet.CONCUR_READ_ONLY
    設置為只讀類型的參數。
           ResultSet.CONCUR_UPDATABLE
    設置為可修改類型的參數。
    所以如果只是想要可以滾動的類型的Result只要把Statement如下賦值就行了。

     

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

     

    用這個Statement執行的查詢語句得到的就是可滾動的ResultSet

     

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

     


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

     


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

     

    4    可保持的ResultSet
    正常情況下如果使用Statement執行完一個查詢,又去執行另一個查詢時這時候第一個查詢的結果集就會被關閉,也就是說,所有的Statement的查詢對應的結果集是一個,如果調用Connectioncommit()方法也會關閉結果集。可保持性就是指當ResultSet的結果被提交時,是被關閉還是不被關閉。JDBC2.01.0提供的都是提交后ResultSet就會被關閉。不過在JDBC3.0中,我們可以設置ResultSet是否關閉。要完成這樣的ResultSet的對象的創建,要使用的Statement的創建要具有三個參數,這個Statement的創建方式也就是,我所說的Statement的第三種創建方式。如下:

     

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

     

    前兩個參數和兩個參數的createStatement方法中的參數是完全相同的,這里只介紹第三個參數:
           resultSetHoldability
    表示在結果集提交后結果集是否打開,取值有兩個:
           ResultSet.HOLD_CURSORS_OVER_COMMIT:
    表示修改提交時,不關閉數據庫。
         ResultSet.CLOSE_CURSORS_AT_COMMIT
    :表示修改提交時ResultSet關閉。

     

    不過這種功能只是在JDBC3.0的驅動下才能成立。

    ResultSet 接口

    ResultSet 接口提供對數據表的訪問。ResultSet 對象通常是通過執行語句來生成的。

    ResultSet 始終有一個游標指向其當前數據行。最初,游標定位在第一行的前面。next() 方法將游標移至下一行。

    getXXX 方法會檢索當前行的列值。可使用列的索引號或列的名稱來檢索這些值。通常,使用列索引將更為有效。列是從 1 開始編號的。

    java.sql

    公共接口 ResultSet

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

    102. ResultSet 接口字段

    字段類型

    字段

    static int

    CONCUR_READ_ONLY 該常量指示不能更新的 ResultSet 對象的并行性方式。 注意DB2 Everyplace 不支持 CONCUR_UPDATABLE。如果在創建語句對象時對 ResultSet 對象的并行性方式指定 CONCUR_UPDATABLE,則 DB2 Everyplace JDBC 驅動程序將對產生語句對象的連接對象發出 SQLWarning 并使用 CONCUR_READ_ONLY 代替。

    static int

    TYPE_FORWARD_ONLY 該常量指示其游標只能向前移動的 ResultSet 對象的類型。

    static int

    TYPE_SCROLL_INSENSITIVE 該常量指示可滾動但通常對他人所作的更改不敏感的 ResultSet 對象的類型。注意:不要經常使用此類型的 ResultSet 對象,原因是它可能會影響性能。此類型使用 SQL_INSENSITIVE 作為 CLI 語句屬性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有關詳細信息,參閱 CLI 函數 SQLSetStmtAttr 的文檔。

    static int

    TYPE_SCROLL_SENSITIVE 該常量指示可滾動且通常對他人所作的更改敏感的 ResultSet 對象的類型。注意:此類型使用 SQL_UNSPECIFIED 作為 CLI 語句屬性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有關詳細信息,參閱 CLI 函數 SQLSetStmtAttr 的文檔。

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

    103. ResultSet 接口方法

    方法返回值類型

    方法

    boolean

    absolute(int row) JDBC 2.0。將游標移至結果集中的給定行號。

    void

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

    void

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

    void

    clearWarnings() 清除此 ResultSet 對象上報告的所有警告。

    void

    close() 立即釋放此 ResultSet 對象的數據庫和 JDBC 資源,而不是等待對象自動關閉時才釋放它們。

    int

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

    boolean

    first() JDBC 2.0。將游標移至結果集中的第一行。

    BigDecimal

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

    BigDecimal

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

    BigDecimal

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

    BigDecimal

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

    BigDecimal

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

    Blob

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

    Blob

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

    boolean

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

    boolean

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

    byte

    getByte(int columnIndex) Java 編程語言中的字節形式獲取此 ResultSet 對象當前行中指定列的值。

    byte

    getByte(String columnName) Java 編程語言中的字節形式獲取此 ResultSet 對象當前行中指定列的值。

    byte[]

    getBytes(int columnIndex) Java 編程語言中的字節數組形式獲取此 ResultSet 對象當前行中指定列的值。

    byte[]

    getBytes(String columnName) Java 編程語言中的字節數組形式獲取此 ResultSet 對象當前行中指定列的值。

    int

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

    Date

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

    Date

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

    Date

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

    double

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

    double

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

    float

    getFloat(int columnIndex) Java 浮點形式獲取當前行中某列的值。

    float

    getFloat(String columnName) Java 浮點形式獲取當前行中某列的值。

    int

    getInt(int columnIndex) Java 編程語言中的整數形式獲取此 ResultSet 對象當前行中指定列的值。

    int

    getInt(String columnName) Java 編程語言中的整數形式獲取此 ResultSet 對象的當前行中指定列的值。

    long

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

    long

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

    ResultSetMetaData

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

    Object

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

    Object

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

    int

    getRow() JDBC 2.0。檢索當前行號。

    short

    getShort

    short

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

    Statement

    getStatement() JDBC 2.0。返回產生此 ResultSet 對象的語句

    String

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

    String

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

    Time

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

    Time

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

    Timestamp

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

    Timestamp

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

    int

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

    SQLWarning

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

    boolean

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

    boolean

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

    boolean

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

    boolean

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

    boolean

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

    boolean

    next() 將游標從當前位置向下移動一行。

    boolean

    previous() JDBC 2.0。將游標移至結果集中的前一行。

    boolean

    relative(int rows) JDBC 2.0。將游標移動相對行數,正數或負數。

    boolean

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

     

     

    JDBC API 2.0/3.0ResultSet記錄集的
    JDBC API 2.0/3.0
    ResultSet記錄集的簡便實用的新特性


    1
    新定義了若干個常數

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

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

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

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

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

    更新數據庫中某個記錄的值(某行的值)的方法是:
    1
    定位到需要修改的行(使用absolute() relative()等方法定位)
    2
    使用相應updateXXX()方法設定某行某列的新值;XXX 所代表的Java 數據類型,必須可以映射為某列的JDBC 數據類型,如果希望rollback 該項操作,請在調用updateRow()方法以前,使用cancelRowUpdates()方法,這個方法可以將某行某列的值復原;
    3
    使用updateRow()方法完成UPDATE 的操作。

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

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

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

     

    1java數據庫操作基本流程

      2、幾個常用的重要技巧:

      可滾動、更新的記錄集

      批量更新

      事務處理

      java數據庫操作基本流程:取得數據庫連接 - 執行sql語句 - 處理執行結果 - 釋放數據庫連接


      1、取得數據庫連接

      1)用DriverManager取數據庫連接

      例子:

    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的命名和目錄服務)方式

      例子

    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、執行sql語句

      1)用Statement來執行sql語句

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


      2)用PreparedStatement來執行sql語句

    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、處理執行結果

      查詢語句,返回記錄集ResultSet

      更新語句,返回數字,表示該更新影響的記錄數。

      ResultSet的方法:

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

      2getInt("id")getSting("name"),返回當前游標下某個字段的值。

      3、釋放連接。

    cn.close();


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

      可滾動、更新的記錄集


      1、創建可滾動、更新的Statement

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


      該Statement取得的ResultSet就是可滾動的

      2、創建PreparedStatement時指定參數

    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()


      一個Statement對象,可以執行多個sql語句以后,批量更新。這多個語句可以是deleteupdateinsert等或兼有

      2PreparedStatement

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


      一個PreparedStatement,可以把一個sql語句,變換參數多次執行,一次更新。

      事務的處理

      1、關閉Connection的自動提交

    cn.setAutoCommit(false);


      2、執行一系列sql語句

      要點:執行每一個新的sql語句前,上一次執行sql語句的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、如果發生異常,那么回滾

    cn.rollback();

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

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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产成人精品无码区花野真一 | 国产精品亚洲片夜色在线| 亚洲国产美女精品久久久久| 永久免费在线观看视频| 亚洲免费一级视频| 在线观看无码的免费网站| 免费乱码中文字幕网站| 久久久久久A亚洲欧洲AV冫| 无码久久精品国产亚洲Av影片| 亚洲精品动漫在线| 亚洲AV无码一区二区大桥未久 | 三年片免费高清版 | 亚洲成熟丰满熟妇高潮XXXXX| 美女黄网站人色视频免费| 国产一级a毛一级a看免费人娇| 蜜臀98精品国产免费观看| 成人一a毛片免费视频| 亚洲精品成a人在线观看| 亚洲视频中文字幕| 亚洲av无码片vr一区二区三区| 久青草视频在线观看免费| 免费福利在线播放| 免费jjzz在线播放国产| 亚洲AV成人精品网站在线播放 | 亚洲精品在线免费观看视频| 久久亚洲精品成人无码| 国产午夜成人免费看片无遮挡| 成人免费AA片在线观看| 亚洲精品一级无码鲁丝片| 亚洲精品视频免费在线观看| 男男gay做爽爽的视频免费| 三年片在线观看免费大全电影 | 天天摸夜夜摸成人免费视频 | 亚洲成年人电影网站| 免费手机在线看片| 蜜臀AV免费一区二区三区| 亚洲人成无码久久电影网站| 亚洲成aⅴ人片在线观| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲av女电影网| 黄色a三级免费看|