java程序設(shè)計教程第11章.ppt_第1頁
java程序設(shè)計教程第11章.ppt_第2頁
java程序設(shè)計教程第11章.ppt_第3頁
java程序設(shè)計教程第11章.ppt_第4頁
java程序設(shè)計教程第11章.ppt_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

,第11章 數(shù)據(jù)庫編程,11.1 JDBC技術(shù)簡介 11.2 JDBC的結(jié)構(gòu) 11.3 JDBC驅(qū)動程序的類型 11.4 JDBC在數(shù)據(jù)庫訪問中的應用 11.5 JDBC綜合應用示例 本章小結(jié) 習題,11.1 JDBC技術(shù)簡介 JDBC(Java DataBase Connectivity)是Java語言為了支持SQL功能而提供的與數(shù)據(jù)庫相連的用戶接口。JDBC中包括了一組由Java語言編寫的接口和類,都獨立于特定的DBMS,或者說它們可以和各種數(shù)據(jù)相關(guān)聯(lián),即獨立于數(shù)據(jù)庫管理系統(tǒng)DBMS的應用提供了能與多個不同數(shù)據(jù)庫連接的通用接口。這對于數(shù)據(jù)庫程序來說,想要訪問多種數(shù)據(jù)庫,只需要一個統(tǒng)一的接口就可以實現(xiàn)。,在Java中JDBC提供了Java訪問數(shù)據(jù)庫平臺統(tǒng)一的API。JDBC實際上就是由Java實現(xiàn)的數(shù)據(jù)庫訪問中間件。程序員可以通過JDBC向各種關(guān)系型數(shù)據(jù)庫發(fā)送SQL語句,只需要使用JDBC提供的幾個類(對象)或接口即可,而不必為不同的數(shù)據(jù)庫編寫不同的程序。有了JDBC以后,對于數(shù)據(jù)庫編程,程序員只需要在Java語言中使用SQL語言,使Java應用程序或Java Applet實現(xiàn)對分布在網(wǎng)絡(luò)上的各種數(shù)據(jù)庫的訪問,而不用考慮底層具體DBMS的連接和訪問過程。,JDBC由一組Java語言編寫的接口和類組成,使用內(nèi)嵌式的SQL,主要實現(xiàn)三大功能: (1) 建立與數(shù)據(jù)庫的連接; (2) 執(zhí)行SQL聲明,向數(shù)據(jù)庫發(fā)送SQL語句; (3) 處理數(shù)據(jù)庫返回的SQL執(zhí)行結(jié)果。,JDBC支持基本的SQL功能,使用它可以方便地與不同的關(guān)系數(shù)據(jù)庫建立連接,進行相關(guān)操作,無須再為不同的DBMS分別編寫程序。JDBC是一種底層API,意味著它將直接調(diào)用SQL命令,同時也是構(gòu)造高層API和數(shù)據(jù)庫開發(fā)工具的基礎(chǔ)。高層API和數(shù)據(jù)庫開發(fā)工具應該使用戶界面更加友好,使用更加方便和易于理解。不過所有這樣的API最終將被翻譯為像JDBC這樣的底層API。兩種基于JDBC的高層API,一種是SQL語言嵌入Java的預處理器,另一種是實現(xiàn)從關(guān)系數(shù)據(jù)庫到Java類的直接映射,目前都正處于開發(fā)階段。,由于JDBC帶來的便捷,越來越多的程序員已經(jīng)開始利用JDBC為基礎(chǔ)的工具進行開發(fā),使開發(fā)工作更加容易。而程序員同時也正在開發(fā)讓最終用戶更加容易訪問數(shù)據(jù)庫的應用程序,Java程序通過JDBC訪問數(shù)據(jù)庫的關(guān)系如圖11-1所示。,圖11-1 Java程序通過JDBC訪問數(shù)據(jù)庫,11.2 JDBC的結(jié)構(gòu) 11.2.1 JDBC API JDBC API是面向程序員的,Java程序員通過調(diào)用此API可以實現(xiàn)連接數(shù)據(jù)庫,執(zhí)行SQL語句并返回結(jié)果集。JDBC API主要由一系列的接口定義所構(gòu)成,主要的接口如表11-1所示。,11.2.2 JDBC Driver API 面向底層的JDBC Driver API 主要是針對數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫底層驅(qū)動程序使用的,一般情況下用于開發(fā)應用程序的程序員用不到這些類庫。Java的應用程序員通過SQL包中定義的一系列抽象類對數(shù)據(jù)庫進行操作,而實現(xiàn)這些抽象類并完成實際操作,則是由數(shù)據(jù)庫驅(qū)動器Driver運行的,最終保證Java程序員通過JDBC實現(xiàn)對不同數(shù)據(jù)庫的操作。其結(jié)構(gòu)如圖11-2所示。,圖11-2 JDBC Driver API結(jié)構(gòu)圖,11.3 JDBC驅(qū)動程序的類型 目前比較常見的JDBC驅(qū)動程序可分為以下四種。 1JDBC-ODBC和ODBC驅(qū)動程序 這種驅(qū)動器通過ODBC驅(qū)動器提供數(shù)據(jù)庫連接。JDBC在設(shè)計上和ODBC很類似,JDBC和數(shù)據(jù)庫的連接方法之一是先建立起一個JDBC-ODBC橋接器。由于微軟產(chǎn)品ODBC驅(qū)動程序已經(jīng)被廣泛應用,因此建立這種橋接器后,JDBC就有能力訪問各種類型的數(shù)據(jù)庫。使用這種驅(qū)動器,要求每一臺客戶機都要裝入ODBC的驅(qū)動器。,2Native-API partly-Java Driver/本地API 這種驅(qū)動方式將數(shù)據(jù)庫廠商的特殊協(xié)議轉(zhuǎn)化成Java代碼以及二進制類碼,使Java數(shù)據(jù)庫客戶與數(shù)據(jù)庫服務器通信。各客戶機使用的數(shù)據(jù)庫可能各不相同,需要在客戶機上裝有相應DBMS的驅(qū)動程序。,3JDBC網(wǎng)絡(luò)純Java驅(qū)動程序 這種驅(qū)動程序?qū)DBC指令轉(zhuǎn)化成獨立于DBMS的網(wǎng)絡(luò)協(xié)議形式,再由服務器轉(zhuǎn)化為特定DBMS的協(xié)議形式。這種網(wǎng)絡(luò)服務器中間件能夠?qū)⑺募僇ava客戶機連接到多種不同的數(shù)據(jù)庫上。有關(guān)DBMS的協(xié)議由各數(shù)據(jù)庫廠商決定。這種驅(qū)動器可以連接到不同的數(shù)據(jù)庫上,是最為靈活的JDBC驅(qū)動程序。將來也許所有這種解決方案的提供者都能提供適合于Intranet用的產(chǎn)品。為了使這些產(chǎn)品也支持廣域網(wǎng)存取,它們必須處理Web所提出的安全性、通過防火墻的訪問等方面的要求。目前一些廠商已經(jīng)開始將JDBC驅(qū)動程序加到他們現(xiàn)有的數(shù)據(jù)庫中間件產(chǎn)品中。,4本地協(xié)議純Java驅(qū)動程序 這種類型的驅(qū)動程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這相當于客戶機直接與服務器聯(lián)系,是Intranet訪問的一個很實用的解決方法。 以上四種驅(qū)動程序中,后兩種都是純Java driver,相對效率更高,更具有通用性;但前兩種比較容易獲得,使用比較普遍一些。,11.4 JDBC在數(shù)據(jù)庫訪問中的應用 JDBC與Acess、SQL Server、Oracle等各種數(shù)據(jù)庫的連接,首先需要準備相應的運行環(huán)境,本例采用JDK1.5.0作為開發(fā)工具,使用Eclipse 3.2集成開發(fā)環(huán)境,可以提供一些演示功能。操作系統(tǒng)最好是Windows 2000或者Windows XP,并裝好至少一種數(shù)據(jù)庫。一個基本的JDBC程序開發(fā)編程步驟主要包含以下7步:,(1) 引入相應的類和包(import java.sql.*)。 (2) 加載合適的JDBC驅(qū)動程序(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對象; close the statement對象; close the connection對象。 下面按照JDBC編程步驟詳細介紹JDBC在數(shù)據(jù)庫訪問中的應用。,11.4.1 建立與數(shù)據(jù)庫的連接 1設(shè)置數(shù)據(jù)源 在數(shù)據(jù)庫連接之前需要加載相應的數(shù)據(jù)源(采用JDBC-ODBC和ODBC驅(qū)動程序)。下面以SQL Server數(shù)據(jù)庫為例簡要說明如何設(shè)置數(shù)據(jù)源。一般是在控制面板的管理工具中打開ODBC項,出現(xiàn)ODBC數(shù)據(jù)源管理器對話框,然后選擇User DSN選項卡,單擊Add按鈕,選擇想為其安裝數(shù)據(jù)源的驅(qū)動程序,并點擊完成,接著會出現(xiàn)創(chuàng)建到SQL Server的新數(shù)據(jù)源,如圖11-3所示。按照此向?qū)б徊讲酵虏僮?,直到?shù)據(jù)源配置成功,具體步驟將在11.5節(jié)里詳細介紹。,圖11-3 設(shè)置數(shù)據(jù)源,2引入相應的類和包 任何使用JDBC的源程序都需要輸入java.sql包,即import java.sql.*,必要的時候還需要裝載相應的JDBC-ODBC驅(qū)動程序的包,如import sun.jdbc.odbc.JdbcOdbc Driver。然后聲明如下的對象: ResultSet rs = null; Connection conn = null; Connection代表和數(shù)據(jù)庫的連接,連接過程包括所執(zhí)行的SQL語句和該連接上返回的結(jié)果,3裝載驅(qū)動程序 與數(shù)據(jù)庫連接之前還需要裝載驅(qū)動程序。一般常用的是Class.forName( )方法顯示裝載驅(qū)動,如果采用JDBC-ODBC和ODBC驅(qū)動程序,用下列代碼裝載: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Class是java.lang包中的一個類,該類通過調(diào)用它的靜態(tài)方法forName就可以建立JDBC-ODBC橋接器。執(zhí)行該代碼將裝載驅(qū)動,并且在裝載時,驅(qū)動將自動向JDBC注冊自己。使用Class.forName( )方法可能拋出異常,因此在驅(qū)動程序類有可能不存在時,需要捕獲這個異常,標準是:,try /注冊數(shù)據(jù)庫 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); /捕獲異常 catch(Java.lang.ClassNotFoundException e) System.err.println(e.getMessage( ); ,4連接到數(shù)據(jù)庫 與數(shù)據(jù)庫建立連接的標準方法是調(diào)用 DriverManager.getConnection,該方法接受含有某個url的字符串。DriverManager類是JDBC管理層,嘗試找到可與指定url所代表的數(shù)據(jù)庫進行連接的驅(qū)動程序如下: String url = “jdbc:odbc:數(shù)據(jù)源名字”; Connection conn = DriverManager.getConnection(url,“數(shù)據(jù)源登錄名“,“數(shù)據(jù)源登錄密碼“);,第一條語句定義了一個字符串變量,變量內(nèi)容是一種JDBC連接所特定的URL。JDBC URL的標準語法是:jdbc:子協(xié)議:子名稱,其中JDBCURL中協(xié)議總是jdbc。如果采用JDBC-ODBC橋驅(qū)動,JDBC URL以jdbc:odbc開始,余下URL通常是數(shù)據(jù)源名字或數(shù)據(jù)庫系統(tǒng)。例如使用ODBC存取名為“l(fā)ibrary“的ODBC數(shù)據(jù)源,JDBCURL是jdbc:odbc: library。第二條語句通過調(diào)用getConnection方法創(chuàng)建與數(shù)據(jù)庫的連接,并返回一個Connection對象。,11.4.2 執(zhí)行查詢語句 與數(shù)據(jù)庫建立連接成功后,就可以向所建立連接的數(shù)據(jù)庫傳送SQL語句,其中JDBC對能夠被發(fā)送的SQL語句類型不加任何限制。在和數(shù)據(jù)庫建立連接后,使用三種對象Statement、PreparedStatement和CallableStatement查詢數(shù)據(jù)庫。在建立了SQL對象后,這個對象就可以調(diào)用相應的方法實現(xiàn)對數(shù)據(jù)庫的查詢和修改,并將查詢結(jié)果存放在一個ResultSet類聲明的對象中,也就是說,SQL語句對數(shù)據(jù)庫的查詢操作將返回一個ResultSet對象。,1Statement Statement對象實現(xiàn)對數(shù)據(jù)庫的一般查詢功能,在JDBC里面可采用Statement對象來實現(xiàn)發(fā)送SQL語句到數(shù)據(jù)庫。Statement對象可把簡單查詢語句發(fā)送到數(shù)據(jù)庫,允許執(zhí)行簡單的查詢。,(1) 創(chuàng)建對象。首先創(chuàng)建一個Statement對象,它封裝代表要執(zhí)行的SQL語句,并執(zhí)行SQL語句以返回一個ResultSet對象,通過Connection類中的createStatement( )方法來實現(xiàn)。對象執(zhí)行后得到正確的結(jié)果: Statement stmt = con.createStatement( );,(2) 執(zhí)行SQL查詢語句,查詢數(shù)據(jù)庫中的數(shù)據(jù)。 Statement接口有三個查詢方法:executeQuery( )、executeUpdate( )和execute( )。executeQuery( )方法執(zhí)行簡單的選擇查詢,例如SELECT語句。executeQuery的參數(shù)是String對象,返回的是一個ResultSet類的對象。executeUpdate( )方法執(zhí)行SQL的UPDATE、INSERT或DELETE語句,返回整數(shù)值,并給出受查詢影響的行數(shù)。,execute( )方法中execute 用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句,一般不需要此功能,如: ResultSet rs = stmt.executeQuery(“Select * from Student_info”); stmt.executeUpdate(“update Student_info set age=20 where name=張杰“);,2PreparedStatement PreparedStatement對象實現(xiàn)預編譯方式執(zhí)行SQL語句,由于Statement對象在每次執(zhí)行SQL語句時都將該語句傳給數(shù)據(jù)庫,如果需要多次執(zhí)行同一條SQL語句,就將導致執(zhí)行效率特別低,此時可以采用PreparedStatement對象來封裝SQL語句。Prepared對象可以將SQL語句傳給數(shù)據(jù)庫作預編譯,以提高執(zhí)行速度。另外,PreparedStatement對象允許執(zhí)行參數(shù)化的查詢,可以用不同的輸入?yún)?shù)來多次執(zhí)行編譯過的語句。,(1) 創(chuàng)建PreparedStatement對象: PreparedStatment pstmt = con.prepareStatement(“Select * from 學生信息表”); (2) 執(zhí)行查詢語句: ResultSet rs = pstmt.exectueQuery( );該條語句可以多次被執(zhí)行,3CallableStatement CallableStatement對象主要用于執(zhí)行數(shù)據(jù)庫中的存儲過程。存儲過程是數(shù)據(jù)庫已經(jīng)存在的SQL查詢語句,執(zhí)行存儲過程的結(jié)果同執(zhí)行相應的SQL語句是一樣的。,(1) 創(chuàng)建CallableStatement對象,一般格式為“call procedurename( )”,是不帶輸入?yún)?shù)的存儲過程,其中procedurename是存儲過程的名稱。帶輸入?yún)?shù)的存儲過程為“call procedurename (?, ?)”。而帶輸入?yún)?shù)并有返回結(jié)果參數(shù)的存儲過程為“? = call procedurename (?, ?, .)”。例如: CallableStatement cstmt = con.prepareCall(“call Query1( )“);,(2) 執(zhí)行存儲過程。CallableStatement類是PreparedStatement類的子類,可以使用在PreparedStatement類及Statement類中的方法。因此執(zhí)行存儲過程可調(diào)用executeQuery( )方法來實現(xiàn),如: ResultSet rs = cstmt.executeQuery( );,4ResultSet 執(zhí)行完畢SQL語句后,將返回一個ResultSet類的對象,它包含所有的查詢結(jié)果,也就是將查詢結(jié)果封裝在ResultSet對象中。ResultSet實際上是一張表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。,ResultSet類的對象方式依賴于光標(Cursor)的類型,對Resultset對象的處理必須逐步進行,而對每一行中的各個列可以按任何順序進行處理。ResultSet對象具有指向其當前數(shù)據(jù)行的光標。最初,光標被置于第一行之前。next( )方法將光標移動到下一行,因為該方法在 ResultSet對象沒有下一行時返回 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 學生信息表“); while(rs.next( ) String name=rs.getString(“student_name“);,5查詢數(shù)據(jù)庫示例 以下是通過JDBC連接SQL Server 2000數(shù)據(jù)庫進行數(shù)據(jù)庫查詢的示例。首先創(chuàng)建Statement對象,接著執(zhí)行SQL語句,查詢表dept_info中的信息,然后返回一個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ū)動程序,不需要數(shù)據(jù)源的設(shè)置。建立和數(shù)據(jù)庫的連接步驟如下: (1)下載SQL Sever 2000的驅(qū)動程序包,這個可以從微軟的網(wǎng)站上下載(http://download /3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/setup.exe)。默認安裝路徑為c:Program FilesMicrosoft SQL Server 2000 Driver for JDBC。其中l(wèi)ib目錄下的三個 .jar文件即是JDBC驅(qū)動核心,即msbase.jar、mssqlserver.jar、msutil.jar。,(2) 設(shè)置環(huán)境變量。將三個.jar文件加入到環(huán)境變量中。此處安裝驅(qū)動程序后將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ū)動程序并建立連接: Class.forName(“com.microsoft.jdbc.sqlserver .SQLServerDriver”); 聲明數(shù)據(jù)庫驅(qū)動 String driver = “jdbc:microsoft:sqlserver:/localhost:1433”; Connection conn = DriverManager.getConnection (driver,“”,“”); 建立數(shù)據(jù)庫連接 查詢數(shù)據(jù)庫具體代碼如下所述。,【示例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( ); ,程序運行結(jié)果: 1 光電工程學院 2 材料化工學院 3 電子工程學院 4 經(jīng)濟管理學院 5 計算機科學工程學院 6 人文社科學院,11.4.3 更新數(shù)據(jù)庫操作 和數(shù)據(jù)庫建立連接后,除了要實現(xiàn)對數(shù)據(jù)庫的查詢操作外,在很多實際應用中,經(jīng)常要實現(xiàn)對數(shù)據(jù)庫的更新操作,主要包括對數(shù)據(jù)庫表中的記錄進行修改、插入和刪除操作,以及數(shù)據(jù)庫中表的創(chuàng)建和刪除等操作,并通過Statement對象調(diào)用方法。 以下是通過JDBC連接SQL Server 2000數(shù)據(jù)庫的更新操作。,1對數(shù)據(jù)庫進行修改、插入和刪除操作 通過SQL語句對數(shù)據(jù)庫中表的記錄進行修改、插入和刪除操作,其中executeUpdate( )方法的輸入?yún)?shù)仍然為一個String對象(即所要執(zhí)行的SQL語句),但輸出參數(shù)不是ResultSet對象,而是一個整數(shù)(它代表操作所影響的記錄行數(shù))。,(1) 修改操作。下列語句將學生信息表中張?zhí)鸬哪挲g字段值修改為22: Statement stmt = conn.createStatement( ); String sql = “update Student_info set age=22 where name=張?zhí)稹保?stmt.executeUpdate(sql);,(2) 插入操作。下列語句將給學生信息表中增加一條新記錄王紅,20,陜西: Statement stmt = conn.createStatement( ); String sql = “insert into Student_info values (王紅,20,陜西)”; stmt.executeUpdate(sql);,(3) 刪除操作。下列語句刪除了學生信息表中李明的記錄: Statement stmt = conn.createStatement( ); String sql = “delete from Student_info where name=李明”; stmt.executeUpdate(sql);,2創(chuàng)建和刪除表 通過SQL的Create Table和Drop Table語句可實現(xiàn)對表的創(chuàng)建和刪除。 (1) 創(chuàng)建表的語句如下: Statement stmt=con.createStatement( ); stmt.executeUpdate(“create table TableName(ID INTEGER, Name VARCHAR(20)”); (2) 刪除表的語句如下: Statement stmt=con.createStatement( ); stmt.executeUpdate(“Drop TableName “);,3增加和刪除表中的列 對一個表的列進行更新操作主要是使用SQL的Alter Table語句,需要注意的是對列所進行的更新操作會影響到表中的所有行。 (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 事務 通過Statement對象除了對數(shù)據(jù)庫進行SQL的操作之外,事務控制也是一種主要的應用。事務控制在建立數(shù)據(jù)庫驅(qū)動應用程序的時候是一個很重要的問題。在數(shù)據(jù)庫中,事務是指一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。在JDBC的數(shù)據(jù)庫操作中,一項事務是由一條或是多條表達式組成的一個不可分隔的工作單元。通過提交commit( )或是回退rollback( )來結(jié)束事務的操作,也就是當調(diào)用方法commit或rollback時,當前事務即結(jié)束,而另一個事務隨即開始。關(guān)于事務操作的方法都位于接口java.sql.Connection中。,在JDBC中,事務操作默認是自動提交的。一條對數(shù)據(jù)庫的更新表達式代表一項事務操作,成功后,系統(tǒng)將自動調(diào)用commit( )來提交;否則,將調(diào)用rollback( )來回退。其中,方法commit使SQL語句對數(shù)據(jù)庫所做的任何更改成為永久性的,它還將釋放事務持有的全部鎖。而方法rollback將棄去那些更改。有時用戶在另一個更改生效前不想讓此更改生效,這可通過調(diào)用setAutoCommit(false)禁用自動提交并將兩個更新組合在一個事務中來達到。,如果兩個更新都是成功的,則調(diào)用commit( )方法,從而使兩個更新結(jié)果成為永久性的;如果其中之一或兩個更新都失敗了,就不會執(zhí)行到commit( ),并將產(chǎn)生一些異常,整個事務就要全部視為錯誤,這時則可以在捕獲異常時調(diào)用rollback( )進行回退,而全部從起始點后開始的操作應全部回到開始狀態(tài)。 大多數(shù)JDBC驅(qū)動程序都支持事務。事實上,符合JDBC的驅(qū)動程序必須支持事務。其中DatabaseMetaData給出的信息描述了DBMS所提供的事務支持水平。,11.5 JDBC綜合應用示例 本節(jié)以一個簡單的圖書借閱系統(tǒng)中對圖書信息的操作為例,講解JDBC在數(shù)據(jù)庫連接中的應用,包括詳細的數(shù)據(jù)源設(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表,如下:,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ù)源 為了同上一節(jié)中建立的數(shù)據(jù)庫建立連接,需要配置一個ODBC數(shù)據(jù)源try,步驟如下。 步驟一:在開始-設(shè)置-控制面版(Win98、NT4.0)中選取“數(shù)據(jù)源(ODBC)”;在Windows XP中“數(shù)據(jù)源(ODBC)”位于“開始-設(shè)置-控制面版-管理工具”或“開始-程序-管理工具”下。 步驟二:啟動“數(shù)據(jù)源(ODBC)”配置程序,界面如圖11-6所示。,圖11-6 ODBC數(shù)據(jù)源管理界面,步驟三:在圖11-6中“用戶DSN”選項下單擊“添加”按鈕,添加一個系統(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ù)源的對話框,并按此向?qū)顚憙?nèi)容。點擊“下一步”,選擇使用網(wǎng)絡(luò)登錄ID的Windows NT驗證,接著點擊“下一步”,并更改默認的數(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ù)源(三),步驟五:再點擊“下一步”,默認當前設(shè)置,點擊“完成”,出現(xiàn)ODBC Microsoft對話框,點擊“測試數(shù)據(jù)源”,出現(xiàn)測試結(jié)果界面,如圖11-11所示。 以上步驟就完成了對數(shù)據(jù)源的設(shè)置。,圖11-11 SQL Server ODBC數(shù)據(jù)源測試界面,11.5.3 數(shù)據(jù)庫操作程序 本書采用JDK 1.5.0作為開發(fā)工具,使用Eclipse 3.2集成開發(fā)環(huán)境。首先在Eclipse中File菜單中新建一個Project工程,選擇Java文件夾下的Java Project選項,并點擊下一步,出現(xiàn)如圖11-12所示的對話框。新建jdbc工程名,最后點擊完成。這樣,jdbc,這個工程就建立好了。接著按照圖11-13把SQL Server驅(qū)動程序添加到工程中,找到驅(qū)動程序存放的路徑就可以完成這個操作。,圖11-12 創(chuàng)建Java Project,圖11-13 添加驅(qū)動程序,其次就是代碼的編寫,右鍵點擊工程名jdbc,新建一個 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ù)庫驅(qū)動 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ū)動 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è)置為自動提交模式 con.setAutoCommit(true); stmt = 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í)行一個update語句,更新數(shù)據(jù)庫,修改200803圖書編號的書名 stmt.executeUpdate(“update book_info set BookName=基礎(chǔ)英語口語技能 where BookId=003“); queryBooks(con, stmt, query); /執(zhí)行一個delete語句,刪除一條圖書信息 stmt.executeUpdate(“delete from book_info where BookId=200804“); queryBooks(con, stmt

溫馨提示

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

評論

0/150

提交評論