這篇文章并沒有給出如何使用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、釋放連接。
一般,先關閉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的自動提交
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、提交
4、如果發生異常,那么回滾
posted on 2006-03-07 09:15
fadesea 閱讀(18652)
評論(5) 編輯 收藏