《JDBC培訓(xùn)講座》_第1頁
《JDBC培訓(xùn)講座》_第2頁
《JDBC培訓(xùn)講座》_第3頁
《JDBC培訓(xùn)講座》_第4頁
《JDBC培訓(xùn)講座》_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JDBC培訓(xùn)講座日本事業(yè)部 Copyright 863soft, 2009.編輯ppt修改歷史修改歷史2009年10月08號 作成 V1.0 JDBC概述 JDBC基礎(chǔ) 事務(wù)處理 JDBC常用API 數(shù)據(jù)庫連接池 JDBC連接各種數(shù)據(jù)庫的方法目目 錄錄編輯pptJDBCJDBC概述概述編輯ppt JDBC(Java DataBase Connectivity)稱為Java數(shù)據(jù)庫連接,它是一種用于數(shù)據(jù)庫訪問的應(yīng)用程序API,由一組用Java語言編寫的類和接口組成,有了JDBC就可以用同一的語法對多種關(guān)系數(shù)據(jù)庫進(jìn)行訪問,而不用擔(dān)心其數(shù)據(jù)庫操作語言的差異。換言之,有了JDBC,就不必為訪問Mysql

2、數(shù)據(jù)庫專門寫一個(gè)程序,為訪問Oracle又專門寫一個(gè)程序等等,只需用 JDBC寫一個(gè)程序就夠了,它可以向相應(yīng)數(shù)據(jù)庫發(fā)送sql語句。 編輯pptJDBCJDBC的優(yōu)點(diǎn)和缺點(diǎn)的優(yōu)點(diǎn)和缺點(diǎn) JDBC API用于連接Java應(yīng)用程序與各種關(guān)系數(shù)據(jù)庫。這使得人們在建立客戶/服務(wù)器應(yīng)用程序時(shí),通常把Java作為編程語言,把任何一種瀏覽器作為應(yīng)用程序的友好界面,把Internet或Intranet作為網(wǎng)絡(luò)主干,把有關(guān)的數(shù)據(jù)庫作為數(shù)據(jù)庫后端。以下是使用JDBC的優(yōu)缺點(diǎn)。 優(yōu)點(diǎn)如下:優(yōu)點(diǎn)如下: 1.JDBC API與ODBC十分相似,有利于用戶理解。 使得編程人員從復(fù)雜的驅(qū)動器調(diào)用命令和函數(shù)中解脫出來,可以致力

3、于應(yīng)用程序中的關(guān)鍵地方。編輯ppt支持不同的關(guān)系數(shù)據(jù)庫,使得程序的可移植性大大加強(qiáng)。 4.用戶可以使用JDBC-ODBC橋驅(qū)動器將JDBC函數(shù)調(diào)用轉(zhuǎn)換為ODBC。 5.JDBC API是面向?qū)ο蟮?,可以讓用戶把常用的方法封裝為一個(gè)類,備后用。 缺點(diǎn)如下:缺點(diǎn)如下: 1.使用JDBC,訪問數(shù)據(jù)記錄的速度會受到一定程度的影響。 結(jié)構(gòu)中包含了不同廠家的產(chǎn)品,這就給更改數(shù)據(jù)源帶來了很大的麻煩。 編輯pptJDBCJDBC基礎(chǔ)基礎(chǔ)編輯ppt 1 1、采用、采用JDBCJDBC訪問數(shù)據(jù)庫的基本步驟:訪問數(shù)據(jù)庫的基本步驟: A.載入JDBC驅(qū)動程序 B.定義連接URL C.建立連接 D.創(chuàng)建Statemen

4、t對象 E.執(zhí)行查詢或更新 F.結(jié)果處理 G.關(guān)閉連接 編輯ppt2 2、載入、載入JDBCJDBC驅(qū)動程序:驅(qū)動程序: (1)、為了使代碼盡可能地靈活,我們要避免對類名的引用進(jìn)行硬編碼(hard-coding),因此我們可以采用從Properties文件中載入驅(qū)動程序的方法,也可以使用在服務(wù)器中配置數(shù)據(jù)源(DataSource)的方法來避免在代碼中硬編碼 (2)、在開發(fā)過程中要保證CLASSPATH設(shè)定中包括驅(qū)動程序JAR文件所在的路徑。在WEB服務(wù)器上部署時(shí)要將JAR文件放在Web應(yīng)用的WEB-INF/lib目錄下。如果多個(gè)Web應(yīng)用使用相同的數(shù)據(jù)庫驅(qū)動程序可以將JAR文件放置在服務(wù)器使用

5、的公共目錄commonlib中編輯ppt3 3、定義連接、定義連接URLURL: 載入JDBC驅(qū)動程序之后,必須指定數(shù)據(jù)庫服務(wù)器位置。指向數(shù)據(jù)庫的URL所使用的協(xié)議是: jdbc:子協(xié)議,并且載入服務(wù)器的主機(jī)名、端口、數(shù)據(jù)庫名(或引用)。如:Oracle 的連接URL: jdbc:oracle:thin:1:1521:UMV2 jdbc:oracle:采用Oracle驅(qū)動程序 thin:指連接服務(wù)器所采用的模式 1:服務(wù)器的地址 1521:服務(wù)器的監(jiān)聽端口 UMV2:數(shù)據(jù)庫名 編輯ppt4 4、建立連接、建立連接: : (1)、一個(gè)數(shù)據(jù)庫連接(Con

6、nection)可以通過其自身的getMetaData()來獲取它的自身信息 (2)、默認(rèn)情況下一個(gè)數(shù)據(jù)庫的連接是自動提交模式的(auto-commit),也就是說每當(dāng)一個(gè)SQL語句, 被執(zhí)行后其改變結(jié)果都會被自動提交,如果auto-commit模式被關(guān)閉,那么方法commit()必須被顯式調(diào)用以提交改變結(jié)果,否則的話所有對數(shù)據(jù)庫操作的結(jié)果都不會被保存編輯ppt5 5、創(chuàng)建、創(chuàng)建StatementStatement對象對象: : 在同一時(shí)間下,每個(gè)Statement對象只能打開一個(gè)ResultSet對象。所以,假如有兩個(gè)同樣結(jié)果的結(jié)果集在交叉訪問,那么這兩個(gè)結(jié)果集必定為兩個(gè)不同的Stateme

7、nt對象所創(chuàng)建。如果在打開一個(gè)新的結(jié)果集的時(shí)候存在一個(gè)已經(jīng)打開的結(jié)果集,則這個(gè)已經(jīng)存在的結(jié)果集會被隱式的關(guān)閉。編輯ppt 6 6、執(zhí)行查詢或更新:、執(zhí)行查詢或更新: 在Statement對象中可以執(zhí)行如下的操作: A.查詢操作:executeQuery(SQL語句) B.維護(hù)操作:executeUpdate(SQL語句) C.批處理操作:executeBath() 編輯ppt7 7、結(jié)果處理:、結(jié)果處理: (1)、ResultSet中行的第一列索引為1,而非0,訪問ResultSet中的數(shù)據(jù)時(shí)要使用列名,而非索引,但要注意使用列名作為查詢條件是大小寫敏感的。 (2)、中,我們只能在Result

8、Set中向前移動;在中,我們可以在ResultSet中向下(next)或向上(previous)移動,同樣也可以移到特定的行(relative,absolute) (3)、默認(rèn)情況下ResultSet是不可更新的,且只能向前移動。下面的代碼顯示了如何創(chuàng)建一個(gè)可滾動的、對更新敏感的ResultSet Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs = stmt.executeQuery(SELECT a, b FROM

9、TABLE2); 編輯ppt (4)、ResultSet和ResultSetMetaData沒有直接提供方法返回查詢所返回的行數(shù)。然而,在中,可以通過調(diào)用last()方法將游標(biāo)定位到ResultSet的最后一行,然后調(diào)用getRow()方法獲取當(dāng)前的行號。在中,確定行數(shù)的惟一方式是重復(fù)調(diào)用ResultSet的next()方法,直到它返回false為至編輯ppt 8 8、關(guān)閉連接:、關(guān)閉連接: 在關(guān)閉數(shù)據(jù)庫連接時(shí)應(yīng)該以ResultSet、Statement、Connection的順序進(jìn)行。編輯ppt JDBCJDBCPreparedStatement(PreparedStatement(預(yù)備語句

10、預(yù)備語句) ) 1 1、PreparedStatementPreparedStatement(預(yù)備語句)的創(chuàng)建:(預(yù)備語句)的創(chuàng)建: 首先按照標(biāo)準(zhǔn)的格式創(chuàng)建參數(shù)化語句,在實(shí)際使用之前發(fā)送參數(shù)到數(shù)據(jù)庫進(jìn)行編譯。用問號表示語句中應(yīng)該為具體的值所替換的位置。每次使用預(yù)備語句時(shí),只需要使用相應(yīng)的setXxx調(diào)用,替換語句中標(biāo)記出來的參數(shù)。然后就可以和常規(guī)的語句一樣,使用executeQuery或execute/executeUpdate修改表中的數(shù)據(jù)。 編輯ppt例如: Connection connection = DriverManager .getConnection (url,username

11、,password); / 創(chuàng)建帶問號的參數(shù)化語句 String template = UPDATE music SET price=? WHERE id=? ; PreparedStatement statement=connection.prepareStatement(template); float newPrices = getNewPrices(); int recordingIDs = getIDs(); for(int i=0; irecordingIDs.length;i+)/ 用setXxx代替? statement.setFloat(1,newPricesi); stat

12、ement.setInt(2,recordingIDsi);/ 執(zhí)行預(yù)備語句 statement.execute(); 編輯ppt 2 2、使用、使用PreparedStatementPreparedStatement的好處:的好處:(1)、依賴于服務(wù)器對預(yù)編譯查詢的支持,以及驅(qū)動程序處理原始查詢的效率,預(yù)備語句在性能上的優(yōu)勢可能有很大的不同。(2)、安全是預(yù)備語句的另外一個(gè)特點(diǎn),我們推薦在通過HTML表單接受用戶輸入,然后對數(shù)據(jù)庫進(jìn)行更新時(shí),一定要使用預(yù)備語句或存儲過程。(3)、預(yù)備語句還能夠正確地處理嵌入在字符串中的引號以及處理非字符數(shù)據(jù)(比如向數(shù)據(jù)庫發(fā)送序列化后的對象) 編輯ppt JD

13、BCJDBCCallableStatement(CallableStatement(可調(diào)用語句可調(diào)用語句) ) 1 1、使用、使用CallableStatement(CallableStatement(可調(diào)用語句可調(diào)用語句) )的優(yōu)缺點(diǎn):的優(yōu)缺點(diǎn):(1)、優(yōu)點(diǎn):語法錯(cuò)誤可以在編譯時(shí)找出來,而非在運(yùn)行期間;數(shù)據(jù)庫存儲過程的運(yùn)行可能比常規(guī)的SQL查詢快得多;程序員只需知道輸入和輸出參數(shù),不需了解表的結(jié)構(gòu)。另外,由于數(shù)據(jù)庫語言能夠訪問數(shù)據(jù)庫本地的一下兒功能(序列,觸發(fā)器,多重游標(biāo)),因此用它來編寫存儲過程可能要比使用Java編程語言要簡易一些。(2)、缺點(diǎn):存儲過程的商業(yè)邏輯在數(shù)據(jù)庫服務(wù)器上運(yùn)行,而

14、非客戶機(jī)或Web服務(wù)器。而行業(yè)的發(fā)展趨勢是盡可能多地將商業(yè)邏輯移出數(shù)據(jù)庫,將它們放在JavaBean組件(或者在大型的系統(tǒng)中,EnterPrise JavaBean組件)中,在Web構(gòu)架上采用這種方式的主要?jiǎng)訖C(jī)是:數(shù)據(jù)庫訪問和網(wǎng)絡(luò)I/O常常是性能的瓶頸。編輯ppt 2 2、使用、使用CallableStatementCallableStatement在在JAVAJAVA中調(diào)用數(shù)據(jù)庫存儲過中調(diào)用數(shù)據(jù)庫存儲過程:程:(1 1)、定義對數(shù)據(jù)庫過程的調(diào)用)、定義對數(shù)據(jù)庫過程的調(diào)用 A無參數(shù)過程: call procedure_name B. 僅有輸入?yún)?shù)的過程:call procedure_name(

15、?,?.) C有一個(gè)輸出參數(shù)的過程:? Call procedure_name D既有輸入?yún)?shù)又有輸出參數(shù)的過程?=call procedure_name(?,?.) 在過程的4種形式中要注意過程可能返回多個(gè)輸出參數(shù),并且參數(shù)的索引值從輸出參數(shù)開始。因此前面最后例子中,第一個(gè)輸入?yún)?shù)的索引值是2而不是1。編輯ppt(2 2)、為過程準(zhǔn)備)、為過程準(zhǔn)備CallableStatementCallableStatement String procedure = “ ? = call procedure_name(?,?) ”; CallableStatement statement = connec

16、tion.prepareCall(procedure);(3 3)、提供輸入?yún)?shù)的值)、提供輸入?yún)?shù)的值 在執(zhí)行存儲過程之前,我們需要調(diào)用與所要設(shè)置的項(xiàng)以及參數(shù)的類型相對應(yīng)的setXxx,替換標(biāo)記出來的輸入?yún)?shù) Statement.setString(2,”name”); 編輯ppt(4 4)、注冊輸出參數(shù)的類型)、注冊輸出參數(shù)的類型 我們必須使用registerOutParameter注冊每個(gè)輸出參數(shù)的JDBC類型 Statement.registerOutParameter(n,type);(5 5)、執(zhí)行這個(gè)存儲過程)、執(zhí)行這個(gè)存儲過程 Statement.execute();(6 6)

17、、訪問返回的輸出參數(shù))、訪問返回的輸出參數(shù) 可以通過調(diào)用getXxx訪問每個(gè)對應(yīng)的輸出參數(shù)編輯ppt例:Connection connection = DriverManager.getConnection(url,username,password); String procedure = “ ? = call myProc(?,?)”; CallableStatement statement = connection.prepareCall(procedure); statement.setString(2,); statement.setFloat(3,); statement.regi

18、sterOutParameter(1,Types.INTEGER); statement.execute(); int row = statement.getInt(1); 編輯ppt 3 3、IN/OUTIN/OUT參數(shù)處理參數(shù)處理 CallableStatement 中定義的所有方法都用于處理 OUT 參數(shù)或 INOUT 參數(shù)的輸出部分:注冊 OUT 參數(shù)的 JDBC 類型(一般 SQL 類型)、從這些參數(shù)中檢索結(jié)果,或者檢查所返回的值是否為 JDBC NULL。 (1 1)、創(chuàng)建)、創(chuàng)建 CallableStatement CallableStatement 對象對象 CallableS

19、tatement 對象是用 Connection 方法 prepareCall 創(chuàng)建的。下例創(chuàng)建 CallableStatement 的實(shí)例,其中含有對已儲存過程 getTestData 調(diào)用。該過程有兩個(gè)變量,但不含結(jié)果參數(shù): CallableStatement cstmt = con.prepareCall(call getTestData(?, ?); 其中?占位符為IN、OUT還是INOUT參數(shù),取決于已儲存過程getTestData。編輯ppt(2 2)、)、ININ和和OUTOUT參數(shù)參數(shù) 將IN參數(shù)傳給 CallableStatement 對象是通過 setXXX 方法完成的。該

20、方法繼承自 PreparedStatement。所傳入?yún)?shù)的類型決定了所用的setXXX方法(例如,用 setFloat 來傳入 float 值等)。 如果已儲存過程返回 OUT 參數(shù),則在執(zhí)行 CallableStatement 對象以前必須先注冊每個(gè) OUT 參數(shù)的 JDBC 類型(這是必需的,因?yàn)槟承?DBMS 要求 JDBC 類型)。注冊 JDBC 類型是用 registerOutParameter 方法來完成的。語句執(zhí)行完后,CallableStatement 的 getXXX 方法將取回參數(shù)值。正確的 getXXX 方法是為各參數(shù)所注冊的 JDBC 類型所對應(yīng)的 Java 類型。換

21、言之, registerOutParameter 使用的是 JDBC 類型(因此它與數(shù)據(jù)庫返回的 JDBC 類型匹配),而 getXXX 將之轉(zhuǎn)換為 Java 類型。 編輯ppt作為示例,下述代碼先注冊 OUT 參數(shù),執(zhí)行由 cstmt 所調(diào)用的已儲存過程,然后檢索在 OUT 參數(shù)中返回的值。方法 getByte 從第一個(gè) OUT 參數(shù)中取出一個(gè) Java 字節(jié),而 getBigDecimal 從第二個(gè) OUT 參數(shù)中取出一個(gè) BigDecimal 對象(小數(shù)點(diǎn)后面帶三位數(shù)): CallableStatement cstmt = con.prepareCall(call getTestData

22、(?, ?); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3); cstmt.executeQuery(); byte x = cstmt.getByte(1); java.math.BigDecimal n = cstmt.getBigDecimal(2, 3); CallableStatement 與 ResultSet 不同,它不提供用增量方式檢索大 OUT 值的特殊機(jī)制。 編輯ppt(3 3)、)、INOUTIN

23、OUT參數(shù)參數(shù) 既支持輸入又接受輸出的參數(shù)(INOUT 參數(shù))除了調(diào)用 registerOutParameter 方法外,還要求調(diào)用適當(dāng)?shù)?setXXX 方法(該方法是從 PreparedStatement 繼承來的)。setXXX 方法將參數(shù)值設(shè)置為輸入?yún)?shù),而 registerOutParameter 方法將它的 JDBC 類型注冊為輸出參數(shù)。setXXX 方法提供一個(gè) Java 值,而驅(qū)動程序先把這個(gè)值轉(zhuǎn)換為 JDBC 值,然后將它送到數(shù)據(jù)庫中。這種 IN 值的 JDBC 類型和提供給 registerOutParameter 方法的 JDBC 類型應(yīng)該相同。然后,要檢索輸出值,就要用對

24、應(yīng)的 getXXX 方法。例如,Java 類型為byte 的參數(shù)應(yīng)該使用方法 setByte 來賦輸入值。應(yīng)該給registerOutParameter 提供類型為 TINYINT 的 JDBC 類型,同時(shí)應(yīng)使用 getByte 來檢索輸出值。編輯ppt 下例假設(shè)有一個(gè)已儲存過程 reviseTotal,其唯一參數(shù)是 INOUT 參數(shù)。方法setByte 把此參數(shù)設(shè)為 25,驅(qū)動程序?qū)阉鳛?JDBC TINYINT 類型送到數(shù)據(jù)庫中。接著,registerOutParameter 將該參數(shù)注冊為 JDBC TINYINT。執(zhí)行完該已儲存過程后,將返回一個(gè)新的 JDBC TINYINT 值。

25、方法 getByte 將把這個(gè)新值作為 Java byte 類型檢索。CallableStatement cstmt = con.prepareCall( call reviseTotal(?); cstmt.setByte(1, 25); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1); 編輯ppt(4 4)、先檢索結(jié)果,再檢索)、先檢索結(jié)果,再檢索 OUT OUT 參數(shù)參數(shù) 由于某些 DBMS 的限制,為了實(shí)現(xiàn)最大的可移植性,建議先

26、檢索由執(zhí)行CallableStatement 對象所產(chǎn)生的結(jié)果,然后再用 CallableStatement.getXXX 方法來檢索 OUT 參數(shù)。如果 CallableStatement 對象返回多個(gè) ResultSet 對象(通過調(diào)用 execute 方法),在檢索 OUT 參數(shù)前應(yīng)先檢索所有的結(jié)果。這種情況下,為確保對所有的結(jié)果都進(jìn)行了訪問,必須對 Statement 方法 getResultSet、getUpdateCount 和getMoreResults 進(jìn)行調(diào)用,直到不再有結(jié)果為止。檢索完所有的結(jié)果后,就可用 CallableStatement.getXXX 方法來檢索 OUT

27、 參數(shù)中的值。編輯ppt(5 5)、檢索作為)、檢索作為OUTOUT參數(shù)的參數(shù)的NULLNULL值值 返回到 OUT 參數(shù)中的值可能會是JDBC NULL。當(dāng)出現(xiàn)這種情形時(shí),將對 JDBC NULL 值進(jìn)行轉(zhuǎn)換以使 getXXX 方法所返回的值為 null、0 或 false,這取決于getXXX 方法類型。對于 ResultSet 對象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull進(jìn)行檢測。如果 getXXX 方法讀取的最后一個(gè)值是 JDBC NULL,則該方法返回 true,否則返回 flase。編輯pptJDBCJDBCTransation(Transa

28、tion(事務(wù)處理事務(wù)處理) ) 編輯ppt 1 1、Transation(Transation(事務(wù)處理事務(wù)處理) )的概念:的概念: 在更新數(shù)據(jù)庫時(shí),默認(rèn)情況下,更改是永久性寫入到數(shù)據(jù)庫。然而這種默認(rèn)行為可以通過編寫程序來關(guān)閉。在自動交付關(guān)閉的情況下,如果在更新時(shí)發(fā)生問題,則對數(shù)據(jù)庫的每個(gè)更改都能夠取消(或者說回退到最初的值)。如果更新成功,那么之后可以將這些更改永久性提交給數(shù)據(jù)庫。這種方式也稱為事務(wù)管理。 我們需要確保,要么所有的操作都發(fā)生,要么所有的操作都不發(fā)生。這就是事務(wù)管理的原則。編輯ppt 2 2、在、在JAVAJAVA中使用中使用Transation(Transation(事務(wù)

29、管理事務(wù)管理) )保證數(shù)據(jù)庫保證數(shù)據(jù)庫的完整性:的完整性: 我們使用try-catch-finally塊來正確地應(yīng)對事務(wù)管理,首先,記錄自動提交的當(dāng)前狀態(tài)。然后,在try塊中,調(diào)用setAutoCommit(false)并執(zhí)行一系列的查詢或更新。如果發(fā)生故障,則在catch塊中調(diào)用rollback;如果事務(wù)成功,則在try塊的結(jié)尾調(diào)用commit。不管哪種方式,都在finally塊中重置自動提交的狀態(tài)。例如:編輯pptConnection connection=DriverManager.getConnection(url,username,password);boolean autoComm

30、it = connection.getAutoCommit(); Statement statement; try connection.setAutoCommit(false); / 關(guān)閉數(shù)據(jù)庫的自動提交 statement = connection.createStatement(); statement.execute(); mit(); / 如果所有語句執(zhí)行成功則提交事務(wù) catch(SQLException sqle) connection.rollback(); / 如果有異常發(fā)生則回滾所有的事務(wù) 編輯pptfinally if(statement!=null)statement.

31、close(); connection.setAutoCommit(autoCommit); / 重置自動提交的狀態(tài) 上面的代碼中,從DriverManager獲取連接的語句在try/catch塊之外。這樣除非成功獲取連接,否則不會調(diào)用rollback。如果把獲取連接的語句放在try/catch快之內(nèi),一旦在連接成功后發(fā)生異常,由于rollback的作用會把已經(jīng)建立的連接斷開。但是getConnection方法也會拋出SQLException異常這個(gè)異常要么被外圍的方法重新拋出,要么在單獨(dú)的try/catch塊內(nèi)捕獲。編輯pptJDBCJDBC的常用的常用APIAPI 編輯ppt1、Conne

32、ction接口:接口:Java代碼createStatement()/創(chuàng)建數(shù)據(jù)庫連接prepareStatement(Stringsql)/創(chuàng)建預(yù)處理語句prepareCall(Stringsql)/創(chuàng)建可調(diào)用語句getAutoCommit()/獲取自動提交的模式setAutoCommit()/設(shè)置自動提交的模式commit()/提交所執(zhí)行的SQL語句rollback()/回滾所執(zhí)行的SQL語句getMetaData()/獲取一個(gè)DatabaseMetaData對象,該對象包含了有關(guān)數(shù)據(jù)庫的基本信息close()/關(guān)閉數(shù)據(jù)庫連接isClose()/判斷數(shù)據(jù)庫連接是否超時(shí)或被顯示關(guān)閉編輯ppt2

33、 2、StatementStatement接口:接口: execute(String sql) /執(zhí)行SQL語句,如果返回值是結(jié)果集則為true,否則為falseexecuteQuery(String sql) /執(zhí)行SQL語句,返回值為ResultSet executeUpdate(String sql) /執(zhí)行SQL語句,返回值為所影響的行數(shù) addBatch(String sql) /向當(dāng)前Statement對象的命令列表中添加新的批處理SQL語句 clearBatch() /清空當(dāng)前Statement對象的命令列表 executeBatch() /執(zhí)行當(dāng)前Statement對象的批處理

34、語句,返回值為每個(gè)語句所影響的函數(shù)數(shù)組 getConnection() /返回創(chuàng)建了該Statement對象的Connection對象 getQueryTimeout() /獲取等待處理結(jié)果的時(shí)間 setQueryTimeout() /設(shè)置等待處理結(jié)果的時(shí)間 編輯ppt3 3、ResultSetResultSet接口:接口:first()/beforeFirst() /將游標(biāo)移動到ResultSet中第一條記錄(的前面) last()/afterLast() /將游標(biāo)移動到ResultSet中最后一條記錄(的后面) absolute(int column) /將游標(biāo)移動到相對于第一行的指定行,

35、負(fù)數(shù)則為相對于最后一條記錄 relative(int rows) /將游標(biāo)移動到相對于當(dāng)前行的第幾行,正為向下,負(fù)為向上 next() /將游標(biāo)下移一行 previous() /將游標(biāo)上移一行 insertRow() /向當(dāng)前ResultSet和數(shù)據(jù)庫中被插入行處插入一條記錄 deleteRow() /將當(dāng)前ResultSet中的當(dāng)前行和數(shù)據(jù)庫中對應(yīng)的記錄刪除 updateRow() /用當(dāng)前ResultSet中已更新的記錄更新數(shù)據(jù)庫中對應(yīng)的記錄 cancelUpdate() /取消當(dāng)前對ResultSet和數(shù)據(jù)庫中所做的操作編輯pptfindColumn(StringcolumnName)/

36、返回當(dāng)前ResultSet中與指定列名對應(yīng)的索引getRow()/返回ResultSet中的當(dāng)前行號refreshRow()/更新當(dāng)前ResultSet中的所有記錄getMetaData()/返回描述ResultSet的ResultSetMetaData對象isAfterLast()/是否到了結(jié)尾isBeforeFirst()/是否到了開頭isFirst()/是否第一條記錄isLast()/是否最后一條記錄wasNull()/檢查列值是否為NULL值,如果列的類型為基本類型,且數(shù)據(jù)庫中的值為0,那么這項(xiàng)檢查就很重要。由于數(shù)據(jù)庫NULL也返回0,所以0值和數(shù)據(jù)庫的NULL不能區(qū)分。如果列的類型為

37、對象,可以簡單地將返回值與null比較close()/關(guān)閉當(dāng)前ResultSet編輯ppt 4 4、ResultSetMetaDataResultSetMetaData接口:接口: getColumnCount() /返回ResultSet中列的數(shù)目 getColumnName() /返回列在數(shù)據(jù)庫中的名稱 getColumnType() /返回列的SQL類型 isReadOnly() /表示該數(shù)據(jù)項(xiàng)是否為只讀值 isNullable() /表示該列是否可以存儲NULL 編輯ppt數(shù)據(jù)庫連接池編輯ppt1 1、數(shù)據(jù)庫連接池(、數(shù)據(jù)庫連接池(connection poolconnection p

38、ool)的工作原理)的工作原理 (1 1)、基本概念及原理)、基本概念及原理 JDBC作為一種數(shù)據(jù)庫訪問技術(shù),具有簡單易用的優(yōu)點(diǎn)。但使用這種模式進(jìn)行Web應(yīng)用程序開發(fā),存在很多問題:首先,每一次Web請求都要建立一次數(shù)據(jù)庫連接。建立連接是一個(gè)費(fèi)時(shí)的活動,每次都得花費(fèi)1s的時(shí)間,而且系統(tǒng)還要分配內(nèi)存資源。這個(gè)時(shí)間對于一次或幾次數(shù)據(jù)庫操作,或許感覺不出系統(tǒng)有多大的開銷??墒菍τ诂F(xiàn)在的Web應(yīng)用,尤其是大型電子商務(wù)網(wǎng)站,同時(shí)有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁的進(jìn)行數(shù)據(jù)庫連接操作勢必占用很多的系統(tǒng)資源,網(wǎng)站的響應(yīng)速度必定下降,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。不是危言聳聽,這就是制約某

39、些電子商務(wù)網(wǎng)站發(fā)展的技術(shù)瓶頸問題。 編輯ppt 其次,對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將不得不重啟數(shù)據(jù)庫。還有,這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。 數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量、使用

40、情況,為系統(tǒng)開發(fā)、測試及性能調(diào)整提供依據(jù)。 編輯ppt(2 2)、服務(wù)器自帶的連接池)、服務(wù)器自帶的連接池 JDBC的API中沒有提供連接池的方法。一些大型的WEB應(yīng)用服務(wù)器如BEA的WebLogic和IBM的WebSphere等提供了連接池的機(jī)制,但是必須有其第三方的專用類方法支持連接池的用法。 編輯ppt2 2連接池關(guān)鍵問題分析連接池關(guān)鍵問題分析(1)、并發(fā)問題為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個(gè)問題相對比較好解決,因?yàn)镴ava語言自身提供了對并發(fā)管理的 支持,使用synchronized關(guān)鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上sync

41、hronized關(guān)鍵字,如:public synchronized Connection getConnection()編輯ppt(2)、多數(shù)據(jù)庫服務(wù)器和多用戶對于大型的企業(yè)級應(yīng)用,常常需要同時(shí)連接不同的數(shù)據(jù)庫(如連接Oracle和Sybase)。如何連接不同的數(shù)據(jù)庫呢?我們采用的策略是: 設(shè)計(jì)一個(gè)符合單例模式的連接池管理類,在連接池管理類的唯一實(shí)例被創(chuàng)建時(shí)讀取一個(gè)資源文件,其中資源文件中存放著多個(gè)數(shù)據(jù)庫的url地址 ()用戶名()密碼 ()等信息。編輯ppt(3)、事務(wù)處理我們知道,事務(wù)具有原子性,此時(shí)要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即對于一組SQL語句要么全做

42、,要么全不做。在Java語言中,Connection類本身提供了對事務(wù)的支持,可以通過設(shè)置Connection的AutoCommit屬性為 false,然后顯式的調(diào)用commit或rollback方法來實(shí)現(xiàn)。但要高效的進(jìn)行Connection復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制??刹捎?每一個(gè)事務(wù)獨(dú)占一個(gè)連接來實(shí)現(xiàn),這種方法可以大大降低事務(wù)管理的復(fù)雜性。編輯ppt(4)、連接池的分配與釋放連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時(shí)還可以加快用戶的訪問速度。(5)、連接池的配置與維護(hù)連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的

43、性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConn)和最大連接數(shù)(maxConn)來控制 連接池中的連接。 編輯ppt具體的實(shí)現(xiàn)具體的實(shí)現(xiàn) javax.sql.RowSet 包添加了對緩沖數(shù)據(jù)源的支持,即可以將緩沖池緩沖的數(shù)據(jù)庫連接看作是一個(gè)是實(shí)實(shí)在在的數(shù)據(jù)源服務(wù)來使用。RowSet 包提供了好幾個(gè)接口用于處理數(shù)據(jù)庫緩沖池,主要的接口有:1、DataSource 接口:DataSource 接口的實(shí)例對象代表了存在于中間層服務(wù)器中的緩沖數(shù)據(jù)源服務(wù)。使用它可以返還數(shù)據(jù)庫緩沖池中現(xiàn)存的數(shù)據(jù)庫連接,DataSource 接口的實(shí)例對象實(shí)際上是某個(gè)JNDI 服務(wù)的提供者,在使用它之前,該JNDI 服務(wù)

44、對象必須先在中間層服務(wù)器環(huán)境中注冊,并且和某個(gè)服務(wù)名綁定在一起,然后它才能被別的Java 應(yīng)用程序調(diào)用。2、ConnectionPoolDataSource 接口:該接口可以用于創(chuàng)建一個(gè)被緩沖于緩沖池的數(shù)據(jù)庫物理連接,它有可能會被DataSource 接口的實(shí)例對象調(diào)用。3、PooledConnection 接口:該接口代表被緩沖的數(shù)據(jù)庫連接,它定義了一個(gè)getConnection()方法使用這個(gè)方法可以返回java.sql.Connection 接口的實(shí)例對象。編輯ppt在繼續(xù)連接池之前,先講一下在繼續(xù)連接池之前,先講一下JNDIJNDI概述概述 我們大家每天都不知不覺地使用了命名服務(wù)。例如

45、,當(dāng)你在web瀏覽器輸入U(xiǎn)RL,http:/ 時(shí),DNS(Domain Name System,域名系統(tǒng))將這個(gè)符號URL名轉(zhuǎn)換成通訊標(biāo)識(IP地址)。命名系統(tǒng)中的對象可以是DNS記錄中的名 稱、應(yīng)用服務(wù)器中的EJB組件(Enterprise JavaBeans Component)、 LDAP(Lightweight Directory Access Protocol)中的用戶Profile。 目錄服務(wù)是命名服務(wù)的自然擴(kuò)展。兩者之間的關(guān)鍵差別是目錄服務(wù)中對象可以有屬性(例如,用戶有email地址),而命名服務(wù)中對象沒有屬性。因此,在 目錄服務(wù)中,你可以根據(jù)屬性搜索對象。JNDI允許你訪問文件

46、系統(tǒng)中的文件,定位遠(yuǎn)程RMI注冊的對象,訪問象LDAP這樣的目錄服務(wù),定位網(wǎng)絡(luò)上的 EJB組件. 對于象LDAP 客戶端、應(yīng)用launcher、類瀏覽器、網(wǎng)絡(luò)管理實(shí)用程序,甚至地址薄這樣的應(yīng)用來說,JNDI是一個(gè)很好的選擇.編輯pptJAVAJAVA和和tomcattomcat應(yīng)用。應(yīng)用。JAVA中代碼Context ic = new InitialContext();DataSource source = (DataSource) ic .lookup(java:comp/env/jdbc/books);connection = source.getConnection();Tomcat的中

47、的配置,在根節(jié)點(diǎn)Context中加入 編輯ppt屬性名稱說明name指定Resource的JNDI名稱auth指定管理Resource的Manager(Container:由容器創(chuàng)建和管理|Application:由Web應(yīng)用創(chuàng)建和管理)type指定Resource所屬的Java類maxActive指定連接池中處于活動狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目maxIdle指定連接池中處于空閑狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目maxWait 指定連接池中的連接處于空閑的最長時(shí)間,超過這個(gè)時(shí)間會拋出異常,取值為-1,表示可以無限期等待編輯ppt補(bǔ)充:如果是Mysql的數(shù)據(jù)庫 username=ccs password=

48、secret url=jdbc:mysql:/localhost:3306/ccs driverClassName=com.mysql.jdbc.Driver maxActive=20 maxIdle=10/ 把數(shù)據(jù)庫驅(qū)動(mssqlserver2.jar)的.jar文件,加入到Tomcat的commonlib中注意:在以下的版本,還需要項(xiàng)目工程的中添加,資源引用注意:在以下的版本,還需要項(xiàng)目工程的中添加,資源引用 jdbc/books javax.sql.DataSource Container 編輯pptJDBCJDBC連接各種數(shù)據(jù)庫的方法連接各種數(shù)據(jù)庫的方法編輯ppt 下面羅列了各種數(shù)據(jù)

49、庫使用JDBC連接的方式,可以作為一個(gè)手冊使用.(1)、Oracle8/8i/9i數(shù)據(jù)庫(thin模式) Class.forName(“oracle.jdbc.driver.OracleDriver“).newInstance(); String url=“jdbc:oracle:thin:localhost:1521:orcl“; /orcl為數(shù)據(jù)庫的SID String user=“test“; String password=“test“; Connection conn= DriverManager.getConnection(url,user,password) 編輯ppt(2)、DB2數(shù)據(jù)庫 Class.forName(“com.ibm.db2.jdbc.app.DB2Driver “).newInstance(); String url=“jdbc:db2:/localhost:5000/sample“; /sample為你的數(shù)據(jù)庫名 String user=“admin“; String password=“; Connection conn= DriverManager.getC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論