




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序類型1JDBC驅(qū)動(dòng)程序共分四種類型: 類型1JDBC-ODBC橋 這種類型的驅(qū)動(dòng)把所有JDBC的調(diào)用傳遞給ODBC,再讓后者調(diào)用數(shù)據(jù)庫(kù)本地驅(qū)動(dòng)代碼(也就是數(shù)據(jù)庫(kù)廠商提供的數(shù)據(jù)庫(kù)操作二進(jìn)制代碼庫(kù),例如Oracle中的oci.dll)。 類型2本地API驅(qū)動(dòng) 這種類型的驅(qū)動(dòng)通過(guò)客戶端加載數(shù)據(jù)庫(kù)廠商提供的本地代碼庫(kù)(C/C+等)來(lái)訪問(wèn)數(shù)據(jù)庫(kù),而在驅(qū)動(dòng)程序中則包含了Java代碼。 類型3網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng) 這種類型的驅(qū)動(dòng)給客戶端提供了一個(gè)網(wǎng)絡(luò)API,客戶端上的JDBC驅(qū)動(dòng)程序使用套接字(Socket)來(lái)調(diào)用服務(wù)器上的中間件程序,后者在將其請(qǐng)求轉(zhuǎn)化為所需的具體API調(diào)用。 本地協(xié)議驅(qū)動(dòng) 這種類型的驅(qū)動(dòng)使用
2、Socket,直接在客戶端和數(shù)據(jù)庫(kù)間通信。 編輯本段API概述JDBC API主要位于JDK中的java.sql包中(之后擴(kuò)展的內(nèi)容位于javax.sql包中),主要包括(斜體代表接口,需驅(qū)動(dòng)程序提供者來(lái)具體實(shí)現(xiàn)): DriverManager:負(fù)責(zé)加載各種不同驅(qū)動(dòng)程序(Driver),并根據(jù)不同的請(qǐng)求,向調(diào)用者返回相應(yīng)的數(shù)據(jù)庫(kù)連接(Connection)。Driver:驅(qū)動(dòng)程序,會(huì)將自身加載到DriverManager中去,并處理相應(yīng)的請(qǐng)求并返回相應(yīng)的數(shù)據(jù)庫(kù)連接(Connection)。Connection:數(shù)據(jù)庫(kù)連接,負(fù)責(zé)與進(jìn)行數(shù)據(jù)庫(kù)間通訊,SQL執(zhí)行以及事務(wù)處理都是在某個(gè)特定Connec
3、tion環(huán)境中進(jìn)行的。可以產(chǎn)生用以執(zhí)行SQL的Statement。Statement:用以執(zhí)行SQL查詢和更新(針對(duì)靜態(tài)SQL語(yǔ)句和單次執(zhí)行)。PreparedStatement:用以執(zhí)行包含動(dòng)態(tài)參數(shù)的SQL查詢和更新(在服務(wù)器端編譯,允許重復(fù)執(zhí)行以提高效率)。CallableStatement:用以調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。SQLException:代表在數(shù)據(jù)庫(kù)連接的建立和關(guān)閉和SQL語(yǔ)句的執(zhí)行過(guò)程中發(fā)生了例外情況(即錯(cuò)誤)。 數(shù)據(jù)類型的映射 從SQL到Java數(shù)據(jù)類型映射的JDBC規(guī)范SQL類型Java類型CHARVARCHARLONGVARCHARNUMERICDECIMALBITbool
4、eanTINYINTbyteSMALLINTshortINTEGERintBIGINTlongREALfloatFLOATdoubleDOUBLEdoubleBINARYbyteVARBINARYbyteLONGVARBINARYbyteDATETIMETIMESTAMPBLOBCLOBArrayREFStruct注:這種類型匹配不是強(qiáng)制性標(biāo)準(zhǔn),特定的JDBC廠商可能會(huì)改變這種類型匹配。例如Oracle中的DATE類型是包含時(shí)分秒,而java.sql.Date僅僅支持年月日。 編輯本段連接方式下面羅列了各種數(shù)據(jù)庫(kù)使用JDBC連接的方式: Oracle8/8i/9i數(shù)據(jù)庫(kù)(thin模式) DB2
5、數(shù)據(jù)庫(kù) Sql Server7.0/2000數(shù)據(jù)庫(kù) Sybase數(shù)據(jù)庫(kù) Informix數(shù)據(jù)庫(kù) MySQL數(shù)據(jù)庫(kù) PostgreSQL數(shù)據(jù)庫(kù) access數(shù)據(jù)庫(kù)直連用ODBC的 編輯本段主要用途與數(shù)據(jù)庫(kù)建立連接 發(fā)送 SQL 語(yǔ)句 處理結(jié)果 編輯本段連接APIJDBC 是個(gè)"低級(jí)"接口,也就是說(shuō),它用于直接調(diào)用 SQL 命令。在這方面它的功能極佳,并比其它的數(shù)據(jù)庫(kù)連接 API 易于使用,但它同時(shí)也被設(shè)計(jì)為一種基礎(chǔ)接口,在它之上可以建立高級(jí)接口和工具。高級(jí)接口是"對(duì)用戶友好的"接口,它使用的是一種更易理解和更為方便的 API,這種API在幕后被轉(zhuǎn)換為諸如
6、JDBC 這樣的低級(jí)接口。 在關(guān)系數(shù)據(jù)庫(kù)的"對(duì)象/關(guān)系"映射中,表中的每行對(duì)應(yīng)于類的一個(gè)實(shí)例,而每列的值對(duì)應(yīng)于該實(shí)例的一個(gè)屬性。于是,程序員可直接對(duì) Java 對(duì)象進(jìn)行操作;存取數(shù)據(jù)所需的 SQL 調(diào)用將在"掩蓋下"自動(dòng)生成。此外還可提供更復(fù)雜的映射,例如將多個(gè)表中的行結(jié)合進(jìn)一個(gè) Java 類中。 隨著人們對(duì) JDBC 的興趣日益增漲,越來(lái)越多的開(kāi)發(fā)人員一直在使用基于 JDBC 的工具,以使程序的編寫(xiě)更加容易。程序員也一直在編寫(xiě)力圖使最終用戶對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)變得更為簡(jiǎn)單的應(yīng)用程序。例如應(yīng)用程序可提供一個(gè)選擇數(shù)據(jù)庫(kù)任務(wù)的菜單。任務(wù)被選定后,應(yīng)用程序?qū)⒔o出提示
7、及空白供填寫(xiě)執(zhí)行選定任務(wù)所需的信息。所需信息輸入應(yīng)用程序?qū)⒆詣?dòng)調(diào)用所需的 SQL 命令。在這樣一種程序的協(xié)助下,即使用戶根本不懂 SQL 的語(yǔ)法,也可以執(zhí)行數(shù)據(jù)庫(kù)任務(wù)。 編輯本段模式支持JDBC API 既支持?jǐn)?shù)據(jù)庫(kù)訪問(wèn)的兩層模型(C/S),同時(shí)也支持三層模型(B/S)。在兩層模型中,Java applet或應(yīng)用程序?qū)⒅苯优c數(shù)據(jù)庫(kù)進(jìn)行對(duì)話。這將需要一個(gè)JDBC驅(qū)動(dòng)程序來(lái)與所訪問(wèn)的特定數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行 通訊。用戶的SQL語(yǔ)句被送往數(shù)據(jù)庫(kù)中,而其結(jié)果將被送回給用戶。數(shù)據(jù)庫(kù)可以位于另一臺(tái)計(jì)算機(jī)上,用戶通過(guò)網(wǎng)絡(luò)連接到上面。這就叫做客戶機(jī)/服務(wù)器配置,其中用戶的計(jì)算機(jī)為客戶機(jī),提供數(shù)據(jù)庫(kù)的計(jì)算機(jī)為服務(wù)
8、器。網(wǎng)絡(luò)可以是 Intranet(它可將公司職員連接起來(lái)),也可以是 Internet。 在三層模型中,命令先是被發(fā)送到服務(wù)的"中間層",然后由它將SQL 語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)對(duì) SQL 語(yǔ)句進(jìn)行處理并將結(jié)果送回到中間層,中間層再將結(jié)果送回給用戶。MIS 主管們都發(fā)現(xiàn)三層模型很吸引人,因?yàn)榭捎弥虚g層來(lái)控制對(duì)公司數(shù)據(jù)的訪問(wèn)和可作的的更新的種類。中間層的另一個(gè)好處是,用戶可以利用易于使用的高級(jí)API,而中間層將把它轉(zhuǎn)換為相應(yīng)的低級(jí)調(diào)用。最后,許多情況下三層結(jié)構(gòu)可提供一些性能上的好處。 到目前為止,中間層通常都用 C 或 C+ 這類語(yǔ)言來(lái)編寫(xiě),這些語(yǔ)言執(zhí)行速度較快。然而,隨著
9、最優(yōu)化編譯器(它把 Java 字節(jié)代碼轉(zhuǎn)換為高效的特定于機(jī)器的代碼)的引入,用 Java 來(lái)實(shí)現(xiàn)中間層將變得越來(lái)越實(shí)際。這將是一個(gè)很大的進(jìn)步,它使人們可以充分利用 Java 的諸多優(yōu)點(diǎn)(如堅(jiān)固、多線程和安全等特征)。JDBC 對(duì)于從Java的中間層來(lái)訪問(wèn)數(shù)據(jù)庫(kù)非常重要。 編輯本段SQL 一致性結(jié)構(gòu)化查詢語(yǔ)言 (SQL) 是訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。困難之處在于:雖然大多數(shù)的 DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))對(duì)其基本功能都使用了標(biāo)準(zhǔn)形式的 SQL,但它們卻不符合最近為更高級(jí)的功能定義的標(biāo)準(zhǔn) SQL 語(yǔ)法或語(yǔ)義。例如,并非所有的數(shù)據(jù)庫(kù)都支持儲(chǔ)存程序或外部連接,那些支持這一功能的數(shù)據(jù)庫(kù)又相互不一致。人們希
10、望 SQL 中真正標(biāo)準(zhǔn)的那部份能夠進(jìn)行擴(kuò)展以包括越來(lái)越多的功能。但同時(shí) JDBC API 又必須支持現(xiàn)有的 SQL。 JDBC API 解決這個(gè)問(wèn)題的一種方法是允許將任何查詢字符串一直傳到所涉及的 DBMS 驅(qū)動(dòng)程序上。這意味著應(yīng)用程序可以使用任意多的 SQL 功能,但它必須冒這樣的風(fēng)險(xiǎn):有可能在某些 DBMS 上出錯(cuò)。事實(shí)上,應(yīng)用程序查詢甚至不一定要是 SQL,或者說(shuō)它可以是個(gè)為特定的 DBMS 設(shè)計(jì)的 SQL 的專用派生物(例如,文檔或圖象查詢)。 JDBC 處理 SQL 一致性問(wèn)題的第二種方法是提供 ODBC 風(fēng)格的轉(zhuǎn)義子句,這將在后續(xù)部分中討論。轉(zhuǎn)義語(yǔ)法為幾個(gè)常見(jiàn)的 SQL 分歧提供了
11、一種標(biāo)準(zhǔn)的 JDBC 語(yǔ)法。例如,對(duì)日期文字和已儲(chǔ)存過(guò)程的調(diào)用都有轉(zhuǎn)義語(yǔ)法。 對(duì)于復(fù)雜的應(yīng)用程序,JDBC 用第三種方法來(lái)處理 SQL 的一致性問(wèn)題它利用 DatabaseMetaData 接口來(lái)提供關(guān)于 DBMS 的描述性信息,從而使應(yīng)用程序能適應(yīng)每個(gè) DBMS 的要求和功能。 由于 JDBC API 將用作開(kāi)發(fā)高級(jí)數(shù)據(jù)庫(kù)訪問(wèn)工具和 API 的基礎(chǔ) API,因此它還必須注意其所有上層建筑的一致性。"符合JDBC標(biāo)準(zhǔn)TM" 代表用戶可依賴的 JDBC 功能的標(biāo)準(zhǔn)級(jí)別。要使用這一說(shuō)明,驅(qū)動(dòng)程序至少必須支持 ANSI SQL-2 Entry Level(ANSI SQL-2 代
12、表美國(guó)國(guó)家標(biāo)準(zhǔn)局 1992 年所采用的標(biāo)準(zhǔn)。Entry Level代表SQL功能的特定清單)。驅(qū)動(dòng)程序開(kāi)發(fā)人員可用 JDBC API 所帶的測(cè)試工具包來(lái)確定他們的驅(qū)動(dòng)程序是否符合這些標(biāo)準(zhǔn)。 "符合 JDBC 標(biāo)準(zhǔn)TM" 表示提供者的 JDBC 實(shí)現(xiàn)已經(jīng)通過(guò)了JavaSoft 提供的一致性測(cè)試。這些一致性測(cè)試將檢查 JDBC API中定義的所有類和方法是否都存在,并盡可能地檢查程序是否具有SQL Entry Level 功能。當(dāng)然,這些測(cè)試并不完全,而且 JavaSoft 目前也無(wú)意對(duì)各提供者的實(shí)現(xiàn)進(jìn)行標(biāo)級(jí)。但這種一致性定義的確可對(duì)JDBC實(shí)現(xiàn)提供一定的可信度。隨著越來(lái)越多的
13、數(shù)據(jù)庫(kù)提供者、連接提供者、Internet 提供者和應(yīng)用程序編程員對(duì) JDBC API 的接受,JDBC 也正迅速成為 Java 數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)。 編輯本段建立聯(lián)接建議鏈接的五大步驟: 1加載(注冊(cè))數(shù)據(jù)庫(kù) 2 建立鏈接 3 執(zhí)行SQL語(yǔ)句 4 處理結(jié)果集 5 關(guān)閉數(shù)據(jù)庫(kù) 教程:JDBC 入門(mén) 作者:Maydene Fisher 翻譯:comer 你需要做的第一事情是你與想要使用的 DBMS 建立一個(gè)連接。這包含 2 個(gè)步驟:裝載驅(qū)動(dòng)程序并建立連接。 裝載驅(qū)動(dòng)程序 裝載驅(qū)動(dòng)程序只需要非常簡(jiǎn)單的一行代碼。例如,你想要使用 JDBC-ODBC 橋驅(qū)動(dòng)程序,可以用下列代碼裝載它: Class.fo
14、rName("sun.jdbc.odbc.JdbcOdbcDriver"); 你的驅(qū)動(dòng)程序文檔將告訴你應(yīng)該使用的類名。例如, 如果類名是 jdbc.DriverXYZ ,你將用代碼以下的代碼裝載驅(qū)動(dòng)程序: Class.forName("jdbc.DriverXYZ"); 你不需要?jiǎng)?chuàng)建一個(gè)驅(qū)動(dòng)程序類的實(shí)例并且用 DriverManager 登記它,因?yàn)檎{(diào)用 Class.forName 將自動(dòng)將加載驅(qū)動(dòng)程序類。如果你曾自己創(chuàng)建實(shí)例,你將創(chuàng)建一個(gè)不必要的副本,但它不會(huì)帶來(lái)什么壞處。 加載 Driver 類后,它們即可用來(lái)與數(shù)據(jù)庫(kù)建立連接。 建立連接 第二步就是
15、用適當(dāng)?shù)尿?qū)動(dòng)程序類與 DBMS 建立一個(gè)連接。下列代碼是一般的做法: Connection con = DriverManager.getConnection(url,"myLogin","myPassword"); 這個(gè)步驟也非常簡(jiǎn)單,最難的是怎么提供 url。如果你正在使用 JDBC-ODBC 橋, JDBC URL 將以 jdbc:odbc 開(kāi)始:余下 URL 通常是你的數(shù)據(jù)源名字或數(shù)據(jù)庫(kù)系統(tǒng)。因此,假設(shè)你正在使用 ODBC 存取一個(gè)叫 "Fred" 的 ODBC 數(shù)據(jù)源,你的 JDBC URL 是 jdbc:odbc:Fred
16、。把 "myLogin" 及 "myPassword" 替換為你登陸 DBMS 的用戶名及口令。如果你登陸數(shù)據(jù)庫(kù)系統(tǒng)的用戶名為 "Fernanda" 口令為 "J8",只需下面的 2 行代碼就可以建立一個(gè)連接: String url = "jdbc:odbc:Fred" Connection con = DriverManager.getConnection(url,"Fernanda","J8"); 如果你使用的是第三方開(kāi)發(fā)了的 JDBC驅(qū)動(dòng)程序,文檔將
17、告訴你該使用什么 subprotocol, 就是在 JDBC URL 中放在 jdbc 后面的部分。例如,如果驅(qū)動(dòng)程序開(kāi)發(fā)者注冊(cè)了 acme 作為 subprotocol, JDBC URL 的第一和第二部分將是 jdbc:acme。驅(qū)動(dòng)程序文檔也會(huì)告訴你余下 JDBC URL 的格式。JDBC URL 最后一部分提供了定位數(shù)據(jù)庫(kù)的信息。 如果你裝載的驅(qū)動(dòng)程序識(shí)別了提供給 DriverManager.getConnection 的 JDBC URL ,那個(gè)驅(qū)動(dòng)程序?qū)⒏鶕?jù) JDBC URL 建立一個(gè)到指定 DBMS 的連接。正如名稱所示,DriverManager 類在幕后為你管理建立連接的所有
18、細(xì)節(jié)。除非你是正在寫(xiě)驅(qū)動(dòng)程序,你可能無(wú)需使用此類的其它任何方法,一般程序員需要在此類中直接使用的唯一方法是 DriverManager.getConnection。 DriverManager.getConnection 方法返回一個(gè)打開(kāi)的連接,你可以使用此連接創(chuàng)建 JDBC statements 并發(fā)送 SQL 語(yǔ)句到數(shù)據(jù)庫(kù)。在前面的例子里,con 對(duì)象是一個(gè)打開(kāi)的連接,并且我們要在以后的例子里使用它。 設(shè)置表 創(chuàng)建表 首先,我們?cè)谖覀兊氖纠龜?shù)據(jù)庫(kù)創(chuàng)建其中一張表 COFFEES,包含在咖啡店所賣咖啡的必要的信息,包括咖啡名字,他們的價(jià)格,本星期賣了多少磅及迄今為止賣的數(shù)目。 另外,我們應(yīng)該指
19、出的的是 SQL 語(yǔ)句的格式。在 CREATE TABLE 語(yǔ)句中,關(guān)鍵字采用大寫(xiě)字符,并且每個(gè)項(xiàng)目都另起一行。SQL 并沒(méi)有此要求;僅僅是為了更容易閱讀。SQL 標(biāo)準(zhǔn)是不區(qū)分關(guān)鍵詞的大小寫(xiě)的, 然而,引號(hào)里的內(nèi)容是區(qū)分大小寫(xiě)的:在名字"Washington" 里 "W" 必須被大寫(xiě),并且余下的字符必須是小寫(xiě)的。 對(duì)于標(biāo)識(shí),不同的 DBMS 有不同的要求,例如,某些 DBMSs 要求那些列名及表名必須跟創(chuàng)建時(shí)的一樣,有些則沒(méi)有此要求。為安全起見(jiàn),我們?nèi)渴褂么髮?xiě)標(biāo)識(shí)如 COFFEES、SUPPLIERS,因?yàn)槲覀兪悄菢佣x他們的。 到止我們寫(xiě)了創(chuàng)建 CO
20、FFEES 表的 SQL 語(yǔ)句?,F(xiàn)在我們?cè)谒饷婕由弦?hào)(使它成為字符串),并且字符串賦值給變量 createTableCoffees,在以后的 JDBC 代碼中我們可以使用此變量。正如看到的,DBMS 并不在意分行,但對(duì) Java 語(yǔ)言來(lái),String 對(duì)象分行是通不過(guò)編譯的。因而,我們可以用加號(hào) (+) 把每一行的串連接。 String createTableCoffees = "CREATE TABLE COFFEES " + "(COF_NAME VARCHAR(32),SUP_ID INTEGER,PRICE FLOAT," + "S
21、ALES INTEGER,TOTAL INTEGER)" 我們?cè)?CREATE TABLE 語(yǔ)句中使用的數(shù)據(jù)類型是通用的 SQL 類型(也稱 JDBC 類型)它們?cè)陬?java.sql.Types 中定義。DBMSs 通常使用這些標(biāo)準(zhǔn)的類型,因此,當(dāng)你要嘗試一些 JDBC 應(yīng)用程序時(shí),你可以直接使用 CreateCoffees.java 應(yīng)用程序,它使用了 CREATE TABLE 語(yǔ)句。如果你的 DBMS 使用了它的自己的本地的類型名字,我們?yōu)槟愎?yīng)其它的應(yīng)用程序,我們將在后面詳細(xì)解釋。 在運(yùn)用任何應(yīng)用程序前,當(dāng)然,我們將讓你了解 JDBC 的基礎(chǔ)。 創(chuàng)建 JDBC Stateme
22、nts 對(duì)象 Statement 對(duì)象用于把 SQL 語(yǔ)句發(fā)送到 DBMS。你只須簡(jiǎn)單地創(chuàng)建一個(gè) Statement 對(duì)象并且然后執(zhí)行它,使用適當(dāng)?shù)姆椒▓?zhí)行你發(fā)送的 SQL 語(yǔ)句。對(duì) SELECT 語(yǔ)句來(lái)說(shuō),可以使用 executeQuery。要?jiǎng)?chuàng)建或修改表的語(yǔ)句,使用的方法是 executeUpdate。 需要一個(gè)活躍的連接的來(lái)創(chuàng)建 Statement 對(duì)象的實(shí)例。在下面的例子中,我們使用我們的 Connection 對(duì)象 con 創(chuàng)建 Statement 對(duì)象 stmt: Statement stmt = con.createStatement(); 到此 stmt 已經(jīng)存在了,但它還沒(méi)有
23、把 SQL 語(yǔ)句傳遞到 DBMS。我們需要提供 SQL 語(yǔ)句作為參數(shù)提供給我們使用的 Statement 的方法。例如,在下面的代碼段里,我們使用上面例子中的 SQL 語(yǔ)句作為 executeUpdate 的參數(shù): stmt.executeUpdate("CREATE TABLE COFFEES " + "(COF_NAME VARCHAR(32),SUP_ID INTEGER,PRICE FLOAT," + "SALES INTEGER,TOTAL INTEGER)"); 因?yàn)槲覀円呀?jīng)把 SQL 語(yǔ)句賦給了 createTableC
24、offees 變量,我們可以如下方式書(shū)寫(xiě)代碼: stmt.executeUpdate(createTableCoffees); 執(zhí)行語(yǔ)句 我們使用 executeUpdate 方法是因?yàn)樵?createTableCoffees 中的 SQL 語(yǔ)句是 DDL (數(shù)據(jù)定義語(yǔ)言)語(yǔ)句。創(chuàng)建表,改變表,刪除表都是 DDL 語(yǔ)句的例子,要用 executeUpdate 方法來(lái)執(zhí)行。你也可以從它的名字里看出,方法 executeUpdate 也被用于執(zhí)行更新表 SQL 語(yǔ)句。實(shí)際上,相對(duì)于創(chuàng)建表來(lái)說(shuō),executeUpdate 用于更新表的時(shí)間更多,因?yàn)楸碇恍枰獎(jiǎng)?chuàng)建一次,但經(jīng)常被更新。 被使用最多的執(zhí)行
25、SQL 語(yǔ)句的方法是 executeQuery。這個(gè)方法被用來(lái)執(zhí)行 SELECT 語(yǔ)句,它幾乎是使用最多的 SQL 語(yǔ)句。馬上你將看到如何使用這個(gè)方法。 在表中輸入數(shù)據(jù) 我們已經(jīng)顯示了如何通過(guò)指定列名、數(shù)據(jù)類型來(lái)創(chuàng)建表 COFFEES,但是這僅僅建立表的結(jié)構(gòu)。表還沒(méi)有任何數(shù)據(jù)。我們將次輸入一行數(shù)據(jù)到表中,提供每列的信息,注意插入的數(shù)據(jù)顯示順序跟表創(chuàng)建時(shí)候是一樣的,既缺省順序。 下列代碼插入一個(gè)行數(shù)據(jù),COF_NAME 的值為 Colombian,SUP_ID 為 101,PRICE 為 7.99,SALES 0,TOTAL 0。就象創(chuàng)建 COFFEES 表一樣,我們創(chuàng)建一 Statement
26、對(duì)象,并執(zhí)行 executeUpdate 方法。 因?yàn)?SQL 語(yǔ)句一行顯示不下,因此我們把它分為兩行,并用加號(hào) (+) 相連。特別要注意的是,在 COFFEES 和 VALUES 之間要有空格。這個(gè)空格必須在引號(hào)之內(nèi)并且要在 COFFEES 跟 VALUES 之間;沒(méi)有這個(gè)空格,SQL 語(yǔ)句將被錯(cuò)誤地被讀作為 "INSERT INTO COFFEESVALUES .",并且 DBMS 將尋找表 COFFEESVALUES。還要注意的是在 coffee name 上我們使用了單引號(hào)。 Statement stmt = con.createStatement(); stmt.
27、executeUpdate( "INSERT INTO COFFEES " + "VALUES ('Colombian',101,7.99,0,0)"); 下面的代碼把第二行插入到表 COFFEES 中。我們可以在使用 Statement 對(duì)象而無(wú)須為每次執(zhí)行創(chuàng)建一個(gè)新的。 stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('French_Roast',49,8.99,0,0)"); 剩下行的數(shù)據(jù)如下: stmt.execute
28、Update("INSERT INTO COFFEES " + "VALUES ('Espresso',150,9.99,0,0)"); stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('Colombian_Decaf',101,8.99,0,0)"); stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('French_Roast_D
29、ecaf',49,9.99,0,0)"); 從表中取得數(shù)據(jù) 既然表 COFFEES 中已經(jīng)有數(shù)據(jù)了,我們就可以寫(xiě)一個(gè) SELECT 語(yǔ)句來(lái)取得這些值。下面的 SQL 語(yǔ)句中星號(hào) (*) 表示選擇所有的列。因?yàn)闆](méi)有用 WHERE 子句來(lái)限制所選的行,因此下面的 SQL 語(yǔ)句選擇的是整個(gè)表。 SELECT * FROM COFFEES 結(jié)果是整個(gè)表的數(shù)據(jù),如下: COF_NAME SUP_ID PRICE SALES TOTAL - - - - - Colombian 101 7.99 0 0 French_Roast 49 8.99 0 0 Espresso 150 9.99
30、0 0 Colombian_Decaf 101 8.99 0 0 French_Roast_Decaf 49 9.99 0 0 如果你直接在數(shù)據(jù)庫(kù)系統(tǒng)里輸入 SQL 查詢語(yǔ)句,你將在你的終端上看到如上的結(jié)果。當(dāng)我們通過(guò)一個(gè) Java 應(yīng)用程序存取一個(gè)數(shù)據(jù)庫(kù)時(shí),正如我們馬上要做的一樣,我們需要檢索結(jié)果以便我們能使用他們。你將在下一節(jié)看到如何實(shí)現(xiàn)。 這是 SELECT 語(yǔ)句的另一個(gè)例子,這將得到咖啡及其各自每磅單價(jià)的列表。 SELECT COF_NAME,PRICE FROM COFFEES 查詢的結(jié)果集將具有如下形式: COF_NAME PRICE - - - Colombian 7.99 Fr
31、ench_Roast 8.99 Espresso 9.99 Colombian_Decaf 8.99 French_Roast_Decaf 9.99 上面 SELECT 語(yǔ)句取得了所有咖啡的名字及價(jià)格。而下面的 SELECT 語(yǔ)句限制那些每磅價(jià)格低于 $9.00 的咖啡才被選擇。 SELECT COF_NAME,PRICE FROM COFFEES WHERE PRICE < 9.00 結(jié)果集將具有如下形式: COF_NAME PRICE - - - Colombian 7.99 French_Roast 8.99 Colombian Decaf 8.99 JDBC 入門(mén) - 開(kāi)始 你需
32、要做的第一事情是你要正確的安裝。這包含下列幾個(gè)步驟: 在你的計(jì)算機(jī)上安裝 Java 和 JDBC Java 數(shù)據(jù)庫(kù)連接 (JDBC) 是一個(gè)標(biāo)準(zhǔn) SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)數(shù)據(jù)庫(kù)訪問(wèn)接口,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn)。JDBC(Java DataBaseConnection,Java 數(shù)據(jù)庫(kù)連接) 也提供一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口。目前的 JDK(Java Development Kit,Java 開(kāi)發(fā)工具包)軟件捆綁包括 JDBC 和 JDBC-ODBC(Open DataBase Connection,開(kāi)放式數(shù)據(jù)庫(kù)連接)橋
33、。這些包也可獨(dú)立得到,以跟 JDK 1.0 一起使用。應(yīng)該注意的是,本文的示例使用了 JDBC 2.0 接口,需要 JDK 2.0 來(lái)運(yùn)行,不能在 JDK 1.1 下運(yùn)行。 你的驅(qū)動(dòng)程序應(yīng)該有安裝方法。為特定的 DBMSs 寫(xiě)的 JDBC 驅(qū)動(dòng)程序安裝時(shí)只要拷貝到你的計(jì)算機(jī)上就可以了。并不需要特殊的配置。 如果你下載的是 Solaris 或 Windows JDK1.1 版本,橋作為包 sun.jdbc.odbc 與 JDK 一起自動(dòng)安裝。有關(guān)安裝和配置 ODBC 的信息,請(qǐng)咨詢 ODBC 驅(qū)動(dòng)程序廠商。橋無(wú)須特殊配置。有關(guān)客戶機(jī)安裝和配置信息,請(qǐng)咨詢數(shù)據(jù)庫(kù)廠商。 如果需要,安裝數(shù)據(jù)庫(kù)系統(tǒng) 如
34、果你不能確認(rèn)是否安裝了數(shù)據(jù)庫(kù)系統(tǒng),你需要按照供應(yīng)商的要求安裝數(shù)據(jù)庫(kù)。大多數(shù)用戶都已經(jīng)安裝了數(shù)據(jù)庫(kù),可繼續(xù)使用他們安裝好的數(shù)據(jù)庫(kù)。 配置數(shù)據(jù)庫(kù) 我們假設(shè)數(shù)據(jù)庫(kù) COFFEEBREAK 已經(jīng)存在。(創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)并不困難,但需要一定的權(quán)限并通常是由數(shù)據(jù)庫(kù)管理員來(lái)做)你還需要在此數(shù)據(jù)庫(kù)里創(chuàng)建本教程作為例子使用的表。我們有意限制表的大小跟及數(shù)目,以便于管理。 假設(shè)我們的數(shù)據(jù)庫(kù)是在一個(gè)咖啡館里使用, 咖啡豆按磅賣,而咖啡則以杯為單位。為了簡(jiǎn)單起見(jiàn),還假定經(jīng)營(yíng)者只需要 2 張表,分別存放不同種類的咖啡及咖啡供應(yīng)商的有關(guān)信息。 首先我們演示怎么打開(kāi)一個(gè) DBMS 連接, 及 JDBC 是怎么發(fā)送 SQL 語(yǔ)
35、句到你的 DBMS。通過(guò)這些代碼,我們將表明使用 JDBC 傳遞 SQL 語(yǔ)句到你的 DBMS 并處理返回的結(jié)果是非常簡(jiǎn)單的。 所有的代碼在主要的幾個(gè) DBMS 產(chǎn)品做了測(cè)試。然而,如果你使用 JDBC-ODBC 橋來(lái)連接舊版本 ODBC 驅(qū)動(dòng)程序時(shí),可能會(huì)遇到一些兼容性問(wèn)題。 編輯本段合理選擇有關(guān)JDBC最新的信息,有興趣的讀者可以查閱JDBC的官方網(wǎng)站-即JavaSoft的主頁(yè), JavaSoft框架 JavaSoft提供三種JDBC產(chǎn)品組件,它們是Java開(kāi)發(fā)工具包(JDK)的組成部份:JDBC驅(qū)動(dòng)程序管理器、JDBC驅(qū)動(dòng)程序測(cè)試工具包和JDBC-ODBC橋。 JDBC驅(qū)動(dòng)程序管理器是J
36、DBC體系結(jié)構(gòu)的支柱。它實(shí)際上很小,也很簡(jiǎn)單;其主要作用是把Java應(yīng)用程序連接到正確的JDBC驅(qū)動(dòng)程序上,然后即退出。 JDBC驅(qū)動(dòng)程序測(cè)試工具包為使JDBC驅(qū)動(dòng)程序運(yùn)行您的程序提供一定的可信度。只有通過(guò)JDBC驅(qū)動(dòng)程序測(cè)試的驅(qū)動(dòng)程序才被認(rèn)為是符合JDBC標(biāo)準(zhǔn)TM的。 JDBC-ODBC橋使ODBC驅(qū)動(dòng)程序可被用作JDBC驅(qū)動(dòng)程序。它的實(shí)現(xiàn)為JDBC的快速發(fā)展提供了一條途徑,其長(zhǎng)遠(yuǎn)目標(biāo)提供一種訪問(wèn)某些不常見(jiàn)的DBMS(如果對(duì)這些不常見(jiàn)的DBMS未實(shí)現(xiàn)JDBC)的方法。 JDBC驅(qū)動(dòng)程序的類型 目前比較常見(jiàn)的JDBC驅(qū)動(dòng)程序可分為以下四個(gè)種類: JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序 Java
37、Soft橋產(chǎn)品利用ODBC驅(qū)動(dòng)程序提供JDBC訪問(wèn)。注意,必須將ODBC二進(jìn)制代碼(許多情況下還包括數(shù)據(jù)庫(kù)客戶機(jī)代碼)加載到使用該驅(qū)動(dòng)程序的每個(gè)客戶機(jī)上。因此,這種類型的驅(qū)動(dòng)程序最適合于企業(yè)網(wǎng)(這種網(wǎng)絡(luò)上客戶機(jī)的安裝不是主要問(wèn)題),或者是用Java編寫(xiě)的三層結(jié)構(gòu)的應(yīng)用程序服務(wù)器代碼。 本地API 這種類型的驅(qū)動(dòng)程序把客戶機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其它DBMS的調(diào)用。注意,象橋驅(qū)動(dòng)程序一樣,這種類型的驅(qū)動(dòng)程序要求將某些二進(jìn)制代碼加載到每臺(tái)客戶機(jī)上。 JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序 這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議,之后
38、這種協(xié)議又被某個(gè)服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上。所用的具體協(xié)議取決于提供者。通常,這是最為靈活的JDBC驅(qū)動(dòng)程序。有可能所有這種解決方案的提供者都提供適合于Intranet用的產(chǎn)品。為b所提出的安全性、通過(guò)防火墻的訪問(wèn)等方面的額外要求。幾家提供者正將JDBC驅(qū)動(dòng)程序加到他們現(xiàn)有的數(shù)據(jù)庫(kù)中間件產(chǎn)品中。 本地協(xié)議純Java驅(qū)動(dòng)程序 這種類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許從客戶機(jī)機(jī)器上直接調(diào)用DBMS服務(wù)器,是Intranet訪問(wèn)的一個(gè)很實(shí)用的解決方法。由于許多這樣的協(xié)議都是專用的,因此數(shù)據(jù)庫(kù)
39、提供者自己將是主要來(lái)源,有幾家提供者已在著手做這件事了。 據(jù)專家預(yù)計(jì)第、類驅(qū)動(dòng)程序?qū)⒊蔀閺腏DBC訪問(wèn)數(shù)據(jù)庫(kù)的首方法。第、類驅(qū)動(dòng)程序在直接的純Java驅(qū)動(dòng)程序還沒(méi)有上市前會(huì)作為過(guò)渡方案來(lái)使用。對(duì)第、類驅(qū)動(dòng)程序可能會(huì)有一些變種,這些變種要求有連接器,但通常這些是更加不可取的解決方案。第、類驅(qū)動(dòng)程序提供了Java的所有優(yōu)點(diǎn),包括自動(dòng)安裝(例如,通過(guò)使用JDBC驅(qū)動(dòng)程序的appletapplet來(lái)下載該驅(qū)動(dòng)程序)。 JDBC驅(qū)動(dòng)程序的獲取 目前已有幾十個(gè)類的驅(qū)動(dòng)程序,即可與Javasoft橋聯(lián)合使用的ODBC驅(qū)動(dòng)程序的驅(qū)動(dòng)程序。有大約十多個(gè)屬于種類的驅(qū)動(dòng)程序是以DBMS的本地API為基礎(chǔ)編寫(xiě)的。只有
40、幾個(gè)屬于種類的驅(qū)動(dòng)程序,其首批提供者是SCO、OpenHorizon、Visigenic和WebLogic。此外,JavaSoft和數(shù)據(jù)庫(kù)連接的領(lǐng)先提供者Intersolv還合作研制了JDBC-ODBC橋和JDBC驅(qū)動(dòng)程序測(cè)試工具包。 編輯本段建立連接Connection 對(duì)象代表與數(shù)據(jù)庫(kù)的連接。連接過(guò)程包括所執(zhí)行的 SQL 語(yǔ)句和在該連接上所返回的結(jié)果。一個(gè)應(yīng)用程序可與單個(gè)數(shù)據(jù)庫(kù)有一個(gè)或多個(gè)連接,或者可與許多數(shù)據(jù)庫(kù)有連接。 打開(kāi)連接 與數(shù)據(jù)庫(kù)建立連接的標(biāo)準(zhǔn)方法是調(diào)用DriverManager.getConnection方法。該方法接受含有某個(gè)URL的字符串。DriverManager類(即所
41、謂的JDBC管理層)將嘗試找到可與那個(gè)URL所代表的數(shù)據(jù)庫(kù)進(jìn)行連接的驅(qū)動(dòng)程序。DriverManager類存有已注冊(cè)的Driver類的清單。當(dāng)調(diào)用方法getConnection時(shí),它將檢查清單中的每個(gè)驅(qū)動(dòng)程序,直到找到可與URL中指定的數(shù)據(jù)庫(kù)進(jìn)行連接的驅(qū)動(dòng)程序?yàn)橹埂river的方法connect使用這個(gè)URL來(lái)建立實(shí)際的連接。 用戶可繞過(guò)JDBC管理層直接調(diào)用Driver方法。這在以下特殊情況下將很有用:當(dāng)兩個(gè)驅(qū)動(dòng)器可同時(shí)連接到數(shù)據(jù)庫(kù)中,而用戶需要明確地選用其中特定的驅(qū)動(dòng)器。但一般情況下,讓DriverManager類處理打開(kāi)連接這種事將更為簡(jiǎn)單。 下述代碼顯示如何打開(kāi)一個(gè)與位于URL&qu
42、ot;jdbc:odbc:wombat"的數(shù)據(jù)庫(kù)的連接。所用的用戶標(biāo)識(shí)符為"freely",口令為"ec": String url = "jdbc:odbc:wombat"; Connection con = DriverManager.getConnection(url, "freely", "ec"); 一般用法的URL 由于URL常引起混淆,我們將先對(duì)一般URL作簡(jiǎn)單說(shuō)明,然后再討論JDBCURL。URL(統(tǒng)一資源定位符)提供在Internet上定位資源所需的信息??蓪⑺胂鬄橐?/p>
43、個(gè)地址。URL的第一部份指定了訪問(wèn)信息所用的協(xié)議,后面總是跟著冒號(hào)。常用的協(xié)議有"ftp"(代表"文件傳輸協(xié)議")和"http"(代表"超文本傳輸協(xié)議")。如果協(xié)議是"file",表示資源是在某個(gè)本地文件系統(tǒng)上而非在Internet上(下例用于表示我們所描述的部分;它并非URL的組成部分)。 URL的其余部份(冒號(hào)后面的)給出了數(shù)據(jù)資源所處位置的有關(guān)信息。如果協(xié)議是file,則URL的其余部份是文件的路徑。對(duì)于ftp和http協(xié)議,URL的其余部份標(biāo)識(shí)了主機(jī)并可選地給出某個(gè)更詳盡的地址路徑。例如
44、,以下是JavaSoft主頁(yè)的URL。該URL只標(biāo)識(shí)了主機(jī):從該主頁(yè)開(kāi)始瀏覽,就可以進(jìn)到許多其它的網(wǎng)頁(yè)中,其中之一就是JDBC主頁(yè)。 JDBC URL JDBC URL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能識(shí)別該數(shù)據(jù)庫(kù)并與之建立連接。實(shí)際上,驅(qū)動(dòng)程序編程員將決定用什么JDBC URL來(lái)標(biāo)識(shí)特定的驅(qū)動(dòng)程序。用戶不必關(guān)心如何來(lái)形成JDBC URL;他們只須使用與所用的驅(qū)動(dòng)程序一起提供的URL即可。JDBC的作用是提供某些約定,驅(qū)動(dòng)程序編程員在構(gòu)造他們的JDBC URL時(shí)應(yīng)該遵循這些約定。 由于JDBC URL要與各種不同的驅(qū)動(dòng)程序一起使用,因此這些約定應(yīng)非常靈活。首先,它們應(yīng)允許不同的
45、驅(qū)動(dòng)程序使用不同的方案來(lái)命名數(shù)據(jù)庫(kù)。例如,odbc子協(xié)議允許(但并不是要求)URL含有屬性值。 其次,JDBC URL應(yīng)允許驅(qū)動(dòng)程序編程員將一切所需的信息編入其中。這樣就可以讓要與給定數(shù)據(jù)庫(kù)對(duì)話的applet打開(kāi)數(shù)據(jù)庫(kù)連接,而無(wú)須要求用戶去做任何系統(tǒng)管理工作。 最后,JDBC URL應(yīng)允許某種程度的間接性。也就是說(shuō),JDBC URL可指向邏輯主機(jī)或數(shù)據(jù)庫(kù)名,而這種邏輯主機(jī)或數(shù)據(jù)庫(kù)名將由網(wǎng)絡(luò)命名系統(tǒng)動(dòng)態(tài)地轉(zhuǎn)換為實(shí)際的名稱。這可以使系統(tǒng)管理員不必將特定主機(jī)聲明為JDBC名稱的一部份。網(wǎng)絡(luò)命名服務(wù)(例如DNS、NIS和DCE)有多種,而對(duì)于使用哪種命名服務(wù)并無(wú)限制。 JDBC URL的標(biāo)準(zhǔn)語(yǔ)法如下所
46、示。它由三部分組成,各部分間用冒號(hào)分隔: jdbc:<;協(xié)議:子協(xié)議:子名稱> JDBC URL的三個(gè)部分可分解如下: jdbc協(xié)議:JDBC URL中的協(xié)議總是jdbc。 <;子協(xié)議>;:驅(qū)動(dòng)程序名或數(shù)據(jù)庫(kù)連接機(jī)制(這種機(jī)制可由一個(gè)或多個(gè)驅(qū)動(dòng)程序支持)的名稱。子協(xié)議名的典型示例是"odbc",該名稱是為用于指定ODBC風(fēng)格的數(shù)據(jù)資源名稱的URL專門(mén)保留的。例如,為了通過(guò)JDBC-ODBC橋來(lái)訪問(wèn)某個(gè)數(shù)據(jù)庫(kù),可以用如下所示的URL:jdbc:odbc:book。本例中,子協(xié)議為"odbc",子名稱"book"是
47、本地ODBC數(shù)據(jù)資源。如果要用網(wǎng)絡(luò)命名服務(wù)(這樣JDBC URL中的數(shù)據(jù)庫(kù)名稱不必是實(shí)際名稱),則命名服務(wù)可以作為子協(xié)議。例如,可用如下所示的URL:jdbc:dcenaming:accounts。本例中,該URL指定了本地DCE命名服務(wù)應(yīng)該將數(shù)據(jù)庫(kù)名稱"accounts"解析為更為具體的可用于連接真實(shí)數(shù)據(jù)庫(kù)的名稱。 <;子名稱>;:種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依不同的子協(xié)議而變化。它還可以有子名稱的子名稱(含有驅(qū)動(dòng)程序編程員所選的任何內(nèi)部語(yǔ)法)。使用子名稱的目的是為定位數(shù)據(jù)庫(kù)提供足夠的信息。前例中,因?yàn)镺DBC將提供其余部份的信息,因此用"book
48、"就已足夠。然而,位于遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)需要更多的信息。例如,如果數(shù)據(jù)庫(kù)是通過(guò)Internet來(lái)訪問(wèn)的,則在JDBC URL中應(yīng)將網(wǎng)絡(luò)地址作為子名稱的一部份包括進(jìn)去,且必須遵循如下所示的標(biāo)準(zhǔn)URL命名約定:/主機(jī)名:端口/子協(xié)議。 假設(shè)"dbnet"是個(gè)用于將某個(gè)主機(jī)連接到Internet上的協(xié)議,則JDBC URL應(yīng)為:jdbc:dbnet:/wombat:356/fred。 "odbc"子協(xié)議 子協(xié)議odbc是一種特殊情況。它是為用于指定ODBC風(fēng)格的數(shù)據(jù)資源名稱的URL而保留的,并具有下列特性:允許在子名稱(數(shù)據(jù)資源名稱)后面指定任意多
49、個(gè)屬性值。odbc子協(xié)議的完整語(yǔ)法為: jdbc:odbc:<;數(shù)據(jù)資源名稱>;【;<;屬性名>=<;屬性值>;】,因此,以下都是合法的jdbc:odbc名稱: jdbc:odbc:qeor7 jdbc:odbc:wombat jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER jdbc:odbc:qeora;UID=kgh;PWD=fooey 注?稱以將之用作JDBC URL的子協(xié)議名。當(dāng)DriverManager類將此名稱加到已注冊(cè)的驅(qū)動(dòng)程序清單中時(shí),為之保留該名稱的驅(qū)動(dòng)程序應(yīng)能識(shí)別該名稱并與它所標(biāo)識(shí)的數(shù)據(jù)
50、庫(kù)建立連接。例如,odbc是為JDBC-ODBC橋而保留的。假設(shè)有個(gè)Miracle公司,它可能會(huì)將"miracle"注冊(cè)為連接到其Miracle DBMS上的JDBC驅(qū)動(dòng)程序的子協(xié)議,從而使其他人都無(wú)法使用這個(gè)名稱。 JavaSoft目前作為非正式代理負(fù)責(zé)注冊(cè)JDBC子協(xié)議名稱。 發(fā)送SQL語(yǔ)句 連接一旦建立,就可用來(lái)向它所涉及的數(shù)據(jù)庫(kù)傳送SQL語(yǔ)句。JDBC對(duì)可被發(fā)送的SQL語(yǔ)句類型不加任何限制。這就提供了很大的靈活性,即允許使用特定的數(shù)據(jù)庫(kù)語(yǔ)句或甚至于非SQL語(yǔ)句。然而,它要求用戶自己負(fù)責(zé)確保所涉及的數(shù)據(jù)庫(kù)可以處理所發(fā)送的SQL語(yǔ)句,否則將自食其果。例如,如果某個(gè)應(yīng)用程
51、序試圖向不支持儲(chǔ)存程序的DBMS發(fā)送儲(chǔ)存程序調(diào)用,就會(huì)失敗并將拋出異常。JDBC要求驅(qū)動(dòng)程序應(yīng)至少能提供ANSI SQL-2 Entry Level功能才可算是符合JDBC標(biāo)準(zhǔn)TM的。這意味著用戶至少可信賴這一標(biāo)準(zhǔn)級(jí)別的功能。 JDBC提供了三個(gè)類,用于向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。Connection接口中的三個(gè)方法可用于創(chuàng)建這些類的實(shí)例。下面列出這些類及其創(chuàng)建方法: Statement:由方法createStatement所創(chuàng)建。Statement對(duì)象用于發(fā)送簡(jiǎn)單的SQL語(yǔ)句。 PreparedStatement:由方法prepareStatement所創(chuàng)建。PreparedStatement對(duì)
52、象用于發(fā)送帶有一個(gè)或多個(gè)輸入?yún)?shù)(IN參數(shù))的SQL語(yǔ)句。PreparedStatement擁有一組方法,用于設(shè)置IN參數(shù)的值。執(zhí)行語(yǔ)句時(shí),這些IN參數(shù)將被送到數(shù)據(jù)庫(kù)中。PreparedStatement的實(shí)例擴(kuò)展了Statement,因此它們都包括了Statement的方法。PreparedStatement對(duì)象有可能比Statement對(duì)象的效率更高,因?yàn)樗驯活A(yù)編譯過(guò)并存放在那以供將來(lái)使用。 CallableStatement:由方法prepareCall所創(chuàng)建。CallableStatement對(duì)象用于執(zhí)行SQL儲(chǔ)存程序一組可通過(guò)名稱來(lái)調(diào)用(就象函數(shù)的調(diào)用那樣)的SQL語(yǔ)句。Calla
53、bleStatement對(duì)象從PreparedStatement中繼承了用于處理IN參數(shù)的方法,而且還增加了用于處理OUT參數(shù)和INOUT參數(shù)的方法。 不過(guò)通常來(lái)說(shuō)createStatement方法用于簡(jiǎn)單的SQL語(yǔ)句(不帶參數(shù))、prepareStatement方法用于帶一個(gè)或多個(gè)IN參數(shù)的SQL語(yǔ)句或經(jīng)常被執(zhí)行的簡(jiǎn)單SQL語(yǔ)句,而prepareCall方法用于調(diào)用已儲(chǔ)存過(guò)程。 事務(wù) 事務(wù)由一個(gè)或多個(gè)這樣的語(yǔ)句組成:這些語(yǔ)句已被執(zhí)行、完成并被提交或還原。當(dāng)調(diào)用方法commit或rollback時(shí),當(dāng)前事務(wù)即告就結(jié)束,另一個(gè)事務(wù)隨即開(kāi)始。缺省情況下,新連接將處于自動(dòng)提交模式。也就是說(shuō),當(dāng)執(zhí)行完
54、語(yǔ)句后,將自動(dòng)對(duì)那個(gè)語(yǔ)句調(diào)用commit方法。這種情況下,由于每個(gè)語(yǔ)句都是被單獨(dú)提交的,因此一個(gè)事務(wù)只由一個(gè)語(yǔ)句組成。如果禁用自動(dòng)提交模式,事務(wù)將要等到commit或rollback方法被顯式調(diào)用時(shí)才結(jié)束,因此它將包括上一次調(diào)用commit或rollback方法以來(lái)所有執(zhí)行過(guò)的語(yǔ)句。對(duì)于第二種情況,事務(wù)中的所有語(yǔ)句將作為組來(lái)提交或還原。 方法commit使SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)所做的任何更改成為永久性的,它還將釋放事務(wù)持有的全部鎖。而方法rollback將棄去那些更改。有時(shí)用戶在另一個(gè)更改生效前不想讓此更改生效。這可通過(guò)禁用自動(dòng)提交并將兩個(gè)更新組合在一個(gè)事務(wù)中來(lái)達(dá)到。如果兩個(gè)更新都是成功,則調(diào)用commit方法,從而使兩個(gè)更新結(jié)果成為永久性的;如果其中之一或兩個(gè)更新都失敗了,則調(diào)用rollback方法,以將值恢復(fù)為進(jìn)行更新之前的值。 大多數(shù)JDBC驅(qū)動(dòng)程序都支持事務(wù)。事實(shí)上,符合JDBC的驅(qū)動(dòng)程序必須支持事務(wù)。DatabaseMetaData給出的信息描述DBMS所提供的事務(wù)支持
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建莆田三模數(shù)學(xué)試卷
- 二四年高職高考數(shù)學(xué)試卷
- 大學(xué)新聞寫(xiě)作培訓(xùn)課件
- 肌肉牽伸技術(shù)課件雙語(yǔ)
- 阜城中考數(shù)學(xué)試卷
- 2025年04月廣西南寧市第五人民醫(yī)院人才招聘14人筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025年浙江醫(yī)療衛(wèi)生招聘寧波大學(xué)附屬人民醫(yī)院招聘編外人員2人筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030代理記賬產(chǎn)業(yè)市場(chǎng)深度分析及前景趨勢(shì)與投資報(bào)告
- 2025至2030畜牧行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030寵物保健品行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資管理報(bào)告
- 小升初真題卷(七)(江蘇卷)(試題)- 2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)蘇教版
- 2024全新標(biāo)準(zhǔn)黃金回收合同任意下載
- 《中國(guó)噬血細(xì)胞綜合征診斷與治療指南(2022年版)》解讀
- 生活飲用水管道分質(zhì)直飲水衛(wèi)生規(guī)范
- 人教版六年級(jí)數(shù)學(xué)上冊(cè)《全冊(cè)完整》課件
- 奇瑞汽車在線測(cè)評(píng)題庫(kù)
- 《SVG原理與應(yīng)用》課件
- 開(kāi)展電力登桿培訓(xùn)課件
- 初中英語(yǔ)語(yǔ)法、詞匯及固定搭配專題訓(xùn)練100題(含參考答案)
- 2024年浙江寧波市水務(wù)環(huán)境集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 麻醉晉升述職報(bào)告
評(píng)論
0/150
提交評(píng)論