




已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
,第11章 數(shù)據(jù)庫(kù)編程,11.1 JDBC技術(shù)簡(jiǎn)介 11.2 JDBC的結(jié)構(gòu) 11.3 JDBC驅(qū)動(dòng)程序的類型 11.4 JDBC在數(shù)據(jù)庫(kù)訪問(wèn)中的應(yīng)用 11.5 JDBC綜合應(yīng)用示例 本章小結(jié) 習(xí)題,11.1 JDBC技術(shù)簡(jiǎn)介 JDBC(Java DataBase Connectivity)是Java語(yǔ)言為了支持SQL功能而提供的與數(shù)據(jù)庫(kù)相連的用戶接口。JDBC中包括了一組由Java語(yǔ)言編寫(xiě)的接口和類,都獨(dú)立于特定的DBMS,或者說(shuō)它們可以和各種數(shù)據(jù)相關(guān)聯(lián),即獨(dú)立于數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS的應(yīng)用提供了能與多個(gè)不同數(shù)據(jù)庫(kù)連接的通用接口。這對(duì)于數(shù)據(jù)庫(kù)程序來(lái)說(shuō),想要訪問(wèn)多種數(shù)據(jù)庫(kù),只需要一個(gè)統(tǒng)一的接口就可以實(shí)現(xiàn)。,在Java中JDBC提供了Java訪問(wèn)數(shù)據(jù)庫(kù)平臺(tái)統(tǒng)一的API。JDBC實(shí)際上就是由Java實(shí)現(xiàn)的數(shù)據(jù)庫(kù)訪問(wèn)中間件。程序員可以通過(guò)JDBC向各種關(guān)系型數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,只需要使用JDBC提供的幾個(gè)類(對(duì)象)或接口即可,而不必為不同的數(shù)據(jù)庫(kù)編寫(xiě)不同的程序。有了JDBC以后,對(duì)于數(shù)據(jù)庫(kù)編程,程序員只需要在Java語(yǔ)言中使用SQL語(yǔ)言,使Java應(yīng)用程序或Java Applet實(shí)現(xiàn)對(duì)分布在網(wǎng)絡(luò)上的各種數(shù)據(jù)庫(kù)的訪問(wèn),而不用考慮底層具體DBMS的連接和訪問(wèn)過(guò)程。,JDBC由一組Java語(yǔ)言編寫(xiě)的接口和類組成,使用內(nèi)嵌式的SQL,主要實(shí)現(xiàn)三大功能: (1) 建立與數(shù)據(jù)庫(kù)的連接; (2) 執(zhí)行SQL聲明,向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句; (3) 處理數(shù)據(jù)庫(kù)返回的SQL執(zhí)行結(jié)果。,JDBC支持基本的SQL功能,使用它可以方便地與不同的關(guān)系數(shù)據(jù)庫(kù)建立連接,進(jìn)行相關(guān)操作,無(wú)須再為不同的DBMS分別編寫(xiě)程序。JDBC是一種底層API,意味著它將直接調(diào)用SQL命令,同時(shí)也是構(gòu)造高層API和數(shù)據(jù)庫(kù)開(kāi)發(fā)工具的基礎(chǔ)。高層API和數(shù)據(jù)庫(kù)開(kāi)發(fā)工具應(yīng)該使用戶界面更加友好,使用更加方便和易于理解。不過(guò)所有這樣的API最終將被翻譯為像JDBC這樣的底層API。兩種基于JDBC的高層API,一種是SQL語(yǔ)言嵌入Java的預(yù)處理器,另一種是實(shí)現(xiàn)從關(guān)系數(shù)據(jù)庫(kù)到Java類的直接映射,目前都正處于開(kāi)發(fā)階段。,由于JDBC帶來(lái)的便捷,越來(lái)越多的程序員已經(jīng)開(kāi)始利用JDBC為基礎(chǔ)的工具進(jìn)行開(kāi)發(fā),使開(kāi)發(fā)工作更加容易。而程序員同時(shí)也正在開(kāi)發(fā)讓最終用戶更加容易訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序,Java程序通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的關(guān)系如圖11-1所示。,圖11-1 Java程序通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù),11.2 JDBC的結(jié)構(gòu) 11.2.1 JDBC API JDBC API是面向程序員的,Java程序員通過(guò)調(diào)用此API可以實(shí)現(xiàn)連接數(shù)據(jù)庫(kù),執(zhí)行SQL語(yǔ)句并返回結(jié)果集。JDBC API主要由一系列的接口定義所構(gòu)成,主要的接口如表11-1所示。,11.2.2 JDBC Driver API 面向底層的JDBC Driver API 主要是針對(duì)數(shù)據(jù)庫(kù)廠商開(kāi)發(fā)數(shù)據(jù)庫(kù)底層驅(qū)動(dòng)程序使用的,一般情況下用于開(kāi)發(fā)應(yīng)用程序的程序員用不到這些類庫(kù)。Java的應(yīng)用程序員通過(guò)SQL包中定義的一系列抽象類對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而實(shí)現(xiàn)這些抽象類并完成實(shí)際操作,則是由數(shù)據(jù)庫(kù)驅(qū)動(dòng)器Driver運(yùn)行的,最終保證Java程序員通過(guò)JDBC實(shí)現(xiàn)對(duì)不同數(shù)據(jù)庫(kù)的操作。其結(jié)構(gòu)如圖11-2所示。,圖11-2 JDBC Driver API結(jié)構(gòu)圖,11.3 JDBC驅(qū)動(dòng)程序的類型 目前比較常見(jiàn)的JDBC驅(qū)動(dòng)程序可分為以下四種。 1JDBC-ODBC和ODBC驅(qū)動(dòng)程序 這種驅(qū)動(dòng)器通過(guò)ODBC驅(qū)動(dòng)器提供數(shù)據(jù)庫(kù)連接。JDBC在設(shè)計(jì)上和ODBC很類似,JDBC和數(shù)據(jù)庫(kù)的連接方法之一是先建立起一個(gè)JDBC-ODBC橋接器。由于微軟產(chǎn)品ODBC驅(qū)動(dòng)程序已經(jīng)被廣泛應(yīng)用,因此建立這種橋接器后,JDBC就有能力訪問(wèn)各種類型的數(shù)據(jù)庫(kù)。使用這種驅(qū)動(dòng)器,要求每一臺(tái)客戶機(jī)都要裝入ODBC的驅(qū)動(dòng)器。,2Native-API partly-Java Driver/本地API 這種驅(qū)動(dòng)方式將數(shù)據(jù)庫(kù)廠商的特殊協(xié)議轉(zhuǎn)化成Java代碼以及二進(jìn)制類碼,使Java數(shù)據(jù)庫(kù)客戶與數(shù)據(jù)庫(kù)服務(wù)器通信。各客戶機(jī)使用的數(shù)據(jù)庫(kù)可能各不相同,需要在客戶機(jī)上裝有相應(yīng)DBMS的驅(qū)動(dòng)程序。,3JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序 這種驅(qū)動(dòng)程序?qū)DBC指令轉(zhuǎn)化成獨(dú)立于DBMS的網(wǎng)絡(luò)協(xié)議形式,再由服務(wù)器轉(zhuǎn)化為特定DBMS的協(xié)議形式。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上。有關(guān)DBMS的協(xié)議由各數(shù)據(jù)庫(kù)廠商決定。這種驅(qū)動(dòng)器可以連接到不同的數(shù)據(jù)庫(kù)上,是最為靈活的JDBC驅(qū)動(dòng)程序。將來(lái)也許所有這種解決方案的提供者都能提供適合于Intranet用的產(chǎn)品。為了使這些產(chǎn)品也支持廣域網(wǎng)存取,它們必須處理Web所提出的安全性、通過(guò)防火墻的訪問(wèn)等方面的要求。目前一些廠商已經(jīng)開(kāi)始將JDBC驅(qū)動(dòng)程序加到他們現(xiàn)有的數(shù)據(jù)庫(kù)中間件產(chǎn)品中。,4本地協(xié)議純Java驅(qū)動(dòng)程序 這種類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這相當(dāng)于客戶機(jī)直接與服務(wù)器聯(lián)系,是Intranet訪問(wèn)的一個(gè)很實(shí)用的解決方法。 以上四種驅(qū)動(dòng)程序中,后兩種都是純Java driver,相對(duì)效率更高,更具有通用性;但前兩種比較容易獲得,使用比較普遍一些。,11.4 JDBC在數(shù)據(jù)庫(kù)訪問(wèn)中的應(yīng)用 JDBC與Acess、SQL Server、Oracle等各種數(shù)據(jù)庫(kù)的連接,首先需要準(zhǔn)備相應(yīng)的運(yùn)行環(huán)境,本例采用JDK1.5.0作為開(kāi)發(fā)工具,使用Eclipse 3.2集成開(kāi)發(fā)環(huán)境,可以提供一些演示功能。操作系統(tǒng)最好是Windows 2000或者Windows XP,并裝好至少一種數(shù)據(jù)庫(kù)。一個(gè)基本的JDBC程序開(kāi)發(fā)編程步驟主要包含以下7步:,(1) 引入相應(yīng)的類和包(import java.sql.*)。 (2) 加載合適的JDBC驅(qū)動(dòng)程序(Load the Driver)。 (3) 連接數(shù)據(jù)庫(kù)(Connect to the DataBase)。 (4) 執(zhí)行SQL語(yǔ)句(Execute the SQL): Connection.CreateStatement( ); .executeQuery( ); .executeUpdate( )。,(5) 從取得的ResultSet對(duì)象中獲取結(jié)果(Retrieve the result data)。 (6) 將數(shù)據(jù)庫(kù)中各種類型轉(zhuǎn)換為Java中的類型,通過(guò)getXXX 方法(Show the result data)。 (7) 關(guān)閉(Close): close the resultset對(duì)象; close the statement對(duì)象; close the connection對(duì)象。 下面按照J(rèn)DBC編程步驟詳細(xì)介紹JDBC在數(shù)據(jù)庫(kù)訪問(wèn)中的應(yīng)用。,11.4.1 建立與數(shù)據(jù)庫(kù)的連接 1設(shè)置數(shù)據(jù)源 在數(shù)據(jù)庫(kù)連接之前需要加載相應(yīng)的數(shù)據(jù)源(采用JDBC-ODBC和ODBC驅(qū)動(dòng)程序)。下面以SQL Server數(shù)據(jù)庫(kù)為例簡(jiǎn)要說(shuō)明如何設(shè)置數(shù)據(jù)源。一般是在控制面板的管理工具中打開(kāi)ODBC項(xiàng),出現(xiàn)ODBC數(shù)據(jù)源管理器對(duì)話框,然后選擇User DSN選項(xiàng)卡,單擊Add按鈕,選擇想為其安裝數(shù)據(jù)源的驅(qū)動(dòng)程序,并點(diǎn)擊完成,接著會(huì)出現(xiàn)創(chuàng)建到SQL Server的新數(shù)據(jù)源,如圖11-3所示。按照此向?qū)б徊讲酵虏僮?,直到?shù)據(jù)源配置成功,具體步驟將在11.5節(jié)里詳細(xì)介紹。,圖11-3 設(shè)置數(shù)據(jù)源,2引入相應(yīng)的類和包 任何使用JDBC的源程序都需要輸入java.sql包,即import java.sql.*,必要的時(shí)候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動(dòng)程序的包,如import sun.jdbc.odbc.JdbcOdbc Driver。然后聲明如下的對(duì)象: ResultSet rs = null; Connection conn = null; Connection代表和數(shù)據(jù)庫(kù)的連接,連接過(guò)程包括所執(zhí)行的SQL語(yǔ)句和該連接上返回的結(jié)果,3裝載驅(qū)動(dòng)程序 與數(shù)據(jù)庫(kù)連接之前還需要裝載驅(qū)動(dòng)程序。一般常用的是Class.forName( )方法顯示裝載驅(qū)動(dòng),如果采用JDBC-ODBC和ODBC驅(qū)動(dòng)程序,用下列代碼裝載: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Class是java.lang包中的一個(gè)類,該類通過(guò)調(diào)用它的靜態(tài)方法forName就可以建立JDBC-ODBC橋接器。執(zhí)行該代碼將裝載驅(qū)動(dòng),并且在裝載時(shí),驅(qū)動(dòng)將自動(dòng)向JDBC注冊(cè)自己。使用Class.forName( )方法可能拋出異常,因此在驅(qū)動(dòng)程序類有可能不存在時(shí),需要捕獲這個(gè)異常,標(biāo)準(zhǔn)是:,try /注冊(cè)數(shù)據(jù)庫(kù) Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); /捕獲異常 catch(Java.lang.ClassNotFoundException e) System.err.println(e.getMessage( ); ,4連接到數(shù)據(jù)庫(kù) 與數(shù)據(jù)庫(kù)建立連接的標(biāo)準(zhǔn)方法是調(diào)用 DriverManager.getConnection,該方法接受含有某個(gè)url的字符串。DriverManager類是JDBC管理層,嘗試找到可與指定url所代表的數(shù)據(jù)庫(kù)進(jìn)行連接的驅(qū)動(dòng)程序如下: String url = “jdbc:odbc:數(shù)據(jù)源名字”; Connection conn = DriverManager.getConnection(url,“數(shù)據(jù)源登錄名“,“數(shù)據(jù)源登錄密碼“);,第一條語(yǔ)句定義了一個(gè)字符串變量,變量?jī)?nèi)容是一種JDBC連接所特定的URL。JDBC URL的標(biāo)準(zhǔn)語(yǔ)法是:jdbc:子協(xié)議:子名稱,其中JDBCURL中協(xié)議總是jdbc。如果采用JDBC-ODBC橋驅(qū)動(dòng),JDBC URL以jdbc:odbc開(kāi)始,余下URL通常是數(shù)據(jù)源名字或數(shù)據(jù)庫(kù)系統(tǒng)。例如使用ODBC存取名為“l(fā)ibrary“的ODBC數(shù)據(jù)源,JDBCURL是jdbc:odbc: library。第二條語(yǔ)句通過(guò)調(diào)用getConnection方法創(chuàng)建與數(shù)據(jù)庫(kù)的連接,并返回一個(gè)Connection對(duì)象。,11.4.2 執(zhí)行查詢語(yǔ)句 與數(shù)據(jù)庫(kù)建立連接成功后,就可以向所建立連接的數(shù)據(jù)庫(kù)傳送SQL語(yǔ)句,其中JDBC對(duì)能夠被發(fā)送的SQL語(yǔ)句類型不加任何限制。在和數(shù)據(jù)庫(kù)建立連接后,使用三種對(duì)象Statement、PreparedStatement和CallableStatement查詢數(shù)據(jù)庫(kù)。在建立了SQL對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢和修改,并將查詢結(jié)果存放在一個(gè)ResultSet類聲明的對(duì)象中,也就是說(shuō),SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)的查詢操作將返回一個(gè)ResultSet對(duì)象。,1Statement Statement對(duì)象實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的一般查詢功能,在JDBC里面可采用Statement對(duì)象來(lái)實(shí)現(xiàn)發(fā)送SQL語(yǔ)句到數(shù)據(jù)庫(kù)。Statement對(duì)象可把簡(jiǎn)單查詢語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù),允許執(zhí)行簡(jiǎn)單的查詢。,(1) 創(chuàng)建對(duì)象。首先創(chuàng)建一個(gè)Statement對(duì)象,它封裝代表要執(zhí)行的SQL語(yǔ)句,并執(zhí)行SQL語(yǔ)句以返回一個(gè)ResultSet對(duì)象,通過(guò)Connection類中的createStatement( )方法來(lái)實(shí)現(xiàn)。對(duì)象執(zhí)行后得到正確的結(jié)果: Statement stmt = con.createStatement( );,(2) 執(zhí)行SQL查詢語(yǔ)句,查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 Statement接口有三個(gè)查詢方法:executeQuery( )、executeUpdate( )和execute( )。executeQuery( )方法執(zhí)行簡(jiǎn)單的選擇查詢,例如SELECT語(yǔ)句。executeQuery的參數(shù)是String對(duì)象,返回的是一個(gè)ResultSet類的對(duì)象。executeUpdate( )方法執(zhí)行SQL的UPDATE、INSERT或DELETE語(yǔ)句,返回整數(shù)值,并給出受查詢影響的行數(shù)。,execute( )方法中execute 用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語(yǔ)句,一般不需要此功能,如: ResultSet rs = stmt.executeQuery(“Select * from Student_info”); stmt.executeUpdate(“update Student_info set age=20 where name=張杰“);,2PreparedStatement PreparedStatement對(duì)象實(shí)現(xiàn)預(yù)編譯方式執(zhí)行SQL語(yǔ)句,由于Statement對(duì)象在每次執(zhí)行SQL語(yǔ)句時(shí)都將該語(yǔ)句傳給數(shù)據(jù)庫(kù),如果需要多次執(zhí)行同一條SQL語(yǔ)句,就將導(dǎo)致執(zhí)行效率特別低,此時(shí)可以采用PreparedStatement對(duì)象來(lái)封裝SQL語(yǔ)句。Prepared對(duì)象可以將SQL語(yǔ)句傳給數(shù)據(jù)庫(kù)作預(yù)編譯,以提高執(zhí)行速度。另外,PreparedStatement對(duì)象允許執(zhí)行參數(shù)化的查詢,可以用不同的輸入?yún)?shù)來(lái)多次執(zhí)行編譯過(guò)的語(yǔ)句。,(1) 創(chuàng)建PreparedStatement對(duì)象: PreparedStatment pstmt = con.prepareStatement(“Select * from 學(xué)生信息表”); (2) 執(zhí)行查詢語(yǔ)句: ResultSet rs = pstmt.exectueQuery( );該條語(yǔ)句可以多次被執(zhí)行,3CallableStatement CallableStatement對(duì)象主要用于執(zhí)行數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)已經(jīng)存在的SQL查詢語(yǔ)句,執(zhí)行存儲(chǔ)過(guò)程的結(jié)果同執(zhí)行相應(yīng)的SQL語(yǔ)句是一樣的。,(1) 創(chuàng)建CallableStatement對(duì)象,一般格式為“call procedurename( )”,是不帶輸入?yún)?shù)的存儲(chǔ)過(guò)程,其中procedurename是存儲(chǔ)過(guò)程的名稱。帶輸入?yún)?shù)的存儲(chǔ)過(guò)程為“call procedurename (?, ?)”。而帶輸入?yún)?shù)并有返回結(jié)果參數(shù)的存儲(chǔ)過(guò)程為“? = call procedurename (?, ?, .)”。例如: CallableStatement cstmt = con.prepareCall(“call Query1( )“);,(2) 執(zhí)行存儲(chǔ)過(guò)程。CallableStatement類是PreparedStatement類的子類,可以使用在PreparedStatement類及Statement類中的方法。因此執(zhí)行存儲(chǔ)過(guò)程可調(diào)用executeQuery( )方法來(lái)實(shí)現(xiàn),如: ResultSet rs = cstmt.executeQuery( );,4ResultSet 執(zhí)行完畢SQL語(yǔ)句后,將返回一個(gè)ResultSet類的對(duì)象,它包含所有的查詢結(jié)果,也就是將查詢結(jié)果封裝在ResultSet對(duì)象中。ResultSet實(shí)際上是一張表示數(shù)據(jù)庫(kù)結(jié)果集的數(shù)據(jù)表,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。,ResultSet類的對(duì)象方式依賴于光標(biāo)(Cursor)的類型,對(duì)Resultset對(duì)象的處理必須逐步進(jìn)行,而對(duì)每一行中的各個(gè)列可以按任何順序進(jìn)行處理。ResultSet對(duì)象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。最初,光標(biāo)被置于第一行之前。next( )方法將光標(biāo)移動(dòng)到下一行,因?yàn)樵摲椒ㄔ?ResultSet對(duì)象沒(méi)有下一行時(shí)返回 false,所以可以在while循環(huán)中使用它來(lái)迭代結(jié)果集。ResultSet對(duì)象通過(guò)getXXX( )方法來(lái)獲得某一列的數(shù)據(jù),這里XXX代表列的數(shù)據(jù)類型,如getInt( )、getString( )、getDate( )等。其中g(shù)etXXX(int cn)中cn指結(jié)果集中的列號(hào),getXXX(String colName)中colName代表列名。,例如: Statement stmt = con.creatStatement( ); ResultSet rs= stmt.executeQuery(“Select * from 學(xué)生信息表“); while(rs.next( ) String name=rs.getString(“student_name“);,5查詢數(shù)據(jù)庫(kù)示例 以下是通過(guò)JDBC連接SQL Server 2000數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)查詢的示例。首先創(chuàng)建Statement對(duì)象,接著執(zhí)行SQL語(yǔ)句,查詢表dept_info中的信息,然后返回一個(gè)ResultSet類的對(duì)象,包含查詢到dept_info表中deptno和deptname的數(shù)據(jù)。其中數(shù)據(jù)庫(kù)library中dept_info表的數(shù)據(jù)如圖11-4所示。,圖11-4 dept_info表,查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)首先要建立和數(shù)據(jù)庫(kù)的連接。本例采用本地協(xié)議純Java驅(qū)動(dòng)程序,不需要數(shù)據(jù)源的設(shè)置。建立和數(shù)據(jù)庫(kù)的連接步驟如下: (1)下載SQL Sever 2000的驅(qū)動(dòng)程序包,這個(gè)可以從微軟的網(wǎng)站上下載(http://download /3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/setup.exe)。默認(rèn)安裝路徑為c:Program FilesMicrosoft SQL Server 2000 Driver for JDBC。其中l(wèi)ib目錄下的三個(gè) .jar文件即是JDBC驅(qū)動(dòng)核心,即msbase.jar、mssqlserver.jar、msutil.jar。,(2) 設(shè)置環(huán)境變量。將三個(gè).jar文件加入到環(huán)境變量中。此處安裝驅(qū)動(dòng)程序后將lib路徑設(shè)為:D:SQL Server 2000lib,環(huán)境變量設(shè)置如下: classpath: D:SQL Server 2000libmssqlserver.jar;D:SQL Server 2000libmsbase.jar;D:SQL Server 2000lib msutil.jar;,(3) 裝載驅(qū)動(dòng)程序并建立連接: Class.forName(“com.microsoft.jdbc.sqlserver .SQLServerDriver”); 聲明數(shù)據(jù)庫(kù)驅(qū)動(dòng) String driver = “jdbc:microsoft:sqlserver:/localhost:1433”; Connection conn = DriverManager.getConnection (driver,“”,“”); 建立數(shù)據(jù)庫(kù)連接 查詢數(shù)據(jù)庫(kù)具體代碼如下所述。,【示例11-1】 TestJDBC.java。 import java.sql.*; public class TestJDBC public static void main(String args) ResultSet rs = null; Statement stmt = null; Connection conn = null; try Class.forName(“com.microsoft.jdbc.sqlserver .SQLServerDriver“); String driver = “jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName =library“;,conn = DriverManager.getConnection (driver,“sa”,“123”); stmt = conn.createStatement( ); rs = stmt.executeQuery(“select * from dept_info”); while (rs.next( ) System.out.print (rs.getInt(“deptno”); System.out.println(rs.getString (“deptname”); catch (ClassNotFoundException e) e.printStackTrace( );, catch (SQLException e) e.printStackTrace( ); finally try if (rs != null) rs.close( ); rs = null; if (stmt != null) stmt.close( ); stmt = null; ,if (conn != null) conn.close( ); conn = null; catch (SQLException e) e.printStackTrace( ); ,程序運(yùn)行結(jié)果: 1 光電工程學(xué)院 2 材料化工學(xué)院 3 電子工程學(xué)院 4 經(jīng)濟(jì)管理學(xué)院 5 計(jì)算機(jī)科學(xué)工程學(xué)院 6 人文社科學(xué)院,11.4.3 更新數(shù)據(jù)庫(kù)操作 和數(shù)據(jù)庫(kù)建立連接后,除了要實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢操作外,在很多實(shí)際應(yīng)用中,經(jīng)常要實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的更新操作,主要包括對(duì)數(shù)據(jù)庫(kù)表中的記錄進(jìn)行修改、插入和刪除操作,以及數(shù)據(jù)庫(kù)中表的創(chuàng)建和刪除等操作,并通過(guò)Statement對(duì)象調(diào)用方法。 以下是通過(guò)JDBC連接SQL Server 2000數(shù)據(jù)庫(kù)的更新操作。,1對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改、插入和刪除操作 通過(guò)SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)中表的記錄進(jìn)行修改、插入和刪除操作,其中executeUpdate( )方法的輸入?yún)?shù)仍然為一個(gè)String對(duì)象(即所要執(zhí)行的SQL語(yǔ)句),但輸出參數(shù)不是ResultSet對(duì)象,而是一個(gè)整數(shù)(它代表操作所影響的記錄行數(shù))。,(1) 修改操作。下列語(yǔ)句將學(xué)生信息表中張?zhí)鸬哪挲g字段值修改為22: Statement stmt = conn.createStatement( ); String sql = “update Student_info set age=22 where name=張?zhí)稹保?stmt.executeUpdate(sql);,(2) 插入操作。下列語(yǔ)句將給學(xué)生信息表中增加一條新記錄王紅,20,陜西: Statement stmt = conn.createStatement( ); String sql = “insert into Student_info values (王紅,20,陜西)”; stmt.executeUpdate(sql);,(3) 刪除操作。下列語(yǔ)句刪除了學(xué)生信息表中李明的記錄: Statement stmt = conn.createStatement( ); String sql = “delete from Student_info where name=李明”; stmt.executeUpdate(sql);,2創(chuàng)建和刪除表 通過(guò)SQL的Create Table和Drop Table語(yǔ)句可實(shí)現(xiàn)對(duì)表的創(chuàng)建和刪除。 (1) 創(chuàng)建表的語(yǔ)句如下: Statement stmt=con.createStatement( ); stmt.executeUpdate(“create table TableName(ID INTEGER, Name VARCHAR(20)”); (2) 刪除表的語(yǔ)句如下: Statement stmt=con.createStatement( ); stmt.executeUpdate(“Drop TableName “);,3增加和刪除表中的列 對(duì)一個(gè)表的列進(jìn)行更新操作主要是使用SQL的Alter Table語(yǔ)句,需要注意的是對(duì)列所進(jìn)行的更新操作會(huì)影響到表中的所有行。 (1) 增加表中的一列。在TableName表中增加一列Address,數(shù)據(jù)類型為字符串。 Statement stmt=con.createStatement( ); stmt.executeUpdate(“Alter Table TableName add Column Address Varchar (50)“);,(2) 刪除表中的一列。在TableName表中刪除一列Address。 Statement stmt=con.createStatement( ); stmt.executeUpdate(“Alter Table TableName Drop Column Address“);,11.4.4 事務(wù) 通過(guò)Statement對(duì)象除了對(duì)數(shù)據(jù)庫(kù)進(jìn)行SQL的操作之外,事務(wù)控制也是一種主要的應(yīng)用。事務(wù)控制在建立數(shù)據(jù)庫(kù)驅(qū)動(dòng)應(yīng)用程序的時(shí)候是一個(gè)很重要的問(wèn)題。在數(shù)據(jù)庫(kù)中,事務(wù)是指一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。在JDBC的數(shù)據(jù)庫(kù)操作中,一項(xiàng)事務(wù)是由一條或是多條表達(dá)式組成的一個(gè)不可分隔的工作單元。通過(guò)提交commit( )或是回退rollback( )來(lái)結(jié)束事務(wù)的操作,也就是當(dāng)調(diào)用方法commit或rollback時(shí),當(dāng)前事務(wù)即結(jié)束,而另一個(gè)事務(wù)隨即開(kāi)始。關(guān)于事務(wù)操作的方法都位于接口java.sql.Connection中。,在JDBC中,事務(wù)操作默認(rèn)是自動(dòng)提交的。一條對(duì)數(shù)據(jù)庫(kù)的更新表達(dá)式代表一項(xiàng)事務(wù)操作,成功后,系統(tǒng)將自動(dòng)調(diào)用commit( )來(lái)提交;否則,將調(diào)用rollback( )來(lái)回退。其中,方法commit使SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)所做的任何更改成為永久性的,它還將釋放事務(wù)持有的全部鎖。而方法rollback將棄去那些更改。有時(shí)用戶在另一個(gè)更改生效前不想讓此更改生效,這可通過(guò)調(diào)用setAutoCommit(false)禁用自動(dòng)提交并將兩個(gè)更新組合在一個(gè)事務(wù)中來(lái)達(dá)到。,如果兩個(gè)更新都是成功的,則調(diào)用commit( )方法,從而使兩個(gè)更新結(jié)果成為永久性的;如果其中之一或兩個(gè)更新都失敗了,就不會(huì)執(zhí)行到commit( ),并將產(chǎn)生一些異常,整個(gè)事務(wù)就要全部視為錯(cuò)誤,這時(shí)則可以在捕獲異常時(shí)調(diào)用rollback( )進(jìn)行回退,而全部從起始點(diǎn)后開(kāi)始的操作應(yīng)全部回到開(kāi)始狀態(tài)。 大多數(shù)JDBC驅(qū)動(dòng)程序都支持事務(wù)。事實(shí)上,符合JDBC的驅(qū)動(dòng)程序必須支持事務(wù)。其中DatabaseMetaData給出的信息描述了DBMS所提供的事務(wù)支持水平。,11.5 JDBC綜合應(yīng)用示例 本節(jié)以一個(gè)簡(jiǎn)單的圖書(shū)借閱系統(tǒng)中對(duì)圖書(shū)信息的操作為例,講解JDBC在數(shù)據(jù)庫(kù)連接中的應(yīng)用,包括詳細(xì)的數(shù)據(jù)源設(shè)置以及實(shí)現(xiàn)對(duì)圖書(shū)信息的增加、刪除、修改和查詢的操作。本例的數(shù)據(jù)庫(kù)采用SQL Server 2000,對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)采用便于理解的JDBC-ODBC方式。,11.5.1 建立數(shù)據(jù)庫(kù) 首先在SQL Server 2000數(shù)據(jù)庫(kù)中建立數(shù)據(jù)庫(kù)library,并在數(shù)據(jù)庫(kù)library中創(chuàng)建book_info表。也可以在與數(shù)據(jù)庫(kù)library建立連接后通過(guò)SQL語(yǔ)句創(chuàng)建book_info表,如下:,Statement stmt= con.createStatement( ); String query=“create table book_info”+“(BookId VARCHAR(50), ”+“BookName VARCHAR(50),”+“Author,VARCHAR(50),”+“Amount INT(4)”; stmt.executeUpdate(query); 其中數(shù)據(jù)庫(kù)表book_info的數(shù)據(jù)庫(kù)結(jié)構(gòu)如表11-2所示。 初始的book_info數(shù)據(jù)表如圖11-5所示,表中已有兩條圖書(shū)信息。,圖11-5 初始的book_info數(shù)據(jù)表,11.5.2 建立數(shù)據(jù)源 為了同上一節(jié)中建立的數(shù)據(jù)庫(kù)建立連接,需要配置一個(gè)ODBC數(shù)據(jù)源try,步驟如下。 步驟一:在開(kāi)始-設(shè)置-控制面版(Win98、NT4.0)中選取“數(shù)據(jù)源(ODBC)”;在Windows XP中“數(shù)據(jù)源(ODBC)”位于“開(kāi)始-設(shè)置-控制面版-管理工具”或“開(kāi)始-程序-管理工具”下。 步驟二:?jiǎn)?dòng)“數(shù)據(jù)源(ODBC)”配置程序,界面如圖11-6所示。,圖11-6 ODBC數(shù)據(jù)源管理界面,步驟三:在圖11-6中“用戶DSN”選項(xiàng)下單擊“添加”按鈕,添加一個(gè)系統(tǒng)的數(shù)據(jù)源(DSN),則出現(xiàn)如圖11-7所示創(chuàng)建新數(shù)據(jù)源界面。 步驟四:在圖11-7中選擇“SQL Server”,單擊“完成”則出現(xiàn)如圖11-8圖11-10所示創(chuàng)建到SQL Server的新數(shù)據(jù)源的對(duì)話框,并按此向?qū)顚?xiě)內(nèi)容。點(diǎn)擊“下一步”,選擇使用網(wǎng)絡(luò)登錄ID的Windows NT驗(yàn)證,接著點(diǎn)擊“下一步”,并更改默認(rèn)的數(shù)據(jù)庫(kù)為library。,圖11-7 創(chuàng)建新數(shù)據(jù)源界面,圖11-8 創(chuàng)建到SQL Server的新數(shù)據(jù)源(一),圖11-9 創(chuàng)建到SQL Server的新數(shù)據(jù)源(二),圖11-10 創(chuàng)建到SQL Server的新數(shù)據(jù)源(三),步驟五:再點(diǎn)擊“下一步”,默認(rèn)當(dāng)前設(shè)置,點(diǎn)擊“完成”,出現(xiàn)ODBC Microsoft對(duì)話框,點(diǎn)擊“測(cè)試數(shù)據(jù)源”,出現(xiàn)測(cè)試結(jié)果界面,如圖11-11所示。 以上步驟就完成了對(duì)數(shù)據(jù)源的設(shè)置。,圖11-11 SQL Server ODBC數(shù)據(jù)源測(cè)試界面,11.5.3 數(shù)據(jù)庫(kù)操作程序 本書(shū)采用JDK 1.5.0作為開(kāi)發(fā)工具,使用Eclipse 3.2集成開(kāi)發(fā)環(huán)境。首先在Eclipse中File菜單中新建一個(gè)Project工程,選擇Java文件夾下的Java Project選項(xiàng),并點(diǎn)擊下一步,出現(xiàn)如圖11-12所示的對(duì)話框。新建jdbc工程名,最后點(diǎn)擊完成。這樣,jdbc,這個(gè)工程就建立好了。接著按照?qǐng)D11-13把SQL Server驅(qū)動(dòng)程序添加到工程中,找到驅(qū)動(dòng)程序存放的路徑就可以完成這個(gè)操作。,圖11-12 創(chuàng)建Java Project,圖11-13 添加驅(qū)動(dòng)程序,其次就是代碼的編寫(xiě),右鍵點(diǎn)擊工程名jdbc,新建一個(gè) dbconnect類。 【示例11-2】 dbconnect.java。 import java.sql.*; public class dbconnect public static void main(String args) String dbDriver = “sun.jdbc.odbc.JdbcOdbcDriver“;/聲明數(shù)據(jù)庫(kù)驅(qū)動(dòng) String driver = “jdbc:odbc:library“;/聲明數(shù)據(jù)源 Connection con = null; String query = “select * from book_info“;,ResultSet rs = null; Statement stmt = null; try /加載SQLServer的jdbc驅(qū)動(dòng) Class.forName(dbDriver); catch (java.lang.ClassNotFoundException e) System.err.println(“ClassNotFoundException: “ + e.getMessage( ); try ,/建立數(shù)據(jù)庫(kù)連接 con = DriverManager.getConnection(driver, “sa“, “123“); /將數(shù)據(jù)庫(kù)連接設(shè)置為自動(dòng)提交模式 con.setAutoCommit(true); stmt = con.createStatement( ); /執(zhí)行insert into語(yǔ)句,增加兩條圖書(shū)信息 stmt.executeUpdate(“insert into book_info (BookId,BookName) values200803,英語(yǔ)口語(yǔ)技能)“); stmt.executeUpdate(“insert into book_info (BookId,BookName) values(200804, JSP入門(mén))“);,queryBooks(con, stmt, query); /執(zhí)行一個(gè)update語(yǔ)句,更新數(shù)據(jù)庫(kù),修改200803圖書(shū)編號(hào)的書(shū)名 stmt.executeUpdate(“update book_info set BookName=基礎(chǔ)英語(yǔ)口語(yǔ)技能 where BookId=003“); queryBooks(con, stmt, query); /執(zhí)行一個(gè)delete語(yǔ)句,刪除一條圖書(shū)信息 stmt.executeUpdate(“delete from book_info where BookId=200804“); queryBooks(con, stmt
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 婚紗攝影行業(yè)線上線下融合發(fā)展方案
- 液壓升降平臺(tái)生產(chǎn)制造項(xiàng)目可行性研究報(bào)告
- 醫(yī)院下鄉(xiāng)宣傳課件
- 健康理念課件
- 健康照護(hù)實(shí)操課件下載
- 蚌埠充電樁管理辦法規(guī)定
- 行政學(xué)院培訓(xùn)費(fèi)管理辦法
- 西安市出入商場(chǎng)管理辦法
- 衢州市文物保護(hù)管理辦法
- 襄陽(yáng)五中精細(xì)化管理辦法
- 小組互評(píng)活動(dòng)方案
- 商場(chǎng)夏季餐飲活動(dòng)方案
- 2025年中國(guó)普通聚醚市場(chǎng)調(diào)查研究報(bào)告
- 2025央國(guó)企AI+數(shù)智化轉(zhuǎn)型研究報(bào)告
- 倉(cāng)儲(chǔ)部標(biāo)簽管理制度
- 風(fēng)機(jī)吊裝安全培訓(xùn)
- 公司貿(mào)易合規(guī)管理制度
- CJ/T 461-2014水處理用高密度聚乙烯懸浮載體填料
- 教育培訓(xùn)機(jī)構(gòu)分租協(xié)議書(shū)
- 小學(xué)保潔承包協(xié)議書(shū)
- 重慶中考:數(shù)學(xué)高頻考點(diǎn)
評(píng)論
0/150
提交評(píng)論