ResultSet 相關操作與介紹

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

 

        結果集讀取數據的方法主要是getXXX(),他的參數可以使整型表示第幾列(是從1開始的),還可以是列名。返回的是對應的XXX類型的值。如果對應那列時空值,XXX是對象的話返回XXX型的空值,如果XXX是數字類型,如Float等則返回0,boolean返回false。使用getString()可以返回所有的列的值,不過返回的都是字符串類型的。XXX可以代表的類型有:基本的數據類型如整型(int),布爾型(Boolean),浮點型(Float,Double)等,比特型(byte),還包括一些特殊的類型,如:日期類型(java.sql.Date),時間類型(java.sql.Time),時間戳類型(java.sql.Timestamp),大數型(BigDecimal和BigInteger等)等。還可以使用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中的第幾行absolute(int 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只要設置了可更新就能夠完成更新的,能夠完成更新的ResultSet的SQL語句必須要具備如下的屬性:
    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的查詢對應的結果集是一個,如果調用Connection的commit()方法也會關閉結果集。可保持性就是指當ResultSet的結果被提交時,是被關閉還是不被關閉。JDBC2.0和1.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.0中ResultSet記錄集的 
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()等方法

 

1、java數據庫操作基本流程

  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); // 執行數據更新語句(delete、update、insert、drop等)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的方法:

  1、next(),將遊標往後移動一行,如果成功返回true;否則返回false。

  2、getInt("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);


  批量更新

  1、Statement

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


  一個Statement對象,可以執行多個sql語句以後,批量更新。這多個語句可以是delete、update、insert等或兼有

  2、PreparedStatement

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章