版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
8.1JDBC概述
8.2JDBC實現(xiàn)數(shù)據(jù)庫操作的方法
8.3Statement接口詳解8.1JDBC概述8.1.1什么是JDBCJDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問。JDBC由一組用Java語言編寫的類和接口組成。JDBC為工具/數(shù)據(jù)庫開發(fā)人員提供了一個標準的API,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠用純JavaAPI編寫數(shù)據(jù)庫應(yīng)用程序。有了JDBC,程序員只需用JDBCAPI編寫一個程序,它可向相應(yīng)數(shù)據(jù)庫發(fā)送SQL調(diào)用,而不必為訪問Sybase、Oracle、Informix數(shù)據(jù)庫編寫相應(yīng)的程序。同時,將Java語言和JDBC結(jié)合起來可使程序員不必為不同的平臺編寫不同的應(yīng)用程序,只需編寫一次程序就可以讓它在任何平臺上運行。這也是Java語言“編寫一次,處處運行”的優(yōu)勢。Java和JDBC的結(jié)合,使信息傳播變得容易和經(jīng)濟。企業(yè)可使用它們安裝好的數(shù)據(jù)庫便捷地存取信息(即使這些信息是儲存在不同數(shù)據(jù)庫管理系統(tǒng)上),不僅新程序的開發(fā)期很短,而且安裝和版本控制將大為簡化。程序員可只編寫一次應(yīng)用程序或只更新一次,然后將它放到服務(wù)器上,隨后任何人就都可得到最新版本的應(yīng)用程序。對于商務(wù)上的銷售信息服務(wù),Java和JDBC可為外部客戶提供獲取信息更新的更好方法。8.1.2JDBC體系結(jié)構(gòu)JDBC的設(shè)計基于X/OpenSQLCLI(CallLevelInterface)模型,它通過定義一組API對象和方法同數(shù)據(jù)庫進行交互。JDBC體系結(jié)構(gòu)如圖8.1所示。SunMicrosystems公司定義了一組管理數(shù)據(jù)庫的驅(qū)動接口規(guī)范,各DBMS供應(yīng)商根據(jù)SunMicrosystems公司定義的接口規(guī)范開發(fā)與其相對應(yīng)的數(shù)據(jù)庫驅(qū)動程序,即JDBC底層驅(qū)動。在JDBC的使用中,Java應(yīng)用程序通過調(diào)用JDBCAPI接口,JDBCAPI接口調(diào)用java.sql包中的java.sql.DriverManager接口來處理驅(qū)動的調(diào)入,并且對產(chǎn)生新的數(shù)據(jù)庫連接提供支持,然后通過底層的JDBC驅(qū)動程序來驅(qū)動具體的數(shù)據(jù)庫。8.1.3JDBC的用途簡單地說,JDBC的用途如下:(1)與數(shù)據(jù)庫建立連接。(2)發(fā)送操作數(shù)據(jù)庫的語句。(3)返回處理結(jié)果。下列代碼段展示了如上用途:Connectionconn=DriverManager.getConnection("jdbc:odbc:zheng","login","password");Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery("select*fromtable");8.1.4JDBC驅(qū)動程序的類型目前比較常見的JDBC驅(qū)動程序可分為以下四種:(1)?JDBC-ODBC橋加ODBC驅(qū)動程序。JavaSoft橋產(chǎn)品利用ODBC驅(qū)動程序提供JDBC訪問。注意,必須將ODBC二進制代碼(許多情況下還包括數(shù)據(jù)庫客戶機代碼)加載到使用該驅(qū)動程序的每個客戶機上。因此,這種類型的驅(qū)動程序最適合于企業(yè)網(wǎng)(這種網(wǎng)絡(luò)上客戶機的安裝不是主要問題),或者是用Java編寫的三層結(jié)構(gòu)的應(yīng)用程序服務(wù)器代碼。(2)本地API驅(qū)動程序。這種驅(qū)動程序把客戶機API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其他DBMS的調(diào)用。注意,像橋驅(qū)動程序一樣,本地API驅(qū)動程序要求將某些二進制代碼加載到每臺客戶機上。(3)?JDBC網(wǎng)絡(luò)純Java驅(qū)動程序。這種驅(qū)動程序?qū)DBC轉(zhuǎn)換為與DBMS無關(guān)的網(wǎng)絡(luò)協(xié)議,之后這種協(xié)議又被某個服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機連接到多種不同的數(shù)據(jù)庫上,所用的具體協(xié)議取決于提供者。通常,這是最為靈活的JDBC驅(qū)動程序。有可能所有這種解決方案的提供者都提供適合于Intranet用的產(chǎn)品。為了使這些產(chǎn)品也支持Internet訪問,它們必須處理Web所提出的安全性、通過防火墻的訪問等方面的額外要求。(4)本地協(xié)議純Java驅(qū)動程序。這種驅(qū)動程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許在客戶機上直接調(diào)用DBMS服務(wù)器,是Intranet訪問的一個很實用的解決方法。由于許多這樣的協(xié)議都是專用的,因此數(shù)據(jù)庫提供者將是主要來源。8.1.5JDBC與ODBC的比較目前,Microsoft的ODBCAPI可能是使用最廣的、用于訪問關(guān)系數(shù)據(jù)庫的編程接口。它能在大多數(shù)平臺上連接不同的數(shù)據(jù)庫。為什么Java不使用ODBC?對這個問題的回答是:Java可以使用ODBC,但最好是在JDBC的幫助下以JDBC-ODBC橋的形式使用。為什么需要JDBC?因為ODBC使用C語言接口,所以它不適合直接在Java中使用。從Java調(diào)用本地C代碼在安全性、實現(xiàn)、堅固性和程序的自動移植性方面都有許多缺點。從ODBCAPI到JavaAPI的字面翻譯是不可取的。例如,Java沒有指針,而ODBC卻對指針用得很廣泛??梢詫DBC想象成被轉(zhuǎn)換為面向?qū)ο蠼涌诘腛DBC,而面向?qū)ο蟮慕涌趯ava程序員來說易于接受。ODBC把簡單功能和高級功能混在一起,而且即使對于簡單的查詢,其選項也極為復(fù)雜。相反,JDBC盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。啟用“純Java”機制需要像JDBC這樣的JavaAPI。如果使用ODBC,就必須手動將ODBC驅(qū)動程序管理器和驅(qū)動程序安裝在每臺客戶機上。如果完全用Java編寫JDBC驅(qū)動程序,則JDBC代碼在所有Java平臺上(從網(wǎng)絡(luò)計算機到大型機)都可以自動安裝、移植并保證安全性??傊?,JDBCAPI對于基本的SQL抽象和概念是一種自然的Java接口。它建立在ODBC上而不是從零開始。因此,熟悉ODBC的程序員將發(fā)現(xiàn)JDBC很容易使用。JDBC保留了ODBC的基本設(shè)計特征。事實上,兩種接口都基于X/OpenSQLCLI(調(diào)用級接口)。它們之間最大的區(qū)別在于:JDBC以Java風(fēng)格與優(yōu)點為基礎(chǔ)并進行優(yōu)化,因此更加易于使用。目前,Microsoft又引進了ODBC之外的新API:RDO、ADO和OLEDB。這些設(shè)計在許多方面與JDBC是相同的,即它們都是面向?qū)ο蟮臄?shù)據(jù)庫接口且可在ODBC上實現(xiàn)的類。但是,對于ODBC之外的這些新API,它們最多也就是在ODBC上加了一層裝飾而已。我們尚未發(fā)現(xiàn)有什么特別的功能要選擇它們來替代ODBC,尤其是在ODBC驅(qū)動程序已建立起較為完善的市場的情況下,這種替代更是沒有必要。8.2JDBC實現(xiàn)數(shù)據(jù)庫操作的方法在程序中實現(xiàn)JDBC需要以下五個步聚:(1)加載驅(qū)動程序。(2)建立數(shù)據(jù)庫連接。(3)進行數(shù)據(jù)庫操作,即執(zhí)行SQL語句,對數(shù)據(jù)進行增、刪、改、查等操作。(4)處理執(zhí)行SQL語句的結(jié)果。(5)釋放聲明語句,即關(guān)閉連接。8.2.1加載驅(qū)動程序加載驅(qū)動程序只需要非常簡單的一行代碼。例如,想要使用JDBC-ODBC橋驅(qū)動程序,可以使用下列代碼來加載://加載oracle驅(qū)動Class.forName("oracle.jdbc.driver.OracleDriver");//加載JDBC-ODBC橋驅(qū)動Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載MSSQLServer驅(qū)動Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");驅(qū)動程序文檔將告訴程序員應(yīng)該使用的類名。程序員不需要創(chuàng)建一個驅(qū)動程序類的實例,并且用DriverManager登記它,因為調(diào)用Class.forName將自動加載驅(qū)動程序類。如果程序員曾自己創(chuàng)建了實例,則創(chuàng)建了一個不必要的副本,但它不會帶來什么壞處。8.2.2建立數(shù)據(jù)庫連接與數(shù)據(jù)庫建立連接,一般調(diào)用DriverManager.getConnection()方法。具體代碼如下:Connectioncon=DriverManager.getConnection(URL,Username,Password);(1)?URL:用于識別不同的數(shù)據(jù)庫,可以使相應(yīng)的驅(qū)動程序識別該數(shù)據(jù)庫并與之建立連接。不同數(shù)據(jù)庫的URL不同,大致如下:①?Oracle的URL示例:"jdbc:oracle:thin:@localhost:1521:orcl"②?Access的URL示例:"jdbc:odbc:HANFENG"③?SQLServer的URL示例:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"④?DB2的URL示例:"jdbc:db2://localhost:5000/sample"⑤?Informix的URL示例:"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver"⑥?Sybase的URL示例:"jdbc:sybase:Tds:localhost:5007/tsdata"⑦?MySQL的URL示例:"jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"⑧?PostgreSQL的URL示例:"jdbc:postgresql://localhost/soft"(2)?Username:所訪問數(shù)據(jù)庫的用戶名。(3)?Password:所訪問數(shù)據(jù)庫用戶的密碼。8.2.3進行數(shù)據(jù)庫操作JDBC進行數(shù)據(jù)庫操作包括兩個步聚:創(chuàng)建聲明語句和執(zhí)行聲明語句。(1)創(chuàng)建聲明語句。JDBC提供了三個對象用于向數(shù)據(jù)庫發(fā)送SQL語句,它們分別是Statement、PreparedStatement、CallableStatement。Connection接口中的三個方法對應(yīng)于創(chuàng)建上述三個對象,分別為CreateStatemet、PreparedStatement、PrepareCall。Statement:發(fā)送簡單的SQL語句。PreparedStatement:發(fā)送帶有參數(shù)的SQL語句。CallableStatement:調(diào)用數(shù)據(jù)庫中的存儲過程。創(chuàng)建Statement的代碼如下:Statementstate=con.createStatement();(2)執(zhí)行聲明語句。Statement代表SQL語句的接口,通過executeQuery或executeUpdate方法執(zhí)行一個靜態(tài)的SQL語句。PreparedStatement對象用于發(fā)送帶有一個或多個輸入?yún)?shù)的SQL語句,并且它經(jīng)過預(yù)編譯,效率要比使用Statement對象高。CallableStatement對象用于執(zhí)行SQL存儲程序。SQL存儲程序是一組可通過名稱來調(diào)用的SQL語句。執(zhí)行insert、update、delete操作數(shù)據(jù)庫數(shù)據(jù)用executeUpdate()方法。8.2.4處理執(zhí)行SQL語句的結(jié)果executeUpdate()方法執(zhí)行的返回值為一個int值,它代表操作所影響的記錄行數(shù)。ExecuteQuery()方法執(zhí)行完畢之后,將會返回一個結(jié)果集,ResultSet接口用于處理執(zhí)行select語句的查詢結(jié)果。Statement.executeQuery方法把查詢結(jié)果返回到ResultSet對象中;Java.sql.ResultSet接口用于維護查詢得到的一張視圖表,它提供了許多操作表記錄的方法。ResultSet對象的最初位置在行首。ResultSet.next()方法用于移動到下一行。ResultSet.getXXX()方法用于取得當前記錄指定字段的內(nèi)容。比如,使用getInt()可以得到整型字段的內(nèi)容,使用getString()可以得到字符串型字段的內(nèi)容。8.2.5釋放聲明語句釋放聲明語句關(guān)閉數(shù)據(jù)庫的連接。關(guān)閉順序為:先rs,再state,最后conn,即rs.close();state.close();conn.close();一般可以在finally語句中實現(xiàn)關(guān)閉。8.3Statement接口詳解實現(xiàn)對數(shù)據(jù)庫的一般查詢用Statement,但JDBC在編譯時并不對將要執(zhí)行的SQL查詢語句作任何檢查,只是將其作為一個String類對象,直到驅(qū)動程序執(zhí)行SQL查詢語句時才知道其是否正確。對于錯誤的SQL查詢語句,在執(zhí)行時將會產(chǎn)生SQLException
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度環(huán)境污染治理與修復(fù)合同
- 2024年版建筑項目合同樣本
- 永磁同步電機的課程設(shè)計
- 企業(yè)建筑施工安全生產(chǎn)管理制度匯編
- 花瓶插花課程設(shè)計
- 中國石化安全風(fēng)險評估指導(dǎo)意見
- 部編版八年級《道德與法治》上冊同步練習(xí)(全冊,含答案)
- 系統(tǒng)文件監(jiān)控課程設(shè)計
- 網(wǎng)紅飲料制作課程設(shè)計
- 股市基金課程設(shè)計
- 2024年加油站的年度工作總結(jié)范文(2篇)
- 甲醇制氫生產(chǎn)裝置計算書
- T-JSREA 32-2024 電化學(xué)儲能電站消防驗收規(guī)范
- 2025年上半年江蘇省常州市文廣旅局下屬事業(yè)單位招聘4人重點基礎(chǔ)提升(共500題)附帶答案詳解
- 2023-2024學(xué)年福建省泉州市石獅市三年級(上)期末數(shù)學(xué)試卷
- 新時代高校馬克思主義學(xué)院內(nèi)涵式發(fā)展的現(xiàn)狀和現(xiàn)實進路
- (新版)廣電全媒體運營師資格認證考試復(fù)習(xí)題庫(含答案)
- 銅工崗位安全操作規(guī)程(2篇)
- 擦玻璃安全責任合同協(xié)議書范本
- 【MOOC】隧道工程-中南大學(xué) 中國大學(xué)慕課MOOC答案
- 2024-2025學(xué)年人教PEP版英語五年級上冊期末試題
評論
0/150
提交評論