java程序設(shè)計(jì)教程 第11章.ppt
《java程序設(shè)計(jì)教程 第11章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《java程序設(shè)計(jì)教程 第11章.ppt(96頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、,第11章 數(shù)據(jù)庫編程,11.1 JDBC技術(shù)簡介 11.2 JDBC的結(jié)構(gòu) 11.3 JDBC驅(qū)動(dòng)程序的類型 11.4 JDBC在數(shù)據(jù)庫訪問中的應(yīng)用 11.5 JDBC綜合應(yīng)用示例 本章小結(jié) 習(xí)題,11.1 JDBC技術(shù)簡介JDBC(Java DataBase Connectivity)是Java語言為了支持SQL功能而提供的與數(shù)據(jù)庫相連的用戶接口。JDBC中包括了一組由Java語言編寫的接口和類,都獨(dú)立于特定的DBMS,或者說它們可以和各種數(shù)據(jù)相關(guān)聯(lián),即獨(dú)立于數(shù)據(jù)庫管理系統(tǒng)DBMS的應(yīng)用提供了能與多個(gè)不同數(shù)據(jù)庫連接的通用接口。這對于數(shù)據(jù)庫程序來說,想要訪問多種數(shù)據(jù)庫,只需要一個(gè)統(tǒng)一的接口就
2、可以實(shí)現(xiàn)。,,在Java中JDBC提供了Java訪問數(shù)據(jù)庫平臺(tái)統(tǒng)一的API。JDBC實(shí)際上就是由Java實(shí)現(xiàn)的數(shù)據(jù)庫訪問中間件。程序員可以通過JDBC向各種關(guān)系型數(shù)據(jù)庫發(fā)送SQL語句,只需要使用JDBC提供的幾個(gè)類(對象)或接口即可,而不必為不同的數(shù)據(jù)庫編寫不同的程序。有了JDBC以后,對于數(shù)據(jù)庫編程,程序員只需要在Java語言中使用SQL語言,使Java應(yīng)用程序或Java Applet實(shí)現(xiàn)對分布在網(wǎng)絡(luò)上的各種數(shù)據(jù)庫的訪問,而不用考慮底層具體DBMS的連接和訪問過程。,,JDBC由一組Java語言編寫的接口和類組成,使用內(nèi)嵌式的SQL,主要實(shí)現(xiàn)三大功能:(1) 建立與數(shù)據(jù)庫的連接;(2) 執(zhí)行
3、SQL聲明,向數(shù)據(jù)庫發(fā)送SQL語句;(3) 處理數(shù)據(jù)庫返回的SQL執(zhí)行結(jié)果。,,JDBC支持基本的SQL功能,使用它可以方便地與不同的關(guān)系數(shù)據(jù)庫建立連接,進(jìn)行相關(guān)操作,無須再為不同的DBMS分別編寫程序。JDBC是一種底層API,意味著它將直接調(diào)用SQL命令,同時(shí)也是構(gòu)造高層API和數(shù)據(jù)庫開發(fā)工具的基礎(chǔ)。高層API和數(shù)據(jù)庫開發(fā)工具應(yīng)該使用戶界面更加友好,使用更加方便和易于理解。不過所有這樣的API最終將被翻譯為像JDBC這樣的底層API。兩種基于JDBC的高層API,一種是SQL語言嵌入Java的預(yù)處理器,另一種是實(shí)現(xiàn)從關(guān)系數(shù)據(jù)庫到Java類的直接映射,目前都正處于開發(fā)階段。,,由于JDBC帶
4、來的便捷,越來越多的程序員已經(jīng)開始利用JDBC為基礎(chǔ)的工具進(jìn)行開發(fā),使開發(fā)工作更加容易。而程序員同時(shí)也正在開發(fā)讓最終用戶更加容易訪問數(shù)據(jù)庫的應(yīng)用程序,Java程序通過JDBC訪問數(shù)據(jù)庫的關(guān)系如圖11-1所示。,,,圖11-1 Java程序通過JDBC訪問數(shù)據(jù)庫,,11.2 JDBC的結(jié)構(gòu)11.2.1 JDBC APIJDBC API是面向程序員的,Java程序員通過調(diào)用此API可以實(shí)現(xiàn)連接數(shù)據(jù)庫,執(zhí)行SQL語句并返回結(jié)果集。JDBC API主要由一系列的接口定義所構(gòu)成,主要的接口如表11-1所示。,,,11.2.2 JDBC Driver API面向底層的JDBC Driver API 主要是
5、針對數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫底層驅(qū)動(dòng)程序使用的,一般情況下用于開發(fā)應(yīng)用程序的程序員用不到這些類庫。Java的應(yīng)用程序員通過SQL包中定義的一系列抽象類對數(shù)據(jù)庫進(jìn)行操作,而實(shí)現(xiàn)這些抽象類并完成實(shí)際操作,則是由數(shù)據(jù)庫驅(qū)動(dòng)器Driver運(yùn)行的,最終保證Java程序員通過JDBC實(shí)現(xiàn)對不同數(shù)據(jù)庫的操作。其結(jié)構(gòu)如圖11-2所示。,,,圖11-2 JDBC Driver API結(jié)構(gòu)圖,,11.3 JDBC驅(qū)動(dòng)程序的類型目前比較常見的JDBC驅(qū)動(dòng)程序可分為以下四種。1JDBC-ODBC和ODBC驅(qū)動(dòng)程序這種驅(qū)動(dòng)器通過ODBC驅(qū)動(dòng)器提供數(shù)據(jù)庫連接。JDBC在設(shè)計(jì)上和ODBC很類似,JDBC和數(shù)據(jù)庫的連接方法之一是
6、先建立起一個(gè)JDBC-ODBC橋接器。由于微軟產(chǎn)品ODBC驅(qū)動(dòng)程序已經(jīng)被廣泛應(yīng)用,因此建立這種橋接器后,JDBC就有能力訪問各種類型的數(shù)據(jù)庫。使用這種驅(qū)動(dòng)器,要求每一臺(tái)客戶機(jī)都要裝入ODBC的驅(qū)動(dòng)器。,,2Native-API partly-Java Driver/本地API這種驅(qū)動(dòng)方式將數(shù)據(jù)庫廠商的特殊協(xié)議轉(zhuǎn)化成Java代碼以及二進(jìn)制類碼,使Java數(shù)據(jù)庫客戶與數(shù)據(jù)庫服務(wù)器通信。各客戶機(jī)使用的數(shù)據(jù)庫可能各不相同,需要在客戶機(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é)議形式。這
7、種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫上。有關(guān)DBMS的協(xié)議由各數(shù)據(jù)庫廠商決定。這種驅(qū)動(dòng)器可以連接到不同的數(shù)據(jù)庫上,是最為靈活的JDBC驅(qū)動(dòng)程序。將來也許所有這種解決方案的提供者都能提供適合于Intranet用的產(chǎn)品。為了使這些產(chǎn)品也支持廣域網(wǎng)存取,它們必須處理Web所提出的安全性、通過防火墻的訪問等方面的要求。目前一些廠商已經(jīng)開始將JDBC驅(qū)動(dòng)程序加到他們現(xiàn)有的數(shù)據(jù)庫中間件產(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訪問的一個(gè)很實(shí)用的解決方法。以上四種
8、驅(qū)動(dòng)程序中,后兩種都是純Java driver,相對效率更高,更具有通用性;但前兩種比較容易獲得,使用比較普遍一些。,,,11.4 JDBC在數(shù)據(jù)庫訪問中的應(yīng)用JDBC與Acess、SQL Server、Oracle等各種數(shù)據(jù)庫的連接,首先需要準(zhǔn)備相應(yīng)的運(yùn)行環(huán)境,本例采用JDK1.5.0作為開發(fā)工具,使用Eclipse 3.2集成開發(fā)環(huán)境,可以提供一些演示功能。操作系統(tǒng)最好是Windows 2000或者Windows XP,并裝好至少一種數(shù)據(jù)庫。一個(gè)基本的JDBC程序開發(fā)編程步驟主要包含以下7步:,,(1) 引入相應(yīng)的類和包(import java.sql.*)。(2) 加載合適的JDBC驅(qū)動(dòng)
9、程序(Load the Driver)。(3) 連接數(shù)據(jù)庫(Connect to the DataBase)。(4) 執(zhí)行SQL語句(Execute the SQL): Connection.CreateStatement( ); .executeQuery( ); .executeUpdate( )。,,(5) 從取得的ResultSet對象中獲取結(jié)果(Retrieve the result data)。(6) 將數(shù)據(jù)庫中各種類型轉(zhuǎn)換為Java中的類型,通過getXXX 方法(Show the result data)。(7) 關(guān)閉(Close): close the resultset對象
10、; close the statement對象; close the connection對象。下面按照J(rèn)DBC編程步驟詳細(xì)介紹JDBC在數(shù)據(jù)庫訪問中的應(yīng)用。,,11.4.1 建立與數(shù)據(jù)庫的連接1設(shè)置數(shù)據(jù)源在數(shù)據(jù)庫連接之前需要加載相應(yīng)的數(shù)據(jù)源(采用JDBC-ODBC和ODBC驅(qū)動(dòng)程序)。下面以SQL Server數(shù)據(jù)庫為例簡要說明如何設(shè)置數(shù)據(jù)源。一般是在控制面板的管理工具中打開ODBC項(xiàng),出現(xiàn)ODBC數(shù)據(jù)源管理器對話框,然后選擇User DSN選項(xiàng)卡,單擊Add按鈕,選擇想為其安裝數(shù)據(jù)源的驅(qū)動(dòng)程序,并點(diǎn)擊完成,接著會(huì)出現(xiàn)創(chuàng)建到SQL Server的新數(shù)據(jù)源,如圖11-3所示。按照此向?qū)б徊讲酵?/p>
11、下操作,直到數(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.JdbcOdbcDriver。然后聲明如下的對象:ResultSet rs = null; Connection conn = null; Connection代表和數(shù)據(jù)庫的連接,連接過程包括所執(zhí)行的SQL語句和該連接上返回的結(jié)果,,3裝載驅(qū)動(dòng)程序與數(shù)據(jù)庫連接之前還需要裝載驅(qū)動(dòng)程序。一般常用的是
12、Class.forName( )方法顯示裝載驅(qū)動(dòng),如果采用JDBC-ODBC和ODBC驅(qū)動(dòng)程序,用下列代碼裝載:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Class是java.lang包中的一個(gè)類,該類通過調(diào)用它的靜態(tài)方法forName就可以建立JDBC-ODBC橋接器。執(zhí)行該代碼將裝載驅(qū)動(dòng),并且在裝載時(shí),驅(qū)動(dòng)將自動(dòng)向JDBC注冊自己。使用Class.forName( )方法可能拋出異常,因此在驅(qū)動(dòng)程序類有可能不存在時(shí),需要捕獲這個(gè)異常,標(biāo)準(zhǔn)是:,,try //注冊數(shù)據(jù)庫Class.forName((sun.jdbc.odbc.JdbcOdb
13、cDriver);//捕獲異常catch(Java.lang.ClassNotFoundException e)System.err.println(e.getMessage( )); ,,4連接到數(shù)據(jù)庫與數(shù)據(jù)庫建立連接的標(biāo)準(zhǔn)方法是調(diào)用DriverManager.getConnection,該方法接受含有某個(gè)url的字符串。DriverManager類是JDBC管理層,嘗試找到可與指定url所代表的數(shù)據(jù)庫進(jìn)行連接的驅(qū)動(dòng)程序如下:String url = “jdbc:odbc:數(shù)據(jù)源名字”;Connection conn = DriverManager.getConnection(url,數(shù)據(jù)
14、源登錄名,數(shù)據(jù)源登錄密碼);,,第一條語句定義了一個(gè)字符串變量,變量內(nèi)容是一種JDBC連接所特定的URL。JDBC URL的標(biāo)準(zhǔn)語法是:jdbc:子協(xié)議:子名稱,其中JDBCURL中協(xié)議總是jdbc。如果采用JDBC-ODBC橋驅(qū)動(dòng),JDBC URL以jdbc:odbc開始,余下URL通常是數(shù)據(jù)源名字或數(shù)據(jù)庫系統(tǒng)。例如使用ODBC存取名為library的ODBC數(shù)據(jù)源,JDBCURL是jdbc:odbc: library。第二條語句通過調(diào)用getConnection方法創(chuàng)建與數(shù)據(jù)庫的連接,并返回一個(gè)Connection對象。,,11.4.2 執(zhí)行查詢語句與數(shù)據(jù)庫建立連接成功后,就可以向所建立連
15、接的數(shù)據(jù)庫傳送SQL語句,其中JDBC對能夠被發(fā)送的SQL語句類型不加任何限制。在和數(shù)據(jù)庫建立連接后,使用三種對象Statement、PreparedStatement和CallableStatement查詢數(shù)據(jù)庫。在建立了SQL對象后,這個(gè)對象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對數(shù)據(jù)庫的查詢和修改,并將查詢結(jié)果存放在一個(gè)ResultSet類聲明的對象中,也就是說,SQL語句對數(shù)據(jù)庫的查詢操作將返回一個(gè)ResultSet對象。,,1StatementStatement對象實(shí)現(xiàn)對數(shù)據(jù)庫的一般查詢功能,在JDBC里面可采用Statement對象來實(shí)現(xiàn)發(fā)送SQL語句到數(shù)據(jù)庫。Statement對象可把簡單查詢
16、語句發(fā)送到數(shù)據(jù)庫,允許執(zhí)行簡單的查詢。,,(1) 創(chuàng)建對象。首先創(chuàng)建一個(gè)Statement對象,它封裝代表要執(zhí)行的SQL語句,并執(zhí)行SQL語句以返回一個(gè)ResultSet對象,通過Connection類中的createStatement( )方法來實(shí)現(xiàn)。對象執(zhí)行后得到正確的結(jié)果:Statement stmt = con.createStatement( );,,(2) 執(zhí)行SQL查詢語句,查詢數(shù)據(jù)庫中的數(shù)據(jù)。Statement接口有三個(gè)查詢方法:executeQuery( )、executeUpdate( )和execute( )。executeQuery( )方法執(zhí)行簡單的選擇查詢,例如SE
17、LECT語句。executeQuery的參數(shù)是String對象,返回的是一個(gè)ResultSet類的對象。executeUpdate( )方法執(zhí)行SQL的UPDATE、INSERT或DELETE語句,返回整數(shù)值,并給出受查詢影響的行數(shù)。,,execute( )方法中execute 用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語句,一般不需要此功能,如:ResultSet rs = stmt.executeQuery(“Select * from Student_info”);stmt.executeUpdate(update Student_info set age=20 where nam
18、e=張杰);,,2PreparedStatementPreparedStatement對象實(shí)現(xiàn)預(yù)編譯方式執(zhí)行SQL語句,由于Statement對象在每次執(zhí)行SQL語句時(shí)都將該語句傳給數(shù)據(jù)庫,如果需要多次執(zhí)行同一條SQL語句,就將導(dǎo)致執(zhí)行效率特別低,此時(shí)可以采用PreparedStatement對象來封裝SQL語句。Prepared對象可以將SQL語句傳給數(shù)據(jù)庫作預(yù)編譯,以提高執(zhí)行速度。另外,PreparedStatement對象允許執(zhí)行參數(shù)化的查詢,可以用不同的輸入?yún)?shù)來多次執(zhí)行編譯過的語句。,,(1) 創(chuàng)建PreparedStatement對象:PreparedStatment pstmt
19、= con.prepareStatement(“Select * from 學(xué)生信息表”);(2) 執(zhí)行查詢語句:ResultSet rs = pstmt.exectueQuery( );該條語句可以多次被執(zhí)行,,3CallableStatementCallableStatement對象主要用于執(zhí)行數(shù)據(jù)庫中的存儲(chǔ)過程。存儲(chǔ)過程是數(shù)據(jù)庫已經(jīng)存在的SQL查詢語句,執(zhí)行存儲(chǔ)過程的結(jié)果同執(zhí)行相應(yīng)的SQL語句是一樣的。,,(1) 創(chuàng)建CallableStatement對象,一般格式為“call procedurename( )”,是不帶輸入?yún)?shù)的存儲(chǔ)過程,其中procedurename是存儲(chǔ)過程的名稱。
20、帶輸入?yún)?shù)的存儲(chǔ)過程為“call procedurename (?, ?)”。而帶輸入?yún)?shù)并有返回結(jié)果參數(shù)的存儲(chǔ)過程為“? = call procedurename (?, ?, ...)”。例如:CallableStatement cstmt = con.prepareCall(call Query1( ));,,(2) 執(zhí)行存儲(chǔ)過程。CallableStatement類是PreparedStatement類的子類,可以使用在PreparedStatement類及Statement類中的方法。因此執(zhí)行存儲(chǔ)過程可調(diào)用executeQuery( )方法來實(shí)現(xiàn),如:ResultSet rs = c
21、stmt.executeQuery( );,,4ResultSet執(zhí)行完畢SQL語句后,將返回一個(gè)ResultSet類的對象,它包含所有的查詢結(jié)果,也就是將查詢結(jié)果封裝在ResultSet對象中。ResultSet實(shí)際上是一張表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。,,ResultSet類的對象方式依賴于光標(biāo)(Cursor)的類型,對Resultset對象的處理必須逐步進(jìn)行,而對每一行中的各個(gè)列可以按任何順序進(jìn)行處理。ResultSet對象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。最初,光標(biāo)被置于第一行之前。next( )方法將光標(biāo)移動(dòng)到下一行,因?yàn)樵摲椒ㄔ?ResultSet對象沒有下
22、一行時(shí)返回 false,所以可以在while循環(huán)中使用它來迭代結(jié)果集。ResultSet對象通過getXXX( )方法來獲得某一列的數(shù)據(jù),這里XXX代表列的數(shù)據(jù)類型,如getInt( )、getString( )、getDate( )等。其中g(shù)etXXX(int cn)中cn指結(jié)果集中的列號,getXXX(String colName)中colName代表列名。,,例如:Statement stmt = con.creatStatement( );ResultSet rs= stmt.executeQuery(Select * from 學(xué)生信息表); while(rs.next( )) St
23、ring name=rs.getString(student_name);,,5查詢數(shù)據(jù)庫示例以下是通過JDBC連接SQL Server 2000數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫查詢的示例。首先創(chuàng)建Statement對象,接著執(zhí)行SQL語句,查詢表dept_info中的信息,然后返回一個(gè)ResultSet類的對象,包含查詢到dept_info表中deptno和deptname的數(shù)據(jù)。其中數(shù)據(jù)庫library中dept_info表的數(shù)據(jù)如圖11-4所示。,,,圖11-4 dept_info表,查詢數(shù)據(jù)庫中的數(shù)據(jù)首先要建立和數(shù)據(jù)庫的連接。本例采用本地協(xié)議純Java驅(qū)動(dòng)程序,不需要數(shù)據(jù)源的設(shè)置。建立和數(shù)據(jù)庫的連接步
24、驟如下:(1)下載SQL Sever 2000的驅(qū)動(dòng)程序包,這個(gè)可以從微軟的網(wǎng)站上下載(http:// 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 Se
25、rver 2000libmsbase.jar;D:SQL Server 2000libmsutil.jar;,,(3) 裝載驅(qū)動(dòng)程序并建立連接:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);聲明數(shù)據(jù)庫驅(qū)動(dòng)String driver = “jdbc:microsoft:sqlserver://localhost:1433”;Connection conn = DriverManager.getConnection(driver,“”,“”); 建立數(shù)據(jù)庫連接查詢數(shù)據(jù)庫具體代碼如下所述。,,【示例11-1】 TestJD
26、BC.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;,,co
27、nn = 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 (
28、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ù)庫
29、操作和數(shù)據(jù)庫建立連接后,除了要實(shí)現(xiàn)對數(shù)據(jù)庫的查詢操作外,在很多實(shí)際應(yīng)用中,經(jīng)常要實(shí)現(xiàn)對數(shù)據(jù)庫的更新操作,主要包括對數(shù)據(jù)庫表中的記錄進(jìn)行修改、插入和刪除操作,以及數(shù)據(jù)庫中表的創(chuàng)建和刪除等操作,并通過Statement對象調(diào)用方法。以下是通過JDBC連接SQL Server 2000數(shù)據(jù)庫的更新操作。,,1對數(shù)據(jù)庫進(jìn)行修改、插入和刪除操作通過SQL語句對數(shù)據(jù)庫中表的記錄進(jìn)行修改、插入和刪除操作,其中executeUpdate( )方法的輸入?yún)?shù)仍然為一個(gè)String對象(即所要執(zhí)行的SQL語句),但輸出參數(shù)不是ResultSet對象,而是一個(gè)整數(shù)(它代表操作所影響的記錄行數(shù))。,,(1) 修改操作
30、。下列語句將學(xué)生信息表中張?zhí)鸬哪挲g字段值修改為22:Statement stmt = conn.createStatement( );String sql = “update Student_info set age=22 where name=張?zhí)稹?;stmt.executeUpdate(sql);,,(2) 插入操作。下列語句將給學(xué)生信息表中增加一條新記錄王紅,20,陜西:Statement stmt = conn.createStatement( );String sql = “insert into Student_info values (王紅,20,陜西)”;stmt.execut
31、eUpdate(sql);,,(3) 刪除操作。下列語句刪除了學(xué)生信息表中李明的記錄:Statement stmt = conn.createStatement( );String sql = “delete from Student_info where name=李明”;stmt.executeUpdate(sql);,,2創(chuàng)建和刪除表通過SQL的Create Table和Drop Table語句可實(shí)現(xiàn)對表的創(chuàng)建和刪除。(1) 創(chuàng)建表的語句如下:Statement stmt=con.createStatement( ); stmt.executeUpdate(“create table
32、TableName(ID INTEGER, Name VARCHAR(20))”);(2) 刪除表的語句如下:Statement stmt=con.createStatement( );stmt.executeUpdate(Drop TableName );,,3增加和刪除表中的列對一個(gè)表的列進(jìn)行更新操作主要是使用SQL的Alter Table語句,需要注意的是對列所進(jìn)行的更新操作會(huì)影響到表中的所有行。(1) 增加表中的一列。在TableName表中增加一列Address,數(shù)據(jù)類型為字符串。Statement stmt=con.createStatement( );stmt.executeUp
33、date(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ù)通過Statement對象除了對數(shù)據(jù)庫進(jìn)行SQL的操作之外,事務(wù)控制也是一種主要的應(yīng)用。事務(wù)控制在建立數(shù)據(jù)庫驅(qū)動(dòng)應(yīng)用程序的時(shí)候是一個(gè)很重要的問題。在數(shù)據(jù)庫中,事務(wù)是指一組邏輯操作單元
34、,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。在JDBC的數(shù)據(jù)庫操作中,一項(xiàng)事務(wù)是由一條或是多條表達(dá)式組成的一個(gè)不可分隔的工作單元。通過提交commit( )或是回退rollback( )來結(jié)束事務(wù)的操作,也就是當(dāng)調(diào)用方法commit或rollback時(shí),當(dāng)前事務(wù)即結(jié)束,而另一個(gè)事務(wù)隨即開始。關(guān)于事務(wù)操作的方法都位于接口java.sql.Connection中。,,在JDBC中,事務(wù)操作默認(rèn)是自動(dòng)提交的。一條對數(shù)據(jù)庫的更新表達(dá)式代表一項(xiàng)事務(wù)操作,成功后,系統(tǒng)將自動(dòng)調(diào)用commit( )來提交;否則,將調(diào)用rollback( )來回退。其中,方法commit使SQL語句對數(shù)據(jù)庫所做的任何更改成為永久性的,
35、它還將釋放事務(wù)持有的全部鎖。而方法rollback將棄去那些更改。有時(shí)用戶在另一個(gè)更改生效前不想讓此更改生效,這可通過調(diào)用setAutoCommit(false)禁用自動(dòng)提交并將兩個(gè)更新組合在一個(gè)事務(wù)中來達(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)后開始的操作應(yīng)全部回到開始狀態(tài)。大多數(shù)JDBC驅(qū)動(dòng)程序都支持事務(wù)。事實(shí)上,符合JDBC的驅(qū)動(dòng)程序必須支持事務(wù)。其中Dat
36、abaseMetaData給出的信息描述了DBMS所提供的事務(wù)支持水平。,,,11.5 JDBC綜合應(yīng)用示例本節(jié)以一個(gè)簡單的圖書借閱系統(tǒng)中對圖書信息的操作為例,講解JDBC在數(shù)據(jù)庫連接中的應(yīng)用,包括詳細(xì)的數(shù)據(jù)源設(shè)置以及實(shí)現(xiàn)對圖書信息的增加、刪除、修改和查詢的操作。本例的數(shù)據(jù)庫采用SQL Server 2000,對數(shù)據(jù)庫的訪問采用便于理解的JDBC-ODBC方式。,,11.5.1 建立數(shù)據(jù)庫首先在SQL Server 2000數(shù)據(jù)庫中建立數(shù)據(jù)庫library,并在數(shù)據(jù)庫library中創(chuàng)建book_info表。也可以在與數(shù)據(jù)庫library建立連接后通過SQL語句創(chuàng)建book_info表,如下:
37、,,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ù)庫表book_info的數(shù)據(jù)庫結(jié)構(gòu)如表11-2所示。初始的book_info數(shù)據(jù)表如圖11-5所示,表中已有兩條圖書信息。,,,,圖11-5 初始的book_info數(shù)據(jù)表,11.5.2 建立數(shù)據(jù)源為了同上一
38、節(jié)中建立的數(shù)據(jù)庫建立連接,需要配置一個(gè)ODBC數(shù)據(jù)源try,步驟如下。步驟一:在開始-設(shè)置-控制面版(Win98、NT4.0)中選取“數(shù)據(jù)源(ODBC)”;在Windows XP中“數(shù)據(jù)源(ODBC)”位于“開始-設(shè)置-控制面版-管理工具”或“開始-程序-管理工具”下。步驟二:啟動(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-
39、10所示創(chuàng)建到SQL Server的新數(shù)據(jù)源的對話框,并按此向?qū)顚憙?nèi)容。點(diǎn)擊“下一步”,選擇使用網(wǎng)絡(luò)登錄ID的Windows NT驗(yàn)證,接著點(diǎn)擊“下一步”,并更改默認(rèn)的數(shù)據(jù)庫為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對話框,點(diǎn)擊“測試數(shù)據(jù)源”,出現(xiàn)測試結(jié)果界面,如圖11-11所示。以上步驟就完成了對數(shù)據(jù)源的設(shè)置。,,,圖1
40、1-11 SQL Server ODBC數(shù)據(jù)源測試界面,11.5.3 數(shù)據(jù)庫操作程序本書采用JDK 1.5.0作為開發(fā)工具,使用Eclipse 3.2集成開發(fā)環(huán)境。首先在Eclipse中File菜單中新建一個(gè)Project工程,選擇Java文件夾下的Java Project選項(xiàng),并點(diǎn)擊下一步,出現(xiàn)如圖11-12所示的對話框。新建jdbc工程名,最后點(diǎn)擊完成。這樣,jdbc,這個(gè)工程就建立好了。接著按照圖11-13把SQL Server驅(qū)動(dòng)程序添加到工程中,找到驅(qū)動(dòng)程序存放的路徑就可以完成這個(gè)操作。,,,圖11-12 創(chuàng)建Java Project,,圖11-13 添加驅(qū)動(dòng)程序,其次就是代碼的編寫
41、,右鍵點(diǎn)擊工程名jdbc,新建一個(gè) dbconnect類?!臼纠?1-2】 dbconnect.java。import java.sql.*;public class dbconnect public static void main(String args) String dbDriver = sun.jdbc.odbc.JdbcOdbcDriver;//聲明數(shù)據(jù)庫驅(qū)動(dòng)String driver = jdbc:odbc:library;//聲明數(shù)據(jù)源Connection con = null;String query = select * from book_info;,,ResultSet
42、 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ù)庫連接con = DriverManager.getConnection(driver, sa, 123);//將數(shù)據(jù)庫連接設(shè)置為自動(dòng)提交模式con.setAutoCommit(true);stmt =
43、 con.createStatement( );//執(zhí)行insert into語句,增加兩條圖書信息stmt.executeUpdate(insert into book_info (BookId,BookName) values200803,英語口語技能));stmt.executeUpdate(insert into book_info (BookId,BookName) values(200804, JSP入門));,,queryBooks(con, stmt, query);//執(zhí)行一個(gè)update語句,更新數(shù)據(jù)庫,修改200803圖書編號的書名stmt.executeUpdate(u
44、pdate book_info set BookName=基礎(chǔ)英語口語技能 where BookId=003);queryBooks(con, stmt, query);//執(zhí)行一個(gè)delete語句,刪除一條圖書信息stmt.executeUpdate(delete from book_info where BookId=200804);queryBooks(con, stmt, query);,,stmt.close( );con.close( );//上面的語句關(guān)閉聲明和連接 catch (SQLException ex) System.err.println(SQLException:
45、+ ex.getMessage( ));,,private static void queryBooks(Connection con, Statement stmt, String query) try //返回一個(gè)結(jié)果集ResultSet rs = stmt.executeQuery(query);//下面的語句使用了一個(gè)while循環(huán),打印出了book_info表中的所有數(shù)據(jù)System.out.println(book_info表中的數(shù)據(jù)如下);System.out.println(圖書編號 + + 書名);while (rs.next( )) ,,//取得數(shù)據(jù)庫中的數(shù)據(jù)String
46、 s = rs.getString(“BookId”);String f = rs.getString(“BookName”);System.out.println(s + “ ” + f);rs.close( ); catch (SQLException ex) System.err.println(SQLException: + ex.getMessage( ));,,代碼編寫完成后,點(diǎn)擊Run菜單欄,在Console中顯示結(jié)果,如圖11-14所示。在圖書借閱系統(tǒng)中,dbconnect.java程序通過JDBC實(shí)現(xiàn)了對圖書信息進(jìn)行增加、修改、刪除的操作,同時(shí)SQL Server數(shù)據(jù)庫lib
47、rary中的book_info表的數(shù)據(jù)同步改變,如圖11-15圖11-17所示。,,,圖11-14 Eclipse操作界面,,圖11-15 數(shù)據(jù)庫Library中book_info表(一),,圖11-16 數(shù)據(jù)庫Library中book_info表(二),,圖11-17 數(shù)據(jù)庫library中book_info表(三),,本 章 小 結(jié)JDBC是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫系統(tǒng)的應(yīng)用程序編程接口。有了JDBC,Java程序員可以用Java語言來編寫完整的數(shù)據(jù)庫方面的應(yīng)用程序,另外也可以操作保存在多種不同的數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù),而與數(shù)據(jù)庫管理系統(tǒng)中數(shù)據(jù)存儲(chǔ)的格式無關(guān)。,,本章簡單
48、介紹了Java與數(shù)據(jù)庫連接的JDBC技術(shù)。首先對JDBC的功能和結(jié)構(gòu)進(jìn)行了概述,其次介紹了四種類型的JDBC驅(qū)動(dòng)程序以及按照J(rèn)DBC編程步驟實(shí)現(xiàn)JDBC在數(shù)據(jù)庫訪問中的應(yīng)用,最后通過一個(gè)具體實(shí)例講解了JDBC在數(shù)據(jù)庫連接中的實(shí)際應(yīng)用。,,,習(xí) 題1. 簡述JDBC驅(qū)動(dòng)程序的四種類型。2. 有哪些方法可以發(fā)送訪問、操作數(shù)據(jù)庫的SQL語句? 如何處理對數(shù)據(jù)庫訪問操作的結(jié)果? 如何獲得關(guān)于數(shù)據(jù)庫的信息?3. 編寫一個(gè)數(shù)據(jù)庫程序,實(shí)現(xiàn)對學(xué)生成績的查詢、修改、刪除功能。4. 建立一個(gè)Book.mdb數(shù)據(jù)庫,該數(shù)據(jù)庫包含4個(gè)表:Authors、Publishers、AuthorISBN 和Title,各表描述如表11-3表11-6所示。,,,,,,,,,(1) 編寫程序建立數(shù)據(jù)庫,并錄入相關(guān)數(shù)據(jù)。(2) 編寫程序?qū)itle表的全部數(shù)據(jù)輸出。(3) 編寫程序,查詢姓張的作者出版的所有書籍的詳細(xì)信息。(4) 編寫程序,在表 AuthorISBN中插入2條新記錄。(5) 編寫程序,刪除1997年出版的所有書籍。,,,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 指向核心素養(yǎng)發(fā)展的高中生物學(xué)1輪復(fù)習(xí)備考建議
- 新課程新評價(jià)新高考導(dǎo)向下高三化學(xué)備考的新思考
- 新時(shí)代背景下化學(xué)高考備考策略及新課程標(biāo)準(zhǔn)的高中化學(xué)教學(xué)思考
- 2025屆江西省高考政治二輪復(fù)習(xí)備考建議
- 新教材新高考背景下的化學(xué)科學(xué)備考策略
- 新高考背景下的2024年高考化學(xué)二輪復(fù)習(xí)備考策略
- 2025屆高三數(shù)學(xué)二輪復(fù)習(xí)備考交流會(huì)課件
- 2025年高考化學(xué)復(fù)習(xí)研究與展望
- 2024年高考化學(xué)復(fù)習(xí)備考講座
- 2025屆高考數(shù)學(xué)二輪復(fù)習(xí)備考策略和方向
- 2024年感動(dòng)中國十大人物事跡及頒獎(jiǎng)詞
- XX教育系統(tǒng)單位述職報(bào)告教育工作概述教育成果展示面臨的挑戰(zhàn)未來規(guī)劃
- 2025《增值稅法》全文解讀學(xué)習(xí)高質(zhì)量發(fā)展的增值稅制度規(guī)范增值稅的征收和繳納
- 初中資料:400個(gè)語文優(yōu)秀作文標(biāo)題
- 初中語文考試專項(xiàng)練習(xí)題(含答案)