国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JDBC和結果集的操作

2019-11-11 02:38:14
字體:
來源:轉載
供稿:網友

1.Class.ForName("xxx");加載驅動器類

2.連接到數據庫

Connection con = DriverManager.getConnection(url, user, passWord);3.創建statement對象

PReparedStatement statement = con.prepareStatement(sql);		Statement sta = con.createStatement();4.執行sql

ResultSet set = statement.executeQuery();sta.execute(sql);sta.getResultSet();

   executeUpdate方法既可以執行諸如INSERT、 UPDATE和DELETE之類的操作,也可以執行諸如CREATE TABLE和DROP TABLE之類的數據定義語句。但是,執行SELECT查詢時必須使用executeQuery方法。另外還有一個execute方法可以執行任意的SQL語句,此方法通常只用于用戶提供的交互式查詢。

5.解析ResultSet得到數據

while(sta.next()){sta.getString(1);sta.getString("name");}          ResultSet類的迭代方法與java.util.Iterator接口稍有不同。對于ResultSet類,迭代器初始化時被設定在第一行之前的位置,必須調用next方法將它移動到第一行。另外,它沒有hasNext方法,我們需要不斷地調用next,直至該方法返回false。不同的數據類型有不同的訪問器,比如getString和getdouble。每個訪問器都有兩種形式,一種接受數字參數,另一種接受字符串參數。當使用數字參數時,我們指的是該數字所對應的列。例如, rs.getString(1)返回的是當前行中第一列的值。與數組的索引不同,數據庫的列序號是從1開始計算的。   當使用字符串參數時,指的是結果集中以該字符串為列名的列。例如, rs.getDouble("Price")返回列名為Price的列所對應的值。使用數字參數效率更高一些,但是使用字符串參數可以使代碼易于閱讀和維護。當get方法的類型和列的數據類型不一致時,每個get方法都會進行合理的類型轉換。例如,調用rs.getString("Price")時,該方法會將Price列的浮點值轉換成字符串。
StatementResultSet executeQuery(String sqlQuery)執行給定字符串中的SQL語句,并返回一個用于查看查詢結果的ResultSet對象。int executeUpdate(String sqlStatement)執行字符串中指定的INSERT、 UPDATE或DELETE等SQL語句。還可以執行數據定義語言( Data Definition Language, DDL)的語句,如CREATE TABLE。返回受影響的記錄總數,如果是沒有更新計數的語句,則返回-1。boolean execute(String sqlStatement)執行字符串中指定的SQL語句。可能會產生多個結果集和更新數。如果第一個執行結果是結果集,則返回true;反之,返回false。調用getResultSet或getUpdateCount方法可以得到第一個執行結果。請參見第4.5.4節中關于處理多結果集的詳細信息。ResultSet getResultSet()返回前一條查詢語句的結果集。如果前一條語句未產生結果集,則返回null值。對于每一條執行過的語句,該方法只能被調用一次。int getUpdateCount()返回受前一條更新語句影響的行數。如果前一條語句未更新數據庫,則返回-1。對于每一條執行過的語句,該方法只能被調用一次。void close()關閉Statement對象以及它所對應的結果集。boolean isClosed() 如果語句被關閉,則返回true。
ResultSetboolean next()將結果集中的當前行向前移動一行。如果已經到達最后一行的后面,則返回false。注意,初始情況下必須調用該方法才能轉到第一行。Xxx getXxx(int columnNumber)Xxx getXxx(String columnName)( Xxx指數據類型,例如int、 double、 String、 Date等。)用給定的列序號或列標簽返回該列的值,并將值轉換成指定類型。列標簽是SQL的AS字句中指定的標簽,在沒有使用AS時,它就是列名。int findColumn(String columnName)根據給定的列名,返回該列的序號。void close()立即關閉當前的結果集。boolean isClosed() 如果語句被關閉,則返回true。   每個Connection對象都可以創建一個或一個以上的Statement對象。同一個Statement對象可以用于多個不相關的命令和查詢。但是,一個Statement對象最多只能打開一個結果集。如果需要執行多個查詢操作,且需要同時分析查詢結果,那么必須創建多個Statement對象。這看上去似乎很有局限性。但實際上,我們通常并不需要同時處理多個結果集。如果結果集相互關聯,我們就可以使用組合查詢,這樣就只需要分析一個結果。對數據庫進行組合查詢比使用Java程序遍歷多個結果集要高效得多。當使用完ResultSet、 Statement或Connection對象時,應立即調用close方法。這些對象都使用了規模較大的數據結構,所以我們不應該等待垃圾回收器來處理它們。   如果Statement對象上有一個打開的結果集,那么調用close方法將自動關閉該結果集。同樣地,調用Connection類的close方法將關閉該連接上的所有語句。

預備語句preparedStatement

   沒有必要在每次開始一個這樣的查詢時都建立新的查詢語句,而是準備一個帶有宿主變量的查詢語句,每次查詢時只需為該變量填入不同的字符串就可以反復多次地使用該語句。這一技術改進了查詢性能,每當數據庫執行一個查詢時,它總是首先通過計算來確定查詢策略,以便高效地執行查詢操作。通過事先準備好查詢并多次重用它,我們就可以確保查詢所需的準備步驟只被執行一次。在預備查詢語句中,每個宿主變量都用“ ?”來表示。如果存在一個以上的變量,那么在設置變量值時必須注意“ ?”的位置。必須使用set方法將變量綁定到實際的值上。和ResultSet方法中的get方法類似,針對不同的數據類型也有不同的set方法。

statement.setInt(1, 7);   位置1表示第一個“ ?”。第二個參數指的是賦予宿主變量的值。如果想要重用已經執行過的預備查詢語句,那么除非使用set方法或調用clearParameters方法,否則所有宿主變量的綁定都不會改變。

讀取COB數據

   除了數字、字符串和日期之外,許多數據庫都可以存儲大對象,例如圖片或其他數據。在SQL中,二進制大對象稱為BLOB,字符型大對象稱為CLOB。要讀取LOB,需要執行SELECT語句,然后在ResultSet上調用getBlob和getClob方法,這樣就可以獲得Blob和Clob類型的對象。要從Blob中獲取二進制數據,可以調用getBytes或getInputStream。如果獲取了Clob對象,那么就可以通過調用getSubString或getCharacterStream來獲取其中的字符數據。要將LOB置于數據庫中,需要在Connection對象上調用createBlob或createClob,然后獲取一個用于該LOB的輸出流或寫出器,并將該對象存儲到數據庫中。

Bloblong length()獲取該BLOB的長度。byte[] getBytes(long startPosition, long length)獲取該BLOB中給定范圍的數據。InputStream getBinaryStream()InputStream getBinaryStream(long startPosition, long length)返回一個輸入流,用于讀取該BLOB中全部或給定范圍的數據。OutputStream setBinaryStream(long startPosition) 返回一個輸出流,用于從給定位置開始寫入該BLOB。
Cloblong length()獲取該CLOB中的字符總數。String getSubString(long startPosition, long length)獲取該CLOB中給定范圍的字符。Reader getCharacterStream()Reader getCharacterStream(long startPosition, long length)返回一個讀入器(而不是流),用于讀取CLOB中全部或給定范圍的數據。Writer setCharacterStream(long startPosition) 返回一個寫出器(而不是流),用于從給定位置開始寫入該CLOB。

多結果集

   在執行存儲過程,或者在使用允許在單個查詢中提交多個SELECT語句的數據庫時,一個查詢有可能會返回多個結果集。下面是獲取所有結果集的步驟:1. 使用execute方法來執行SQL語句。2. 獲取第一個結果集或更新計數。3. 重復調用getMoreResults方法以移動到下一個結果集(這個調用會自動關閉前一個結果集)。4. 當不存在更多的結果集或更新計數時,完成操作。可滾動和更新的結果集

默認情況下,結果集是不可滾動和不可更新的。為了從查詢中獲取可滾動的結果集,必須使用以下方法得到一個不同的Statement對象

Statement sta = connect.createStatement(type,concurrenry)PreparedStatement s = connect.preparedStament(xxx,type,concurrenry)
typeTYPE_FORWARD_ONLY 結果集不能滾動TYPE_SCROLL_INSENSITIVE 結果集可以滾動,但對數據庫變化不敏感TYPE_SCROLL_SENSITIVE 結果集可以滾動,且對數據庫變化敏感
concurrenryCONCUR_READ_ONLY 結果集不能用于更新數據庫(默認值)CONCUR_UPDATABLE 結果集可以用于更新數據庫              生成了結果集之后就可以使用一些方法了set.next(),set.previous(),set.relative(n),set.absolute(n),first、 last、 beforeFirst和afterLast這些簡便方法用于將光標移動到第一行、最后一行、第一行之前或最后一行之后。最后, isFirst、 isLast、 isBeforeFirst和isAfterLast用于測試光標是否位于這些特殊位置上.

   并非所有的查詢都會返回可更新的結果集。如果查詢涉及多個表格的連接操作,那么它所產生的結果集將是不可更新的。如果查詢只涉及一個表格,或者在查詢時是使用主鍵連接多個表格的,那么它所產生的結果集將是可更新的結果集??梢哉{用ResultSet類中的getConcurrency方法來確定結果集是否是可更新的。   所有對應于SQL類型的數據類型都配有updateXxx方法,比如updateDouble,updateString等。與getXxx方法相同,在使用updateXxx方法時必須指定列的名稱或序號。然后,你可以給該字段設置新的值。updateXxx方法改變的只是結果集中的行值,而非數據庫中的值。當更新完行中的字段值后,必須調用updateRow方法,這個方法將當前行中的所有更新信息發送給數據庫。調用updateRow方法就將光標移動到其他行上,那么所有的更新信息都將被行集丟棄,而且永遠也不會被傳遞給數據庫。還可以調用cancelRowUpdates方法來取消對當前行的更新。   如果想在數據庫中添加一條新的記錄,首先需要使用moveToInsertRow方法將光標移動到特定的位置,我們稱之為插入行( insert row)。然后,調用updateXxx方法在插入行的位置上創建一個新的行。在上述操作全部完成之后,還需要調用insertRow方法將新建的行發送給數據庫。完成插入操作后,再調用moveToCurrentRow方法將光標移回到調用moveToInsertRow方法之前的位置。ResultSet類中的updateRow、 insertRow和deleteRow方法的執行效果等同于SQL命令中的UPDATE、 INSERT和DELETE。不過,習慣于Java編程語言的程序員通常會覺得使用結果集來操控數據庫要比使用SQL語句自然得多。行集

   可滾動的結果集雖然功能強大,卻有一個重要的缺陷:在與用戶的整個交互過程中,必須始終與數據庫保持連接。用戶也許會離開電腦旁很長一段時間,而在此期間卻始終占有著數據庫連接。這種方式存在很大的問題,因為數據庫連接屬于稀有資源。在這種情況下,我們可以使用行集。 RowSet接口繼承了ResultSet接口,卻無需始終保持與數據庫的連接。如下所示為javax.sql.rowset包提供的接口,它們都擴展了RowSet接口:CachedRowSet允許在斷開連接的狀態下執行相關操作。WebRowSet對象代表了一個被緩存的行集,該行集可以保存為xml文件。該文件可以移動到Web應用的其他層中,只要在該層中使用WebRowSet重新打開該文件即可。FilteredRowSet和JoinRowSet接口支持對行集的輕量級操作,它們等同于SQL中的SELECT和JOIN操作。上述兩個接口的操作對象是存儲在行集中的數據,因此運行時無需建立數據庫連接。JdbcRowSet是ResultSet接口的一個瘦包裝器。它從RowSet中繼承了get方法和set方法,從而將一個結果集轉換成一個bean。一個被緩存的行集包含了一個結果集中所有的數據。 CachedRowSet是ResultSet接口的子接口,所以你完全可以像使用結果集一樣來使用被緩存的行集。被緩存的行集有一個非常重要的優點:斷開數據庫連接后仍然可以使用行集。   甚至可以修改被緩存的行集中的數據。當然,這些修改不會立即反饋到數據庫中。相反,必須發起一個顯式的請求,以便讓數據庫真正接受所有修改。此時CachedRowSet類會重新連接到數據庫,并通過執行SQL命令向數據庫中寫入所有修改后的數據。在填充了行集之后,數據庫中的數據發生了改變,這顯然容易造成數據不一致性。為了解決這個問題,參考實現會首先檢查行集中的原始值(即修改前的值)是否與數據庫中的當前值一致。如果一致,那么修改后的值將覆蓋數據庫中的當前值。否則,將拋出SyncProviderException異常,且不向數據庫寫回任何值。

RowSetString getURL()void setURL(String url)獲取或設置數據庫的URL。String getUsername()void setUsername(String username)獲取或設置連接數據庫所需的用戶名。String getPassword()void setPassword(String password)獲取或設置連接數據庫所需的密碼。String getCommand()void setCommand(String command)獲取或設置向行集中填充數據時需要執行的命令。void execute()通過執行使用setCommand方法設置的命令集來填充行集。為了使驅動管理器可以獲得連接,必須事先設定URL、用戶名和密碼。
CachedRowSetvoid execute(Connection conn)通過執行使用setCommand方法設置的命令集來填充行集。該方法使用給定的連接,并負責關閉它。void populate(ResultSet result)將指定的結果集中的數據填充到被緩存的行集中。String getTableName()void setTableName(String tableName)獲取或設置數據庫表名稱,填充被緩存的行集時所需的數據來自于該表。int getPageSize()void setPageSize(int size)獲取和設置頁的尺寸。boolean nextPage()boolean previousPage()加載下一頁或上一頁,如果要加載的頁存在,則返回ture。void acceptChanges()void acceptChanges(Connection conn)重新連接數據庫,并寫回行集中修改過的數據。如果因為數據庫中的數據已經被修改而導致無法寫回行集中的數據,該方法可能會拋出SyncProviderException異常。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金山区| 合山市| 邹平县| 宜都市| 肥城市| 岚皋县| 卓资县| 兰溪市| 肇州县| 密云县| 汽车| 博野县| 常熟市| 白朗县| 嘉祥县| 抚州市| 海安县| 黔江区| 长顺县| 大悟县| 上蔡县| 巴林左旗| 万源市| 大埔区| 曲水县| 西华县| 铅山县| 汽车| 惠安县| 赤城县| 延长县| 通辽市| 北川| 德阳市| 长葛市| 金门县| 桐庐县| 威海市| 长宁区| 兴和县| 镇远县|