這篇文章并沒有給出如何使用ResultSet的具體例子,只是從ResultSet的功能性上進(jìn)行了詳細(xì)的講述。希望這篇文章對大家理解ResultSet能夠有所幫助。下面就是這篇文章的具體內(nèi)容。
結(jié)果集(ResultSet)是數(shù)據(jù)中查詢結(jié)果返回的一種對象,可以說結(jié)果集是一個存儲查詢結(jié)果的對象,但是結(jié)果集并不僅僅具有存儲的功能,他同時還具有操縱數(shù)據(jù)的功能,可能完成對數(shù)據(jù)的更新等。
結(jié)果集讀取數(shù)據(jù)的方法主要是getXXX(),他的參數(shù)可以使整型表示第幾列(是從1開始的),還可以是列名。返回的是對應(yīng)的XXX類型的值。如果對應(yīng)那列時空值,XXX是對象的話返回XXX型的空值,如果XXX是數(shù)字類型,如Float等則返回0,boolean返回false。使用getString()可以返回所有的列的值,不過返回的都是字符串類型的。XXX可以代表的類型有:基本的數(shù)據(jù)類型如整型(int),布爾型(Boolean),浮點(diǎn)型(Float,Double)等,比特型(byte),還包括一些特殊的類型,如:日期類型(java.sql.Date),時間類型(java.sql.Time),時間戳類型(java.sql.Timestamp),大數(shù)型(BigDecimal和BigInteger等)等。還可以使用getArray(int colindex/String columnname),通過這個方法獲得當(dāng)前行中,colindex所在列的元素組成的對象的數(shù)組。使用getAsciiStream(
int colindex/String colname)可以獲得該列對應(yīng)的當(dāng)前行的ascii流。也就是說所有的getXXX方法都是對當(dāng)前行進(jìn)行操作。
結(jié)果集從其使用的特點(diǎn)上可以分為四類,這四類的結(jié)果集的所具備的特點(diǎn)都是和Statement語句的創(chuàng)建有關(guān),因為結(jié)果集是通過Statement語句執(zhí)行后產(chǎn)生的,所以可以說,結(jié)果集具備何種特點(diǎn),完全決定于Statement,當(dāng)然我是說下面要將的四個特點(diǎn),在Statement創(chuàng)建時包括三種類型。首先是無參數(shù)類型的,他對應(yīng)的就是下面要介紹的基本的ResultSet對應(yīng)的Statement。下面的代碼中用到的Connection并沒有對其初始化,變量conn代表的就是Connection對應(yīng)的對象。SqlStr代表的是響應(yīng)的SQL語句。
1、 最基本的ResultSet。
之所以說是最基本的ResultSet是因為,這個ResultSet他起到的作用就是完成了查詢結(jié)果的存儲功能,而且只能讀去一次,不能夠來回的滾動讀取。這種結(jié)果集的創(chuàng)建方式如下:
Statement st = conn.CreateStatement()
ResultSet rs = Statement.excuteQuery(sqlStr);
由于這種結(jié)果集不支持,滾動的讀去功能所以,如果獲得這樣一個結(jié)果集,只能使用它里面的next()方法,逐個的讀去數(shù)據(jù)。
2、 可滾動的ResultSet類型。
這個類型支持前后滾動取得紀(jì)錄next()、previous(),回到第一行first(),同時還支持要去的ResultSet中的第幾行absolute(int n),以及移動到相對當(dāng)前行的第幾行relative(int n),要實現(xiàn)這樣的ResultSet在創(chuàng)建Statement時用如下的方法。
Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
其中兩個參數(shù)的意義是:
resultSetType是設(shè)置ResultSet對象的類型可滾動,或者是不可滾動。取值如下:
ResultSet.TYPE_FORWARD_ONLY只能向前滾動
ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE這兩個方法都能夠?qū)崿F(xiàn)任意的前后滾動,使用各種移動的ResultSet指針的方法。二者的區(qū)別在于前者對于修改不敏感,而后者對于修改敏感。
resultSetConcurency是設(shè)置ResultSet對象能夠修改的,取值如下:
ResultSet.CONCUR_READ_ONLY 設(shè)置為只讀類型的參數(shù)。
ResultSet.CONCUR_UPDATABLE 設(shè)置為可修改類型的參數(shù)。
所以如果只是想要可以滾動的類型的Result只要把Statement如下賦值就行了。
Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sqlStr);
用這個Statement執(zhí)行的查詢語句得到的就是可滾動的ResultSet。
3、 可更新的ResultSet
這樣的ResultSet對象可以完成對數(shù)據(jù)庫中表的修改,但是我知道ResultSet只是相當(dāng)于數(shù)據(jù)庫中表的視圖,所以并不時所有的ResultSet只要設(shè)置了可更新就能夠完成更新的,能夠完成更新的ResultSet的SQL語句必須要具備如下的屬性:
a、只引用了單個表。
b、不含有join或者group by子句。
c、那些列中要包含主關(guān)鍵字。
具有上述條件的,可更新的ResultSet可以完成對數(shù)據(jù)的修改,可更新的結(jié)果集的創(chuàng)建方法是:
Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)
這樣的Statement的執(zhí)行結(jié)果得到的就是可更新的結(jié)果集。更新的方法是,把ResultSet的游標(biāo)移動到你要更新的行,然后調(diào)用updateXXX(),這個方法XXX的含義和getXXX()是相同的。updateXXX()方法,有兩個參數(shù),第一個是要更新的列,可以是列名或者序號。第二個是要更新的數(shù)據(jù),這個數(shù)據(jù)類型要和XXX相同。每完成對一行的update要調(diào)用updateRow()完成對數(shù)據(jù)庫的寫入,而且是在ResultSet的游標(biāo)沒有離開該修改行之前,否則修改將不會被提交。
使用updateXXX方法還可以完成插入操作。但是首先要介紹兩個方法:
moveToInsertRow()是把ResultSet移動到插入行,這個插入行是表中特殊的一行,不需要指定具體那一行,只要調(diào)用這個方法系統(tǒng)會自動移動到那一行的。
moveToCurrentRow()這是把ResultSet移動到記憶中的某個行,通常當(dāng)前行。如果沒有使用insert操作,這個方法沒有什么效果,如果使用了insert操作,這個方法用于返回到insert操作之前的那一行,離開插入行,當(dāng)然也可以通過next(),previous()等方法離開插入行。
要完成對數(shù)據(jù)庫的插入,首先調(diào)用moveToInsertRow()移動到插入行,然后調(diào)用updateXXX的方法完成對,各列數(shù)據(jù)的更新,完成更新后和更新操作一樣,要寫到數(shù)據(jù)庫,不過這里使用的是insertRow(),也要保證在該方法執(zhí)行之前ResultSet沒有離開插入列,否則插入不被執(zhí)行,并且對插入行的更新將丟失。
4、 可保持的ResultSet
正常情況下如果使用Statement執(zhí)行完一個查詢,又去執(zhí)行另一個查詢時這時候第一個查詢的結(jié)果集就會被關(guān)閉,也就是說,所有的Statement的查詢對應(yīng)的結(jié)果集是一個,如果調(diào)用Connection的commit()方法也會關(guān)閉結(jié)果集。可保持性就是指當(dāng)ResultSet的結(jié)果被提交時,是被關(guān)閉還是不被關(guān)閉。JDBC2.0和1.0提供的都是提交后ResultSet就會被關(guān)閉。不過在JDBC3.0中,我們可以設(shè)置ResultSet是否關(guān)閉。要完成這樣的ResultSet的對象的創(chuàng)建,要使用的Statement的創(chuàng)建要具有三個參數(shù),這個Statement的創(chuàng)建方式也就是,我所說的Statement的第三種創(chuàng)建方式。如下:
Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
ResultSet rs = st.excuteQuery(sqlStr);
前兩個參數(shù)和兩個參數(shù)的createStatement方法中的參數(shù)是完全相同的,這里只介紹第三個參數(shù):
resultSetHoldability表示在結(jié)果集提交后結(jié)果集是否打開,取值有兩個:
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交時,不關(guān)閉數(shù)據(jù)庫。
ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交時ResultSet關(guān)閉。
不過這種功能只是在JDBC3.0的驅(qū)動下才能成立。
ResultSet 接口
ResultSet 接口提供對數(shù)據(jù)表的訪問。ResultSet 對象通常是通過執(zhí)行“語句”來生成的。
ResultSet 始終有一個游標(biāo)指向其當(dāng)前數(shù)據(jù)行。最初,游標(biāo)定位在第一行的前面。next() 方法將游標(biāo)移至下一行。
getXXX 方法會檢索當(dāng)前行的列值。可使用列的索引號或列的名稱來檢索這些值。通常,使用列索引將更為有效。列是從 1 開始編號的。
java.sql 包
公共接口 ResultSet
表 102 列示 ResultSet 接口中 DB2 Everyplace 支持的字段。
表 102. ResultSet 接口字段
字段類型 |
字段 |
static int |
CONCUR_READ_ONLY 該常量指示不能更新的 ResultSet 對象的并行性方式。 注意:DB2 Everyplace 不支持 CONCUR_UPDATABLE。如果在創(chuàng)建“語句”對象時對 ResultSet 對象的并行性方式指定 CONCUR_UPDATABLE,則 DB2 Everyplace JDBC 驅(qū)動程序?qū)Ξa(chǎn)生“語句”對象的“連接”對象發(fā)出 SQLWarning 并使用 CONCUR_READ_ONLY 代替。 |
static int |
TYPE_FORWARD_ONLY 該常量指示其游標(biāo)只能向前移動的 ResultSet 對象的類型。 |
static int |
TYPE_SCROLL_INSENSITIVE 該常量指示可滾動但通常對他人所作的更改不敏感的 ResultSet 對象的類型。注意:不要經(jīng)常使用此類型的 ResultSet 對象,原因是它可能會影響性能。此類型使用 SQL_INSENSITIVE 作為 CLI 語句屬性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有關(guān)詳細(xì)信息,參閱 CLI 函數(shù) SQLSetStmtAttr 的文檔。 |
static int |
TYPE_SCROLL_SENSITIVE 該常量指示可滾動且通常對他人所作的更改敏感的 ResultSet 對象的類型。注意:此類型使用 SQL_UNSPECIFIED 作為 CLI 語句屬性 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é)果集中的給定行號。 |
void |
afterLast() JDBC 2.0。將游標(biāo)移至結(jié)果集的末尾,正好在最后一行的后面。 |
void |
beforeFirst() JDBC 2.0。將游標(biāo)移至結(jié)果集的前方,正好在第一行的前面。 |
void |
clearWarnings() 清除此 ResultSet 對象上報告的所有警告。 |
void |
close() 立即釋放此 ResultSet 對象的數(shù)據(jù)庫和 JDBC 資源,而不是等待對象自動關(guān)閉時才釋放它們。 |
int |
findColumn(String columnName) 將給定 ResultSet 列名映射至其 ResultSet 列索引。 |
boolean |
first() JDBC 2.0。將游標(biāo)移至結(jié)果集中的第一行。 |
BigDecimal |
getBigDecimal(int columnIndex) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 對象形式獲取當(dāng)前行中某個列的值。Palm OS 的 DB2 Everyplace JDBC 驅(qū)動程序不支持此方法。 |
BigDecimal |
getBigDecimal(int columnIndex, int scale) 以 Java 編程語言中的 java.math.BigDecim
|
BigDecimal |
getBigDecimal(int columnIndex, int scale) 以 Java 編程語言中的 java.math.BigDecimal 對象形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。Palm OS 的 DB2 Everyplace JDBC 驅(qū)動程序不支持此方法。不受支持。 |
BigDecimal |
getBigDecimal(String columnName) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 對象形式獲取當(dāng)前行中某個列的值。Palm OS 的 DB2 Everyplace JDBC 驅(qū)動程序不支持此方法。 |
BigDecimal |
getBigDecimal(String columnName, int scale) 以 Java 編程語言中的 java.math.BigDecimal 對象形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。Palm OS 的 DB2 Everyplace JDBC 驅(qū)動程序不支持此方法。不受支持。 |
Blob |
getBlob(int columnIndex) JDBC 2.0。獲取此 ResultSet 對象的當(dāng)前行中的 BLOB 值。 |
Blob |
getBlob(String columnName) JDBC 2.0。獲取此 ResultSet 對象的當(dāng)前行中的 BLOB 值。 |
boolean |
getBoolean(int columnIndex) 以 Java 布爾值形式獲取當(dāng)前行中某列的值。 |
boolean |
getBoolean(String columnName) 以 Java 布爾值形式獲取當(dāng)前行中某列的值。 |
byte |
getByte(int columnIndex) 以 Java 編程語言中的字節(jié)形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
byte |
getByte(String columnName) 以 Java 編程語言中的字節(jié)形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
byte[] |
getBytes(int columnIndex) 以 Java 編程語言中的字節(jié)數(shù)組形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
byte[] |
getBytes(String columnName) 以 Java 編程語言中的字節(jié)數(shù)組形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
int |
getConcurrency() JDBC 2.0。返回結(jié)果集的并行性方式。 |
Date |
getDate(int columnIndex) 以 Java 編程語言中的 java.sql.Date 對象形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
Date |
getDate(int columnIndex, Calendar cal) 以 Java 編程語言中的 java.sql.Date 對象形式返回此 ResultSet 對象的當(dāng)前行中指定列的值。 |
Date |
getDate(String columnName) 以 Java 編程語言中的 java.sql.Date 對象形式獲取此 ResultSet 對象的當(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 編程語言中的整數(shù)形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
int |
getInt(String columnName) 以 Java 編程語言中的整數(shù)形式獲取此 ResultSet 對象的當(dāng)前行中指定列的值。 |
long |
getLong(int columnIndex) 以 Java 長整型形式獲取當(dāng)前行中某列的值。 |
long |
getLong(String columnName) 以 Java 長整型形式獲取當(dāng)前行中某列的值。 |
ResultSetMetaData |
getMetaData() 檢索此 ResultSet 對象的列的數(shù)目、類型和屬性。 |
Object |
getObject(int columnIndex) 以 Java 對象形式獲取當(dāng)前行中某列的值。 |
Object |
getObject(String columnName) 以 Java 對象形式獲取當(dāng)前行中某列的值。 |
int |
getRow() JDBC 2.0。檢索當(dāng)前行號。 |
short |
getShort |
short |
getShort(String columnName) 以 Java 編程語言中的 short 形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
Statement |
getStatement() JDBC 2.0。返回產(chǎn)生此 ResultSet 對象的“語句”。 |
String |
getString(int columnIndex) 以 Java 編程語言中的 String 形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
String |
getString(String columnName) 以 Java 編程語言中的 String 形式獲取此 ResultSet 對象當(dāng)前行中指定列的值。 |
Time |
getTime(int columnIndex) 以 Java 編程語言中的 java.sql.Time 對象形式獲取此 ResultSet 對象的當(dāng)前行中指定列的值。 |
Time |
getTime(String columnName) 以 Java 編程語言中的 java.sql.Date 對象形式獲取此 ResultSet 對象的當(dāng)前行中指定列的值。 |
Timestamp |
getTimestamp(String columnName) 以 Java 編程語言中的 java.sql.Timestamp 對象形式獲取此 ResultSet 對象的當(dāng)前行中指定列的值。 |
Timestamp |
getTimestamp(int columnIndex) 以 Java 編程語言中的 java.sql.Timestamp 對象形式獲取此 ResultSet 對象的當(dāng)前行中指定列的值。 |
int |
getType() JDBC 2.0。返回此結(jié)果集的類型。 |
SQLWarning |
getWarnings() 返回此 ResultSet 上的調(dià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é)果集中的最后一行上。對于具有類型 TYPE_FORWARD_ONLY 的結(jié)果集,不支持此方法。 |
boolean |
last() JDBC 2.0。將游標(biāo)移至結(jié)果集中的最后一行。 |
boolean |
next() 將游標(biāo)從當(dāng)前位置向下移動一行。 |
boolean |
previous() JDBC 2.0。將游標(biāo)移至結(jié)果集中的前一行。 |
boolean |
relative(int rows) JDBC 2.0。將游標(biāo)移動相對行數(shù),正數(shù)或負(fù)數(shù)。 |
boolean |
wasNull() 報告讀取的最后一列是否具有值 SQL NULL。 |
JDBC API 2.0/3.0中ResultSet記錄集的
JDBC API 2.0/3.0中ResultSet記錄集的簡便實用的新特性
1 新定義了若干個常數(shù)
這些常數(shù)用于指定ResultSet 的類型游標(biāo)移動的方向等性質(zhì),如下所示:
public static final int FETCH_FORWARD; 該常數(shù)的作用是指定處理記錄集中行的順序,是由前到后即從第一行開始處理一直到最后一行;
public static final int FETCH_REVERSE; 該常數(shù)的作用是指定處理記錄集中行的順序,是由后到前即從最后一行開始處理一直到第一行;
public static final int FETCH_UNKNOWN; 該常數(shù)的作用是不指定處理記錄集中行的順序,由JDBC 驅(qū)動程序和數(shù)據(jù)庫系統(tǒng)決定;
public static final int TYPE_FORWARD_ONLY; 該常數(shù)的作用是指定數(shù)據(jù)庫游標(biāo)的移動方向是向前,不允許向后移動即只能使用ResultSet 接口的next()方法而不能使用previous()方法否則會產(chǎn)生錯誤;
public static final int TYPE_SCROLL_INSENSITIVE; 該常數(shù)的作用是指定數(shù)據(jù)庫游標(biāo)可以在記錄集中前后移動,并且當(dāng)前數(shù)據(jù)庫用戶獲取的記錄集對其他用戶的操作不敏感;就是說,當(dāng)前用戶正在瀏覽記錄集中的數(shù)據(jù),與此同時,其他用戶更新了數(shù)據(jù)庫中的數(shù)據(jù),但是當(dāng)前用戶所獲取的記錄集中的數(shù)據(jù)不會受到任何影響。
public static final int TYPE_SCROLL_SENSITIVE; 該常數(shù)的作用是指定數(shù)據(jù)庫游標(biāo)可以在記錄集中前后移動,并且當(dāng)前數(shù)據(jù)庫用戶獲取的記錄集對其他用戶的操作敏感,就是說,當(dāng)前用戶正在瀏覽記錄集,但是其它用戶的操作使數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了變化,當(dāng)前用戶所獲取的記錄集中的數(shù)據(jù)也會同步發(fā)生變化,這樣有可能會導(dǎo)致非常嚴(yán)重的錯誤產(chǎn)生建議慎重使用該常數(shù)。
public static final int CONCUR_READ_ONLY; 該常數(shù)的作用是指定當(dāng)前記錄集的協(xié)作方式(concurrencymode),為只讀;一旦使用了這個常數(shù),那么用戶就不可以更新記錄集中的數(shù)據(jù)。
public static final int CONCUR_UPDATABLE; 該常數(shù)的作用是指定當(dāng)前記錄集的協(xié)作方式(concurrencymode),為可以更新;一旦使用了這個常數(shù),那么用戶就可以使用updateXXX()等方法更新記。
2 ResultSet 接口提供了一整套的定位方法
這些可以在記錄集中定位到任意一行:
public boolean absolute(int row); 該方法的作用是將記錄集中的某一行設(shè)定為當(dāng)前行,亦即將數(shù)據(jù)庫游標(biāo)移動到指定的行,參數(shù)row 指定了目標(biāo)行的行號,這是絕對的行號,由記錄集的第一行開始計算不是相對的行號。
public boolean relative(int rows); 該方法的作用也是將記錄集中的某一行設(shè)定為當(dāng)前行,但是它的參數(shù)rows 表示目標(biāo)行相對于當(dāng)前行的行號。
public boolean first(); 該方法的作用是將當(dāng)前行定位到數(shù)據(jù)庫記錄集的第一行。
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ù)庫游標(biāo)移到記錄集的最后,位于記錄集最后一行的后面,如果該記錄集不包含任何的行該方法不產(chǎn)生作用。
public void beforeFirst(); 該方法的作用是將數(shù)據(jù)庫游標(biāo)移到記錄集的最前面,位于記錄集第一行的前面,如果記錄集不包含任何的行該方法不產(chǎn)生作用。
public boolean isAfterLast(); 該方法檢查數(shù)據(jù)庫游標(biāo)是否處于記錄集的最后面,如果是返回true ,否則返回false。
public boolean isBeforeFirst(); 該方法檢查數(shù)據(jù)庫游標(biāo)是否處于記錄集的最前面,如果是返回true ,否則返回false。
public boolean next(); 該方法的作用是將數(shù)據(jù)庫游標(biāo)向前移動一位,使得下一行成為當(dāng)前行,當(dāng)剛剛打開記錄集對象時,數(shù)據(jù)庫游標(biāo)的位置在記錄集的最前面,第一次使用next()方法將會使數(shù)據(jù)庫游標(biāo)定位到記錄集的第一行,第二次使用next()方法將會使數(shù)據(jù)庫游標(biāo)定位到記錄集的第二行,以此類推。
public boolean previous(); 該方法的作用是將數(shù)據(jù)庫游標(biāo)向后移動一位,使得上一行成為當(dāng)前行。
3 ResultSet 接口添加了對行操作的支持(最令人心動之處)
修改了的記錄集接口(ResultSet 接口)的方法,使它支持可以滾動的記錄集,即數(shù)據(jù)庫游標(biāo)可以在返回的記錄集對象中自由地向前或向后滾動,或者定位到某個特殊的行。利用ResultSet 接口中定義的新方法,JSP/Servlet 程序員可以用Java 語言來更新記錄集,比如插入記錄,更新某行的數(shù)據(jù),而不是靠執(zhí)行SQL 語句,這樣就大大方便了程序員的開發(fā)工作,享受Java 編程的樂趣了。
ResultSet 接口中新添加的部分方法如下所示:
public boolean rowDeleted(); 如果當(dāng)前記錄集的某行被刪除了,那么記錄集中將會留出一個空位;調(diào)用rowDeleted()方法,如果探測到空位的存在,那么就返回true; 如果沒有探測到空位的存在,就返回false 值。
public boolean rowInserted(); 如果當(dāng)前記錄集中插入了一個新行,該方法將返回true ,否則返回false。
public boolean rowUpdated(); 如果當(dāng)前記錄集的當(dāng)前行的數(shù)據(jù)被更新,該方法返回true ,否則返回false。
public void insertRow(); 該方法將執(zhí)行插入一個新行到當(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 ,與之對應(yīng)的JDBC 數(shù)據(jù)類型是VARCHAR 或NVARCHAR 等數(shù)據(jù)類型) 。該方法的參數(shù)columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此類推,第二個參數(shù)x 代表新的值,這個方法并不執(zhí)行數(shù)據(jù)庫操作,需要執(zhí)行insertRow()方法或者updateRow()方法以后,記錄集和數(shù)據(jù)庫中的數(shù)據(jù)才能夠真正更新。
public void updateString(String columnName String x); 該方法和上面介紹的同名方法差不多,不過該方法的第一個參數(shù)是columnName ,代表需要更新的列的列名,而不是columnIndex。
往數(shù)據(jù)庫當(dāng)前記錄集插入新行的操作流程如下:
1 調(diào)用moveToInsertRow()方法;
2 調(diào)用updateXXX()方法指定插入行各列的值;
3 調(diào)用insertRow()方法往數(shù)據(jù)庫中插入新的行。
更新數(shù)據(jù)庫中某個記錄的值(某行的值)的方法是:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用相應(yīng)updateXXX()方法設(shè)定某行某列的新值;XXX 所代表的Java 數(shù)據(jù)類型,必須可以映射為某列的JDBC 數(shù)據(jù)類型,如果希望rollback 該項操作,請在調(diào)用updateRow()方法以前,使用cancelRowUpdates()方法,這個方法可以將某行某列的值復(fù)原;
3 使用updateRow()方法完成UPDATE 的操作。
刪除記錄集中某行(亦即刪除某個記錄)的方法:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用deleteRow()
刪除記錄集中某行(亦即刪除某個記錄)的方法:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用deleteRow()方法。
JDBC API 3.0 中還在ResultSet 接口中添加了updateArray() updateBlob() updateClob() updateRef()等方法
1、java數(shù)據(jù)庫操作基本流程
2、幾個常用的重要技巧:
可滾動、更新的記錄集
批量更新
事務(wù)處理
java數(shù)據(jù)庫操作基本流程:取得數(shù)據(jù)庫連接 - 執(zhí)行sql語句 - 處理執(zhí)行結(jié)果 - 釋放數(shù)據(jù)庫連接
1、取得數(shù)據(jù)庫連接
1)用DriverManager取數(shù)據(jù)庫連接
例子:
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語句
1)用Statement來執(zhí)行sql語句
String sql; Statement sm = cn.createStatement(); sm.executeQuery(sql); // 執(zhí)行數(shù)據(jù)查詢語句(select) sm.executeUpdate(sql); // 執(zhí)行數(shù)據(jù)更新語句(delete、update、insert、drop等)statement.close(); |
2)用PreparedStatement來執(zhí)行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、處理執(zhí)行結(jié)果
查詢語句,返回記錄集ResultSet。
更新語句,返回數(shù)字,表示該更新影響的記錄數(shù)。
ResultSet的方法:
1、next(),將游標(biāo)往后移動一行,如果成功返回true;否則返回false。
2、getInt("id")或getSting("name"),返回當(dāng)前游標(biāo)下某個字段的值。
3、釋放連接。
一般,先關(guān)閉ResultSet,然后關(guān)閉Statement(或者PreparedStatement);最后關(guān)閉Connection
可滾動、更新的記錄集
1、創(chuàng)建可滾動、更新的Statement
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |
該Statement取得的ResultSet就是可滾動的
2、創(chuàng)建PreparedStatement時指定參數(shù)
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對象,可以執(zhí)行多個sql語句以后,批量更新。這多個語句可以是delete、update、insert等或兼有
2、PreparedStatement
PreparedStatement ps = cn.preparedStatement(sql); { ps.setXXX(1,xxx); ... ps.addBatch(); } ps.executeBatch(); |
一個PreparedStatement,可以把一個sql語句,變換參數(shù)多次執(zhí)行,一次更新。
事務(wù)的處理
1、關(guān)閉Connection的自動提交
2、執(zhí)行一系列sql語句
要點(diǎn):執(zhí)行每一個新的sql語句前,上一次執(zhí)行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、如果發(fā)生異常,那么回滾
posted on 2006-03-07 09:15
fadesea 閱讀(18652)
評論(5) 編輯 收藏