ResultSet對象的類型主要體現在兩個方面:
(1)游標可操作的方式。
(2)ResultSet對象的修改對數據庫的影響。
后者稱為ResultSet對象的敏感性。ResultSet有3種不同的類型,分別說明如下。
(1)TYPE_FORWARD_ONLY
?這種類型的ResultSet不可滾動,游標只能向前移動,從第一行到最后一行,不允許向后移動,即只能使用ResultSet接口的next()方法,而不能使用previous()方法,否則會產生錯誤。
(2)TYPE_SCROLL_INSENSITIVE
?這種類型的ResultSet是可滾動的,它的游標可以相對于當前位置向前或向后移動,也可以移動到絕對位置。當ResultSet沒有關閉時,ResultSet的修改對數據庫不敏感,也就是說對ResultSet對象的修改不會影響對應的數據庫中的記錄。
(3)TYPE_SCROLL_SENSITIVE
?這種類型的ResultSet是可滾動的,它的游標可以相對于當前位置向前或向后移動,也可以移動到絕對位置。當ResultSet沒有關閉時,對ResultSet對象的修改會直接影響數據庫中的記錄。
當ResultSet沒有關閉時,對ResultSet對象的修改會直接影響數據庫中的記錄。
默認情況下,ResultSet的類型為TYPE_FORWARD_ONLY。DatabasemetaData接口中提供了一個supportsResultSetType()方法,用于判斷數據庫驅動是否支持某種類型的ResultSet對象,如果支持,則返回true,否則返回false。如果JDBC驅動不支持某一類型的ResultSet對象,在調用Connection對象的createStatement()、prepareStatement()或preparecall()方法指定創建該類型的ResultSet對象時,會在Connection對象中產生一個SQLWarning對象,當Statement對象執行時,產生的ResultSet對象可以通過ResultSet對象的getType()方法確定它的類型。
ResultSet對象的并行性決定了它支持更新的級別,目前JDBC中支持兩個級別,分別如下:
CONCUR_READ_ONLY:為ResultSet對象設置這種屬性后,只能從ResulSet對象中讀取數據,但是不能更新ResultSet對象中的數據。
CONCUR_UPDATABLE:該屬性表明,既可以從ResulSet對象中讀取數據,又能更新ResultSet中的數據。
ResultSet對象默認并行性為CONCUR_READ_ONLY。DatabaseMetaData接口中提供了一個supportsResultSetConcurrency()方法,用于判斷JDBC驅動是否支持某一級別的并行性,如果支持就返回true,否則返回false。
如果JDBC不支持某一級別的并行性,則調用createStatement()、prepareStatement()或prepareCall()方法指定該級別時會在Connection對象中產生一個SQLWarning對象。在應用程序中,可以調用ResultSet對象的getConcurrency()方法獲取ResultSet的并行性級別。
調用Connection對象的commit()方法能夠關閉當前事務中創建的ResultSet對象。然而,在某些情況下,這可能不是我們期望的行為。ResultSet對象的holdability屬性使得應用程序能夠在Connection對象的commit()方法調用后控制ResultSet對象是否關閉。
下面兩個常量用于在調用Connection對象的createStatement()、prepareStatement()或prepareCall()方法時指定ResultSet對象的可保持性。
HOLD_CURSORS_OVER_COMMIT:當調用Connection對象的commit()方法時,不關閉當前事務創建的ResultSet對象。
CLOSE_CURSORS_AT_COMMIT:當前事務創建的ResultSet對象在事務提交后會被關閉,對一些應用程序來說,這樣能夠提升系統性能。
ResultSet對象的默認可保持性取決于具體的驅動實現,DatabaseMetaData接口中提供了getResultSetHoldability()方法用于獲取JDBC驅動的默認可保持性。如果JDBC驅動不支持某一級別的可保持性,則調用createStatement()、prepareStatement()或prepareCall()方法指定該級別時,會在Connection對象中產生一個SQLWarning對象,應用程序可以調用ResultSet對象的getHoldability()方法獲取ResultSet的可保持性。
ResultSet的類型、并行性和可保持性等屬性可以在調用Connection對象的createStatement()、prepareStatement()或prepareCall()方法創建Statement對象時設置
ResultSet對象中維護了一個游標,游標指向當前數據行。當ResultSet對象第一次創建時,游標指向數據的第一行。ResultSet接口中提供了一系列的方法,用于操作ResultSet對象中的游標,這些方法的作用如下。
next():游標向前移動一行,如果游標定位到下一行,則返回true;如果游標位于最后一行之后,則返回false。
previous():游標向后移動一行,如果游標定位到上一行,則返回true;如果游標位于第一行之前,則返回false。
first():游標移動到第一行,如果游標定位到第一行,則返回true;如果ResultSet對象中一行數據都沒有,則返回false。
last():移動游標到最后一行,如果游標定位到最后一行,則返回true;如果ResultSet不包含任何數據行,則返回false。
beforeFirst():移動游標到ResultSet對象的第一行之前,如果ResultSet對象不包含任何數據行,則該方法不生效。
afterLast():游標位置移動到ResultSet對象最后一行之后,如果ResultSet對象中不包含任何行,則該方法不生效。
relative(int rows):相對于當前位置移動游標,如果參數rows為0,則游標不會移動。如果rows為正數,則游標向前移動指定的行數,如果rows大于當前位置到最后一行的偏移量,則游標移動到最后一行之后。如果rows為負數,則游標向后移動,如果rows大于當前位置到第一行的偏移量,則游標移動到第一行之前的位置。當游標正確定位到某一行時,該方法返回true,否則返回false。如果參數rows值為1,則該方法的效果和next()方法相同;如果rows參數為-1,則該方法的效果和previous()方法相同。
absolute(int row):游標定位到ResultSet對象中的第row行。如果row為正數,則游標移動到ResultSet對象的第row行。需要注意的是,這里行的序數從1開始。如果參數row大于ResultSet對象中的最大行數,則游標移動到最后一行之后。如果參數row為負數,游標從行尾開始移動。例如,row值為-1時,游標移動到最后一行;為-2時,游標移動到倒數第二行;如果row的絕對值大于最大行,則游標移動到第一行之前。
注意:當ResultSet對象的類型為TYPE_FORWARD_ONLY時,游標只能向前移動,調用其他方法操作游標向后移動時將會拋出SQLException異常
并行性為CONCUR_UPDATABLE的ResultSet對象可以使用ResultSet接口中提供的方法對其進行更新,包括更新行、刪除行,在JDBC驅動支持的情況下,還可以插入新的行。
@Test public void resultSetTest() throws SQLException { Connection connection = DriverManager.getConnection("jdbc:MySQL://xxxx/demo", "xxxx", "xxxx"); connection.setAutoCommit(false); Statement statement = connection.createStatement( ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet resultSet = statement.executeQuery("select * from demo1"); resultSet.next(); resultSet.updateString("name", "lyj1"); resultSet.updateRow(); resultSet.moveToInsertRow(); resultSet.updateString("name","daitao2"); resultSet.insertRow(); resultSet.absolute(2); resultSet.deleteRow(); connection.commit(); resultSet.close(); statement.close(); connection.close(); }
刪除數據
將ResultSet對象的游標定位到某一行后,調用deleteRow()方法會刪除數據庫中對應的行。這種刪除對于一個打開的ResultSet對象是可見的,它會反映到ResultSet對象的變化—ResultSet對象會移除對應的行,或者把對應的行設置為空或無效行。若如此,則調用DatabaseMetaData對象的ownDeletesAreVisible(int type)方法將返回true。如果調用deleteRow()方法刪除行后ResultSet對象中仍然包含該行,那么調用DatabaseMetaData對象的ownDeletesAreVisible(int type)方法將返回false,意味著數據刪除對當前ResultSet對象不可見。
將ResultSet對象的游標定位到某一行后,調用deleteRow()方法會刪除數據庫中對應的行。這種刪除對于一個打開的ResultSet對象是可見的,它會反映到ResultSet對象的變化—ResultSet對象會移除對應的行,或者把對應的行設置為空或無效行。若如此,則調用DatabaseMetaData對象的ownDeletesAreVisible(int type)方法將返回true。如果調用deleteRow()方法刪除行后ResultSet對象中仍然包含該行,那么調用DatabaseMetaData對象的ownDeletesAreVisible(int type)方法將返回false,意味著數據刪除對當前ResultSet對象不可見。
插入數據
ResultSet對象中插入行需要以下幾步:
(1)移動游標到待插入的位置。
(2)調用ResultSet接口提供的updateXXX()方法為每一個字段設置值。
(3)插入行到當前ResultSet對象中。
需要注意的是,插入行中的每一個字段不允許為null,必須使用合適的updateXXX()方法指定一個確定的值。如果updateXXX()方法指定的值與數據庫字段類型不匹配,那么調用insertRow()方法會拋出SQLException異常。如果新插入的行對ResultSet對象可見,那么調用DatabaseMetaData對象的ownInsertsAreVisible(int type)方法時返回true,否則返回false。如果新插入的行對其他事務中的ResultSet對象可見,則調用DatabaseMetaData對象的othersInsertsAreVisible(int type)方法返回true。如果ResultSet對象能夠識別新插入的行,那么調用DatabaseMetaData對象的insertsAreDetected(int type)方法將會返回true,意味著插入行對ResultSet對象可見。
更新數據
如上面的代碼所示,執行查詢SQL生成ResultSet對象后,調用next()方法將游標定位到第一行,然后調用updateString()方法更新第一行的author字段,接著調用ResultSet的updateRow()方法將ResultSet對象的修改應用到數據庫。
DatabaseMetaData接口中的ownUpdatesAreVisible(int type)方法用于判斷指定類型的ResultSet對象的更新是否對當前事務可見,如果可見,就返回true,否則返回false。
DatabaseMetaData接口的othersUpdatesAreVisible(int type)方法用于判斷指定類型的ResultSet對象的更新是否對其他事務可見,如果可見,就返回true,否則返回false。
ResultSet對象可以調用rowUpdated()方法來判斷是否調用了updateRow()方法確認更新。對于任何給定的ResultSet,應用程序不應該在調用updateXXX()方法之后以及在調用后續的updateRow()或cancelRowUpdates()方法之前修改通過updateXXX()方法設置的參數值,否則可能會產生不可預期的效果。
注意:對于一個給定的ResultSet對象,調用updateXXX()方法為每一個字段設置值后,在insertRow()方法調用前,應用程序不可以修改參數值,否則可能產生不可預料的結果。
ResultSet對象在下面兩種情況下會顯式地關閉:
(1)調用ResultSet對象的close()方法。
(2)創建ResultSet對象的Statement或者Connection對象被顯式地關閉。
在下面兩種情況下ResultSet對象會被隱式地關閉:
(1)相關聯的Statement對象重復執行時。
(2)可保持性為CLOSE_CURSORS_AT_COMMIT的ResultSet對象在當前事務提交后會被關閉。
注意:
一些JDBC驅動實現,當ResultSet類型為TYPE_FORWARD_ONLY并且next()方法返回false時,也會隱式地關閉ResultSet對象。一旦ResultSet對象被關閉,調用除isClosed()和close()之外的方法就會拋出SQLException異常,但是通過ResultSet創建的ResultSetMetaData實例仍然可以訪問。
ResultSet對象關閉后,不會關閉由ResultSet對象創建的Blob、Clob、NClob或SQLXML對象,除非調用這些對象的free()方法。
注意:摘要于《mybatis3源碼深度解析》
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
馬航370事件的真相是什么?2014年3月8日凌晨0時42分,馬航mh370起飛,目的地為北京。這條路幾乎沒有轉彎,所以它可以一直走。凌晨1時20分,飛機關閉通訊,與地面失去聯系。此時,飛機仍在南海上空的常規航線上。之后,飛機作了一個360度的轉彎,先往南,再往西,再向北飛行。這架飛機是在凌晨2點40分在馬六甲海峽上空被雷達發現的。然后它又掉頭飛到了西南印度洋。最后,它耗盡了燃料,墜入南印度洋。飛...
電信wifi用戶名怎么改?電信無線貓直接修改WIFI密碼方法(無線網絡名稱無法如何修改):1、把無線貓背后標簽上上標的IP地址再輸入到瀏覽器地址欄,登陸光貓設置頁面;2、右鍵點擊“網絡”,再中,選擇“WLAN配置”;3、再下拉到最后,再點擊“初級”按鈕;4、設置中網絡認證,建議可以使用“WPA2-PSK”,再輸入輸入所要不使用的密碼既可,結果要右擊“存放/應用”按鈕能保存配置;5、之后在“管理”—...
GTA4.求SparkIV導入MOD詳細使用教程和SparkIV下載連接?用sparkiv打開GTA4車輛img文件,導入并保存。首先,下載與你的游戲版本相對應的sparkiv,把所有文件放到游戲目錄中,然后打開它斯巴科夫.exe,單擊第一個黑色圖標以查找車輛.img輸入后,雙擊上面的導入鍵,選擇要導入的文件,打開要導入的文件,然后單擊保存。...