數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)chp9課件_第1頁(yè)
數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)chp9課件_第2頁(yè)
數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)chp9課件_第3頁(yè)
數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)chp9課件_第4頁(yè)
數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)chp9課件_第5頁(yè)
已閱讀5頁(yè),還剩105頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)據(jù)庫(kù)技術(shù)基礎(chǔ)第9章 數(shù)據(jù)庫(kù)互連方法數(shù)據(jù)庫(kù)互連的目的 為了方便用戶的應(yīng)用程序能訪問不同的數(shù)據(jù)庫(kù)系統(tǒng)。數(shù)據(jù)庫(kù)互連 連接不同的RDBMS的方法、技術(shù)和軟件。兩個(gè)影響比較大的互連方法ODBCJDBC第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 JDBC的工作流程9.7 小結(jié)9.1 學(xué)習(xí)目標(biāo) 學(xué)完本章后,讀者應(yīng)具備以下能力:了解數(shù)據(jù)庫(kù)互連的目的和原理。了解ODBC的組成結(jié)構(gòu)。能在Windows環(huán)境下建立數(shù)據(jù)源。了解JDBC的組成結(jié)構(gòu)。理解不同類型JDBC驅(qū)動(dòng)程序?qū)?yīng)用程序結(jié)構(gòu)的影響。掌握J(rèn)DBC常用類和接口,并

2、會(huì)進(jìn)行查詢和更新處理。第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 JDBC的工作流程9.7 小結(jié)9.2 數(shù)據(jù)庫(kù)互連原理 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)國(guó)外Oracle(Oracle公司的產(chǎn)品)Sybase(Sybase公司的產(chǎn)品)DB2、Informix(IBM公司的產(chǎn)品)SQL Server、Visual FoxPro、Access(Microsoft公司的產(chǎn)品)TeraData(NCR公司的產(chǎn)品)國(guó)內(nèi)OpenBase(東軟公司的產(chǎn)品)DM2(達(dá)夢(mèng)公司的產(chǎn)品)Kingbase ES(人大金倉(cāng)公司的

3、產(chǎn)品)不同系統(tǒng)之間的差異 支持和實(shí)現(xiàn)SQL語句的程度不同;有的支持SQL-89,有的支持SQL-92的基本集。SQL語句實(shí)現(xiàn)的策略和細(xì)節(jié)有許多不同。支持的數(shù)據(jù)類型和精度常常不同。提供的應(yīng)用編程接口(Application Programming Interface,API)不同。嵌入式SQL語言語法細(xì)節(jié)會(huì)有差別。存儲(chǔ)過程不同等。導(dǎo)致的問題應(yīng)用程序只能在特定的RDBMS環(huán)境下運(yùn)行,適應(yīng)性和可移植性較差。9.2 數(shù)據(jù)庫(kù)互連原理(續(xù))解決方案在應(yīng)用系統(tǒng)和不同的RDBMS之間加一層中間件。中間件=數(shù)據(jù)庫(kù)調(diào)用轉(zhuǎn)換接口把應(yīng)用系統(tǒng)中對(duì)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)調(diào)用轉(zhuǎn)換成對(duì)某一個(gè)特定的RDBMS的調(diào)用。目標(biāo)應(yīng)用程序與具體的

4、RDBMS平臺(tái)相隔離。當(dāng)應(yīng)用程序連接的RDBMS平臺(tái)改變時(shí),不必改寫應(yīng)用程序。提高了應(yīng)用系統(tǒng)與RDBMS的獨(dú)立性。使應(yīng)用系統(tǒng)具有良好的可移植性。 9.2 數(shù)據(jù)庫(kù)互連原理(續(xù))數(shù)據(jù)庫(kù)調(diào)用轉(zhuǎn)換接口OracleDB2SQL Server數(shù)據(jù)庫(kù)A數(shù)據(jù)庫(kù)B數(shù)據(jù)庫(kù)C應(yīng)用系統(tǒng)1應(yīng)用系統(tǒng)n客戶端網(wǎng)絡(luò)服務(wù)器圖9.1 數(shù)據(jù)庫(kù)互連原理 9.2 數(shù)據(jù)庫(kù)互連原理第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 JDBC的工作流程9.7 小結(jié)9.3 ODBC簡(jiǎn)介 9.3.1 ODBC原理概述 9.3.2 ODBC驅(qū)動(dòng)程序的分類 9.3

5、.1 ODBC原理概述ODBC:提供了一套數(shù)據(jù)庫(kù)應(yīng)用程序接口規(guī)范。 規(guī)范包括:為應(yīng)用程序提供的一套調(diào)用層接口函數(shù)(call-level interface,為CLI)基于動(dòng)態(tài)鏈接庫(kù)的運(yùn)行支持環(huán)境使用ODBC開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),應(yīng)用程序調(diào)用的是ODBC函數(shù)和SQL標(biāo)準(zhǔn)語句。ODBC已經(jīng)成為數(shù)據(jù)庫(kù)之間互連的事實(shí)標(biāo)準(zhǔn)。用戶應(yīng)用程序ODBC APIODBC Driver ManagerDriver 1Driver 2Driver nEasybase標(biāo)準(zhǔn)接口微軟提供網(wǎng)絡(luò).Sybase SQL ServerOracle圖9.2 ODBC的構(gòu)成 9.3.1 ODBC原理概述ODBC的組成ODBC API標(biāo)

6、準(zhǔn)接口一組驅(qū)動(dòng)程序數(shù)據(jù)庫(kù)調(diào)用轉(zhuǎn)換接口的組成ODBC驅(qū)動(dòng)程序管理器(ODBC Driver Manager)一組RDBMS驅(qū)動(dòng)程序(ODBC Driver)ODBC的功能ODBC通過使用驅(qū)動(dòng)程序(driver)來提供數(shù)據(jù)庫(kù)獨(dú)立性。進(jìn)行數(shù)據(jù)庫(kù)操作的數(shù)據(jù)源對(duì)應(yīng)用程序是透明的。所有的數(shù)據(jù)庫(kù)操作由對(duì)應(yīng)的DBMS的ODBC Driver完成。9.3.1 ODBC原理概述驅(qū)動(dòng)程序是一個(gè)用以支持ODBC函數(shù)調(diào)用的模塊(通常是一個(gè)DLL)。驅(qū)動(dòng)程序的特點(diǎn)一種RDBMS平臺(tái)提供一種RDBMS驅(qū)動(dòng)程序。不同的驅(qū)動(dòng)程序一般由不同的RDBMS廠商開發(fā)和提供,例如Oracle公司提供Oracle驅(qū)動(dòng)程序,Sybase公司

7、提供Sybase驅(qū)動(dòng)程序。9.3.1 ODBC原理概述驅(qū)動(dòng)程序的作用應(yīng)用程序通過調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來操作數(shù)據(jù)庫(kù)。若想使應(yīng)用程序操作不同類型的數(shù)據(jù)庫(kù),就要?jiǎng)討B(tài)地鏈接到不同的驅(qū)動(dòng)程序上。驅(qū)動(dòng)程序管理器驅(qū)動(dòng)程序管理器由微軟公司提供。驅(qū)動(dòng)程序管理器包含在ODBC.DLL(或在32位版的ODBC的ODBC32.DLL中),可鏈接到所有的ODBC應(yīng)用程序中。負(fù)責(zé)管理應(yīng)用程序中ODBC函數(shù)與DLL中函數(shù)的綁定。9.3.1 ODBC原理概述不同人員的作用:作為一個(gè)應(yīng)用程序開發(fā)人員要了解如何使用ODBC提供的調(diào)用接口和運(yùn)行支持環(huán)境來編寫、調(diào)試和運(yùn)行應(yīng)用程序。作為一個(gè)系統(tǒng)管理人員要了解如何安裝ODBC驅(qū)動(dòng)程

8、序管理器和不同RDBMS的驅(qū)動(dòng)程序。作為RDBMS廠商則要了解如何開發(fā)自己的ODBC驅(qū)動(dòng)程序,使自己的產(chǎn)品更加開放。 9.3.1 ODBC原理概述(續(xù))應(yīng)用程序應(yīng)該包括的內(nèi)容請(qǐng)求連接數(shù)據(jù)庫(kù)。向數(shù)據(jù)源發(fā)送SQL語句。為SQL語句執(zhí)行結(jié)果分配存儲(chǔ)空間,定義所讀取的數(shù)據(jù)格式。獲取數(shù)據(jù)庫(kù)操作結(jié)果或處理錯(cuò)誤。進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果。請(qǐng)求事務(wù)的提交和回滾操作。斷開與數(shù)據(jù)源的連接。 1. 應(yīng)用程序9.3.1 ODBC原理概述(續(xù))驅(qū)動(dòng)程序管理器用來管理系統(tǒng)中存在的各種驅(qū)動(dòng)程序。驅(qū)動(dòng)程序管理器的主要功能裝載ODBC驅(qū)動(dòng)程序選擇和連接正確的驅(qū)動(dòng)程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)

9、的調(diào)用等當(dāng)應(yīng)用層需要時(shí)提供驅(qū)動(dòng)程序信息ODBC驅(qū)動(dòng)程序管理器的功能建立、配置或刪除數(shù)據(jù)源查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫(kù)ODBC驅(qū)動(dòng)程序9.3.1 ODBC原理概述(續(xù))2. 驅(qū)動(dòng)程序管理器ODBC與驅(qū)動(dòng)程序的關(guān)系 ODBC通過驅(qū)動(dòng)程序提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性。驅(qū)動(dòng)程序與DBMS的關(guān)系 驅(qū)動(dòng)程序與具體的DBMS有關(guān)。例如,若要對(duì)Oracle數(shù)據(jù)庫(kù)操作就要用Oracle的驅(qū)動(dòng)程序,若要對(duì)Sybase數(shù)據(jù)庫(kù)操作就要用Sybase的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的具體形式 驅(qū)動(dòng)程序是一個(gè)支持ODBC函數(shù)調(diào)用的模塊,通常是一個(gè)動(dòng)態(tài)連接庫(kù)DLL。驅(qū)動(dòng)程序的工作流程ODBC應(yīng)用程序的各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交

10、給某個(gè)RDBMS的ODBC驅(qū)動(dòng)程序。調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來存取數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的操作結(jié)果也通過驅(qū)動(dòng)程序返回給應(yīng)用程序。9.3.1 ODBC原理概述(續(xù))3. 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序9.3.1 ODBC原理概述(續(xù))驅(qū)動(dòng)程序的功能建立與相應(yīng)RDBMS的連接。向連接的RDBMS提交用戶的SQL語句。根據(jù)應(yīng)用程序的要求,將發(fā)送給該RDBMS的請(qǐng)求以及從RDBMS返回的數(shù)據(jù)進(jìn)行數(shù)據(jù)格式和類型的轉(zhuǎn)換。向應(yīng)用程序返回處理結(jié)果。將執(zhí)行過程中RDBMS返回的錯(cuò)誤代碼轉(zhuǎn)換為ODBC定義的標(biāo)準(zhǔn)錯(cuò)誤代碼,返回給應(yīng)用程序。根據(jù)需要說明和使用游標(biāo) 。ODBC與驅(qū)動(dòng)程序的關(guān)系ODBC的主要部分是驅(qū)動(dòng)程序。某一個(gè)RDBMS的驅(qū)動(dòng)

11、程序了解它所對(duì)應(yīng)的RDBMS并與該數(shù)據(jù)庫(kù)進(jìn)行通信。不要求驅(qū)動(dòng)程序支持ODBC規(guī)范中的所有功能。ODBC為驅(qū)動(dòng)程序定義了API和SQL語法的不同級(jí)別。ODBC對(duì)驅(qū)動(dòng)程序的唯一要求是,當(dāng)驅(qū)動(dòng)程序符合某一級(jí)別時(shí),它應(yīng)該支持在該級(jí)別上ODBC所定義的所有功能,而不管底層數(shù)據(jù)庫(kù)是否支持這些功能。9.3.1 ODBC原理概述(續(xù))數(shù)據(jù)源名(Data Source Name,DSN) 應(yīng)用程序與數(shù)據(jù)庫(kù)系統(tǒng)連接的橋梁,它為ODBC驅(qū)動(dòng)程序管理器指出數(shù)據(jù)庫(kù)服務(wù)器名稱以及用戶的默認(rèn)連接參數(shù)等。在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫(kù)名等。數(shù)據(jù)源名可被看成是與一個(gè)具體數(shù)據(jù)庫(kù)建立的連接。 9.3.1

12、 ODBC原理概述(續(xù))4. ODBC數(shù)據(jù)源管理例如,假設(shè)某個(gè)學(xué)校在MS SQL Server 數(shù)據(jù)庫(kù)管理系統(tǒng)上建立了兩個(gè)數(shù)據(jù)庫(kù):學(xué)校人事數(shù)據(jù)庫(kù)教學(xué)科研數(shù)據(jù)庫(kù)。兩個(gè)數(shù)據(jù)源名為學(xué)校人事數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)數(shù)據(jù)源名PERSON,PERSON就稱為一個(gè)DSN。為教學(xué)科研數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)名為EDU的數(shù)據(jù)源。當(dāng)要訪問每一個(gè)數(shù)據(jù)庫(kù)時(shí),只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動(dòng)程序、服務(wù)器名稱、數(shù)據(jù)庫(kù)名等。9.3.1 ODBC原理概述(續(xù))9.3.1 ODBC原理概述(續(xù))例 9.1 建立數(shù)據(jù)源SExample,連接到SQL Server的事例數(shù)據(jù)庫(kù)S_C_SC。選擇“開始” “控制面板”“管理工具”

13、“數(shù)據(jù)源(ODBC)”, 打開“ODBC數(shù)據(jù)源管理器”對(duì)話框;從該對(duì)話框中選擇“系統(tǒng)DSN”選項(xiàng)卡,如圖9.3所示。單擊“添加”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”對(duì)話框,如圖9.4所示;在此對(duì)話框的“名稱”列表框中選擇“SQL Server”。圖9.3 添加DSN 圖9.4 選擇驅(qū)動(dòng)程序 單擊“完成”按鈕,在打開的“創(chuàng)建到SQL Server 的新數(shù)據(jù)源”對(duì)話框中,將數(shù)據(jù)源命名為SExample,選擇本機(jī)的一個(gè)SQL Server實(shí)例,服務(wù)器名為L(zhǎng)SNMOBILE,實(shí)例名是MYSQL,如圖9.5所示。圖9.5 選擇服務(wù)器9.3.1 ODBC原理概述(續(xù))錄入登錄名和密碼。輸入數(shù)據(jù)庫(kù)S_C_SC的用戶名

14、“Manager”,密碼為空,如圖9.6所示。圖9.6 錄入登錄名和密碼 9.3.1 ODBC原理概述(續(xù))選擇數(shù)據(jù)庫(kù)。設(shè)置數(shù)據(jù)庫(kù)為S_C_SC,如圖9.7所示。選擇日志文件等參數(shù)。所有的參數(shù)選擇默認(rèn)值,如圖9.8所示。 圖9.7 選擇數(shù)據(jù)庫(kù) 圖9.8 選擇日志文件等 9.3.1 ODBC原理概述(續(xù))9.3 ODBC簡(jiǎn)介 9.3.1 ODBC原理概述 9.3.2 ODBC驅(qū)動(dòng)程序的分類 9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))ODBC驅(qū)動(dòng)程序的分類(三個(gè)方面)API一致性級(jí)別SQL語法一致性級(jí)別驅(qū)動(dòng)程序類型API一致性級(jí)別 驅(qū)動(dòng)程序的開發(fā)者一般不能實(shí)現(xiàn)所有的ODBC函數(shù)。API一致性級(jí)別決定

15、了應(yīng)用程序所能調(diào)用的函數(shù)的種類。API一致性分為三個(gè)級(jí)別:核心級(jí)擴(kuò)展1級(jí)擴(kuò)展2級(jí) 這三個(gè)級(jí)別只是驅(qū)動(dòng)程序開發(fā)者的一種指導(dǎo)性原則。(1)核心級(jí)API 基本的功能:分配釋放環(huán)境句柄連接句柄執(zhí)行SQL語句 核心級(jí)的驅(qū)動(dòng)程序的基本功能:向語句中傳入?yún)?shù)存取執(zhí)行結(jié)果目錄操作錯(cuò)誤跟蹤(2)擴(kuò)展1級(jí)API擴(kuò)展1級(jí)在核心級(jí)的基礎(chǔ)上增加了部分函數(shù),通過這些函數(shù)就可以在應(yīng)用程序中動(dòng)態(tài)地了解表的模式,可用的數(shù)據(jù)類型等。大多數(shù)的驅(qū)動(dòng)程序支持?jǐn)U展1級(jí)API。在編寫應(yīng)用程序時(shí)即使不清楚數(shù)據(jù)庫(kù)中表的模式,依然能夠在運(yùn)行時(shí)動(dòng)態(tài)地對(duì)表進(jìn)行操作,這就是擴(kuò)展1級(jí)API最大的優(yōu)點(diǎn)。 9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))SQL語法

16、一致性級(jí)別 ODBC的SQL語句一致性分為三個(gè)級(jí)別:最低限(Minimum)的SQL語法核心(Core)SQL語法擴(kuò)展(Extended)SQL語法 (1)最低限SQL語法最低限SQL語法包括:CREAT、DROP表,SELECT、INSERTE、UPDATE、DELETE記錄。支持常用的數(shù)據(jù)類型和若干字符類型及其變形,如CHAR、VARCHAR、LONGVARCHAR等。 9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))(2)核心SQL語法 核心SQL語法增加的功能包括ALTER表,CREATE和DROP索引。GRANT和REVOKE各種權(quán)限給不同的用戶。在S

17、QL語句中嵌套子查詢,還增加了一些數(shù)據(jù)類型,如短整數(shù)和長(zhǎng)整數(shù)、單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)等。(3)擴(kuò)展SQL語法引進(jìn)了更復(fù)雜的語法,例如游標(biāo)控制語句。增加了日期、時(shí)間、二進(jìn)制數(shù)據(jù)類型和時(shí)間戳(TIMESTAMP)等其他復(fù)雜數(shù)據(jù)類型。驅(qū)動(dòng)程序類型 單層驅(qū)動(dòng)程序(SINGLE-TIER DRIVER)多層驅(qū)動(dòng)程序(MULTI-TIER DRIVER) 9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))單層驅(qū)動(dòng)程序既具有ODBC功能,也能處理SQL語句,它實(shí)際上就是一個(gè)DBMS。單層驅(qū)動(dòng)程序的系統(tǒng)結(jié)構(gòu)如圖9.9所示。應(yīng)用程序驅(qū)動(dòng)程序管理器(單層)驅(qū)動(dòng)程序(包含數(shù)據(jù)庫(kù)引擎)數(shù)據(jù)庫(kù)文件圖9.9 基于單層驅(qū)動(dòng)程序的

18、系統(tǒng)結(jié)構(gòu) ODBC API調(diào)用 返回?cái)?shù)據(jù) ODBC 驅(qū)動(dòng)程序調(diào)用 返回?cái)?shù)據(jù) 命令 返回?cái)?shù)據(jù) 9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))單層驅(qū)動(dòng)程序不僅要處理ODBC函數(shù)調(diào)用,還要解釋執(zhí)行SQL語句,即執(zhí)行RDBMS的功能。單層驅(qū)動(dòng)程序?qū)嶋H上具備一個(gè)RDBMS的功能。9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))多層驅(qū)動(dòng)程序中ODBC功能與DBMS功能相分離。驅(qū)動(dòng)程序負(fù)責(zé)處理ODBC應(yīng)用程序中的函數(shù)調(diào)用。處理SQL語句的任務(wù)由DBMS完成。多層驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)管理系統(tǒng)的功能是分離的。多層驅(qū)動(dòng)程序只處理應(yīng)用程序的ODBC函數(shù)調(diào)用和數(shù)據(jù)轉(zhuǎn)換。SQL語句則由驅(qū)動(dòng)程序傳遞給相應(yīng)的數(shù)據(jù)庫(kù)引擎,數(shù)據(jù)庫(kù)引擎解釋執(zhí)行S

19、QL語句,實(shí)現(xiàn)用戶的各種操作請(qǐng)求。9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))基于多層ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)應(yīng)用程序適合于客戶/服務(wù)器結(jié)構(gòu),如圖9.10所示??蛻舳藨?yīng)用程序驅(qū)動(dòng)程序管理器數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序網(wǎng)絡(luò)支撐軟件服務(wù)器端數(shù)據(jù)庫(kù)引擎數(shù)據(jù)庫(kù)文件網(wǎng)絡(luò)軟件9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))ODBC數(shù)據(jù)庫(kù)應(yīng)用程序驅(qū)動(dòng)程序管理器(多層)驅(qū)動(dòng)程序客戶端網(wǎng)絡(luò)支撐軟件服務(wù)器端網(wǎng)絡(luò)支撐軟件數(shù)據(jù)庫(kù)引擎(RDBMS)數(shù)據(jù)庫(kù) ODBC API調(diào)用 返回?cái)?shù)據(jù) ODBC 驅(qū)動(dòng)程序調(diào)用 返回?cái)?shù)據(jù) 數(shù)據(jù)庫(kù)接口調(diào)用 返回?cái)?shù)據(jù) 數(shù)據(jù)庫(kù)引擎調(diào)用 返回?cái)?shù)據(jù) 客戶端 服務(wù)器端 圖 9.10 基于多層驅(qū)動(dòng)程序的系統(tǒng)結(jié)構(gòu) 9.3.2 O

20、DBC驅(qū)動(dòng)程序的分類(續(xù))多層驅(qū)動(dòng)程序與單層驅(qū)動(dòng)程序的差別驅(qū)動(dòng)程序是否具有數(shù)據(jù)庫(kù)引擎功能。效率的差異也很大。基于單層驅(qū)動(dòng)程序的應(yīng)用程序把存放數(shù)據(jù)庫(kù)的服務(wù)器作為文件服務(wù)器使用,在網(wǎng)絡(luò)中傳輸?shù)氖钦麄€(gè)數(shù)據(jù)庫(kù)文件,所以網(wǎng)絡(luò)的數(shù)據(jù)通信量很大。采用多層驅(qū)動(dòng)程序的應(yīng)用程序使用客戶/服務(wù)器結(jié)構(gòu),在數(shù)據(jù)庫(kù)服務(wù)器上實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作,在網(wǎng)絡(luò)中傳輸?shù)闹皇怯脩粽?qǐng)求和數(shù)據(jù)庫(kù)處理的結(jié)果,從而使網(wǎng)絡(luò)的通信量大大減少,提高了應(yīng)用程序的運(yùn)行效率。9.3.2 ODBC驅(qū)動(dòng)程序的分類(續(xù))第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 J

21、DBC的工作流程9.7 小結(jié)9.4 ODBC的工作流程使用ODBC的應(yīng)用系統(tǒng)的大致工作流程建立ODBC環(huán)境。建立ODBC連接。由應(yīng)用程序自動(dòng)建立ODBC連接由驅(qū)動(dòng)程序管理器建立ODBC連接讓用戶登錄并提供數(shù)據(jù)源名應(yīng)用程序把數(shù)據(jù)源名傳送給ODBC驅(qū)動(dòng)程序管理器由驅(qū)動(dòng)程序管理器建立ODBC連接,包括與相應(yīng)的驅(qū)動(dòng)程序、數(shù)據(jù)庫(kù)服務(wù)器、數(shù)據(jù)庫(kù)等建立連接。ODBC確認(rèn)連接成功后才繼續(xù)執(zhí)行應(yīng)用程序。否則,向應(yīng)用程序返回出錯(cuò)信息。建立語句句柄。執(zhí)行SQL語句。對(duì)于單層驅(qū)動(dòng)程序 由該單層驅(qū)動(dòng)程序完成對(duì)數(shù)據(jù)庫(kù)的存取操作并把結(jié)果返回給應(yīng)用程序。對(duì)于多層驅(qū)動(dòng)程序由該驅(qū)動(dòng)程序把應(yīng)用程序的這些請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)引擎RDBM

22、S所接受的格式傳送給RDBMS去處理數(shù)據(jù)庫(kù)操作結(jié)果將由RDBMS首先發(fā)回給驅(qū)動(dòng)程序驅(qū)動(dòng)程序再將這些數(shù)據(jù)按照標(biāo)準(zhǔn)的格式傳送給應(yīng)用程序前端應(yīng)用程序處理結(jié)果 9.4 ODBC的工作流程(續(xù))終止。 應(yīng)用程序終止前首先要釋放語句句柄。 釋放數(shù)據(jù)庫(kù)連接。 與數(shù)據(jù)庫(kù)服務(wù)器斷開。 釋放ODBC環(huán)境。ODBC函數(shù) ODBC為應(yīng)用程序提供的一套接口調(diào)用函數(shù)??梢苑譃橐韵聨捉M:分配和釋放環(huán)境句柄、連接句柄、語句句柄連接執(zhí)行SQL語句接受結(jié)果事務(wù)控制錯(cuò)誤處理和其他9.4 ODBC的工作流程(續(xù))9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開

23、數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.1 建立和釋放ODBC環(huán)境1. 創(chuàng)建ODBC環(huán)境 應(yīng)用系統(tǒng)在調(diào)用任何ODBC函數(shù)之前,首先初始化ODBC,建立一個(gè)ODBC環(huán)境,分配一個(gè)環(huán)境句柄(Environment Handle)。每個(gè)應(yīng)用只建立一個(gè)環(huán)境,在這個(gè)環(huán)境中可以建立多個(gè)連接。完成這個(gè)環(huán)境設(shè)置的函數(shù)是: SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr); 參數(shù)OutputHandle

24、Ptr將返回環(huán)境句柄的內(nèi)存地址指針。函數(shù)的返回值是SQL_SUCCESS時(shí),表示環(huán)境句柄分配成功。如果返回值是SQL_ERROR,則表示分配不成功。ODBC環(huán)境一經(jīng)創(chuàng)建就具有與應(yīng)用程序相同的生存周期。例如:SQLHENV henv1; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv1);2、釋放ODBC環(huán)境在結(jié)束應(yīng)用系統(tǒng)之前,必須釋放為該應(yīng)用系統(tǒng)所保留的所有資源。完成這一過程的ODBC函數(shù)是: SQLRETURN SQLFreeHandle( SQLSMALLINT HandleType, SQLHANDLE Handle); 當(dāng)返回

25、值是SQL_SUCCESS時(shí),表示環(huán)境句柄已經(jīng)被釋放。在使用這個(gè)函數(shù)之前切斷與所有數(shù)據(jù)源的連接,否則SQLFreeHandle將返回SQL_ERROR,表示不能釋放環(huán)境句柄。例如: SQLAllocHandle(SQL_HANDLE_ENV, henv1);9.4.1 建立和釋放ODBC環(huán)境(續(xù))9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.2 建立和釋放ODBC連接1. 建立ODBC連接應(yīng)用系統(tǒng)對(duì)每一個(gè)要連接的數(shù)據(jù)源都必

26、須建立一個(gè)ODBC連接,分配一個(gè)連接句柄(Connection Handle)。完成這一分配過程的ODBC函數(shù): SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr); 其中,參數(shù)InputHandle是應(yīng)用系統(tǒng)的環(huán)境句柄指針。執(zhí)行這個(gè)函數(shù),驅(qū)動(dòng)程序管理器將為連接分配內(nèi)存,并通過OutputHandlePtr返回指向連接句柄的內(nèi)存地址的指針。 如果函數(shù)的返回值是SQL_SUCCESS,則表示連接成功,該連接句柄有效。如果返回值是SQL_ERROR

27、,表示用戶選擇了一個(gè)數(shù)據(jù)源,但是發(fā)生了某種錯(cuò)誤連接沒有成功,所以這個(gè)連接句柄也無效。 例如: SQLHDBC hdbc1;SQLAllocHandle(SQL_HANDLE_DBC, henv1, &hdbc1); 2. 釋放ODBC連接當(dāng)一個(gè)應(yīng)用系統(tǒng)不再需要一個(gè)連接句柄時(shí),應(yīng)該釋放該句柄所分配的所有資源。實(shí)現(xiàn)這一功能的函數(shù)如下: SQLRETURN SQLFreeHandle( SQLSMALLINT HandleType, SQLHANDLE Handle); 其中,參數(shù)Handle是連接句柄。 例如: SQLAllocHandle(SQL_HANDLE_DBC, hdbc1);9.4.2

28、 建立和釋放ODBC連接(續(xù))9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.3 連接和斷開數(shù)據(jù)源1. 連接數(shù)據(jù)源連接數(shù)據(jù)源的函數(shù)有多種,但最有效的、最通用的是SQLConnect函數(shù)。SQLConnect函數(shù)將加載一個(gè)RDBMS的驅(qū)動(dòng)程序,并建立與該數(shù)據(jù)庫(kù)的連接。SQLConnect函數(shù)的格式: SQLRETURN SQLConnect( SQLHDBC ConnectionHandle, SQLCHAR * Server

29、Name, SQLSMALLINT NameLength1, SQLCHAR * UserName,SQL SMALLINT NameLength2, SQLCHAR * Authentication, SQLSMALLINT NameLength3); ConnectionHandle :一個(gè)已經(jīng)分配的連接句柄;ServerName:一個(gè)字符串,表示應(yīng)用系統(tǒng)所要連接的數(shù)據(jù)源名稱;NameLength1:數(shù)據(jù)源字符串的長(zhǎng)度;UserName:用戶標(biāo)識(shí)符;NameLength2:用戶標(biāo)識(shí)符的長(zhǎng)度;Authentication :權(quán)限字符串,一般是口令;NameLength3 :權(quán)限字符串的長(zhǎng)度。

30、在大多數(shù)程序中并不編寫固定用戶名和口令,而是由系統(tǒng)向用戶詢問這些信息,這種方法可以防止他人獲取對(duì)數(shù)據(jù)庫(kù)的存取權(quán),并允許用戶按一定規(guī)律修改口令。例如: SQLConnect( hdbc1, sademo, SQL_NTS,dba, SQL_NTS, sql, SQL_NTS ); 該例以用戶名“dba”和口令“sql”連接數(shù)據(jù)源“sademo”。9.4.3 連接和斷開數(shù)據(jù)源(續(xù))2、斷開數(shù)據(jù)源 當(dāng)有關(guān)的數(shù)據(jù)庫(kù)存取任務(wù)完成之后,應(yīng)該斷開與數(shù)據(jù)源的連接,關(guān)閉與指定連接句柄相關(guān)的數(shù)據(jù)源。這個(gè)操作可由SQLDisconnect函數(shù)完成。 SQLRETURN SQLDisconnect(SQLHDBC C

31、onnectionHandle); 參數(shù)ConnectionHandle是要斷開的連接句柄。 函數(shù)的返回值略。 例如: SQLDisconnect( hdbc1);9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.4 分配和釋放語句句柄1. 分配語句句柄SQL的執(zhí)行函數(shù)用于處理和傳遞SQL語句,這類函數(shù)都要求一個(gè)有效的語句句柄作為參數(shù),就像創(chuàng)建ODBC環(huán)境和連接那樣要分配一個(gè)環(huán)境句柄和連接句柄。SQLAllocHandle函數(shù)

32、可以為語句句柄分配內(nèi)存空間,并將此句柄與指定的連接句柄建立關(guān)聯(lián)。應(yīng)用系統(tǒng)必須先用SQLAllocHandle函數(shù)為SQL語句分配內(nèi)存空間,然后才能利用語句句柄引用SQL語句。SQLAllocHandle函數(shù)的格式是: SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr); 其中,HandleType是句柄的類型,這里是SQL_HANDLE_STMT,InputHandle是一個(gè)有效的、且已經(jīng)與某一個(gè)數(shù)據(jù)源連接的連接句柄,OutputHandleP

33、tr是一個(gè)指向語句句柄存儲(chǔ)區(qū)的指針。 例如: SQLHSTMT hstmt1;SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1); 9.4.4 分配和釋放語句句柄(續(xù))2. 釋放語句句柄SQLFreeStmt函數(shù)的功能是解除某一個(gè)語句句柄與相應(yīng)的SQL語句的關(guān)聯(lián)(停止指定與語句句柄相關(guān)的SQL語句),關(guān)閉與該句柄相關(guān)的游標(biāo),撤銷所有未完成的操作結(jié)果,有選擇地釋放與該句柄相關(guān)的所有資源。SQLRETURN SQLFreeStmt( SQLHSTMT StatementHandle, SQLUSMALLINT Option); StatementHand

34、le是一個(gè)有效的語句句柄; Option通過傳遞如下4個(gè)值中的一個(gè),指定釋放這個(gè)句柄的哪些資源。 Option參數(shù)的含義如下:SQL_CLOSE:用于撤銷所有未完成的操作結(jié)果,并關(guān)閉任何與句柄相關(guān)的游標(biāo)。利用這個(gè)選項(xiàng),必要時(shí)可以重復(fù)使用這個(gè)句柄。SQL_DROP:用于釋放所有與該句柄相關(guān)的資源。如果SQLFreeStmt的執(zhí)行成功,則該句柄將不再有效。SQL_UNBIND :用于釋放所有連編(Bind)的列,這個(gè)參數(shù)僅當(dāng)執(zhí)行了SQLBindCol函數(shù)時(shí)才有效。SQL_RESET_PARAAMS: 用于釋放所有聯(lián)編的參數(shù),這個(gè)參數(shù)僅當(dāng)執(zhí)行了SQLBindParameter函數(shù)時(shí)才有效。應(yīng)用系統(tǒng)可

35、以連續(xù)調(diào)用SQLFreeStmt函數(shù),每次選用不同的參數(shù),達(dá)到有選擇地釋放某些資源的效果。 例如: SQLFreeStmt(hstmt1,SQL_DROP);9.4.4 分配和釋放語句句柄(續(xù))在一個(gè)ODBC應(yīng)用程序中,環(huán)境句柄、連接句柄、語句句柄之間存在以下關(guān)系(圖9.11):ODBC應(yīng)用程序 環(huán)境句柄 連接句柄 數(shù)據(jù)源 語句句柄 1 1 1 n 1 1 1 n 圖9.11應(yīng)用程序句柄之間的關(guān)系 9.4.4 分配和釋放語句句柄(續(xù))一個(gè)ODBC應(yīng)用程序只能建立一個(gè)ODBC環(huán)境,分配一個(gè)環(huán)境句柄(圖9.11中用連線旁的1:1表示)。一個(gè)環(huán)境句柄可以建立多個(gè)連接句柄(圖9.11中用連線旁的1:n

36、表示)。每一個(gè)連接句柄實(shí)現(xiàn)與一個(gè)數(shù)據(jù)源之間的連接。在一個(gè)連接中可以建立多個(gè)語句句柄,每一個(gè)語句句柄引用一個(gè)SQL語句。9.4.4 分配和釋放語句句柄(續(xù))9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.5 執(zhí)行SQL 語句當(dāng)應(yīng)用系統(tǒng)通過ODBC執(zhí)行SQL語句時(shí),ODBC提供了兩種不同的執(zhí)行方法:直接執(zhí)行以快捷的方式執(zhí)行SQL語句。有準(zhǔn)備的執(zhí)行提供更大的靈活性。1.直接執(zhí)行SQLExecDirect函數(shù)能夠直接執(zhí)行一條準(zhǔn)備好的

37、SQL語句,如果語句有參數(shù),則由函數(shù)帶參調(diào)用,將參數(shù)傳遞給語句。SQLExecDirect是將SQL語句最快執(zhí)行的方法。函數(shù)的格式如下: SQLRETURN SQLExecDirect( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength); StatementHandle 是一個(gè)有效的語句句柄。 StatementText 是一個(gè)表示將要執(zhí)行的SQL語句的字符串。 TextLength是StatementText字符串的長(zhǎng)度。 例如,要查詢“學(xué)生表”中的所有信息,若以直接執(zhí)行的方法,則調(diào)用SQLEx

38、ecDirect的格式是: SQLExecDirect(hstmt1,”SELECT * FROM 學(xué)生”,SQL_NTS) 其中,SQL_NTS是ODBC的一個(gè)常數(shù);如果將要執(zhí)行的SQL語句的字符串是以NULL為結(jié)尾的字符串,SQL_NTS表示字符串的長(zhǎng)度。9.4.5 執(zhí)行SQL 語句(續(xù))2、有準(zhǔn)備的執(zhí)行如果SQL語句需要執(zhí)行幾次或者在執(zhí)行之前需要有關(guān)的結(jié)果集合準(zhǔn)備信息,最好采用有準(zhǔn)備的執(zhí)行函數(shù)。有準(zhǔn)備的執(zhí)行SQL語句需要兩個(gè)函數(shù):SQLPrepareSQLExecute應(yīng)用系統(tǒng)首先執(zhí)行SQLPrepare,為重復(fù)執(zhí)行SQL語句做好準(zhǔn)備。然后,調(diào)用SQLExecute函數(shù)來執(zhí)行SQL語句。

39、SQLPrepare函數(shù)的格式: SQLRETURN SQLPrepare( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength); StatementHandle 是一個(gè)有效的語句句柄。 StatementText 是一個(gè)表示將要執(zhí)行的一連串SQL語句的字符串。 TextLength 是StatementText字符串的長(zhǎng)度。9.4.5 執(zhí)行SQL 語句(續(xù))SQLExecute函數(shù)的格式: SQLRETURN SQLExecute( SQLHSTMT StatementHandle); 參數(shù)Sta

40、tementHandle:是一個(gè)有效的語句句柄。 例如,要查詢“學(xué)生”表中的所有信息,若以有準(zhǔn)備執(zhí)行的方法,則函數(shù)調(diào)用格式如下: SQLPrepare(hstmt1,”SELECT * FROM 學(xué)生”,SQL_NTS); SQLExecute(hstmt1);9.4.5 執(zhí)行SQL 語句(續(xù))9.4 ODBC的工作流程 9.4.1 建立和釋放ODBC環(huán)境 9.4.2 建立和釋放ODBC連接 9.4.3 連接和斷開數(shù)據(jù)源 9.4.4 分配和釋放語句句柄 9.4.5 執(zhí)行SQL語句 9.4.6 結(jié)果集處理9.4.6 結(jié)果集處理1、增、刪、改操作對(duì)于增、刪、改操作,可以使用SQLRowCount函

41、數(shù)返回UPDATE、INSERT、DELETE語句所影響的行數(shù)。SQLRowCount函數(shù)的格式: SQLRETURN SQLRowCount( SQLHSTMT StatementHandle, SQLINTEGER * RowCountPtr); StatementHandle是一個(gè)有效的語句句柄 RowCountPtr是指向存放結(jié)果行數(shù)變量的指針。2、查詢操作查詢語句要返回一個(gè)結(jié)果集。使用ODBC函數(shù)SQLNumResultCols()和SQLRowCount()可以獲得結(jié)果集的行數(shù)和列數(shù)。SQLNumResultCols函數(shù)的格式如下: SQLRETURN SQLNumResultCo

42、ls( SQLHSTMT StatementHandle, SQLSMALLINT * ColumnCountPtr); StatementHandle是一個(gè)有效的語句句柄 ColumnCountPtr是指向存放結(jié)果列數(shù)變量的指針。結(jié)果集數(shù)據(jù)的處理ODBC中使用游標(biāo)來處理結(jié)果集數(shù)據(jù)。ODBC中的游標(biāo)與嵌入式SQL中的游標(biāo)模型相同,它們的不同之處在于游標(biāo)的打開方式。ODBC中有多種類型的游標(biāo),不同類型的游標(biāo)有不同的特點(diǎn)。最常用的游標(biāo)類型是forward-only游標(biāo),它只能在結(jié)果集中向前滾動(dòng),是ODBC的默認(rèn)游標(biāo)類型。返回給應(yīng)用程序的結(jié)果集數(shù)據(jù)存放在應(yīng)用程序的變量中。9.4.6 結(jié)果集處理(續(xù))

43、SQLBindCol函數(shù)的格式如下: SQLRETURN SQLBindCol( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLLEN * StrLen_or_Ind); 其中,StatementHandle 是一個(gè)有效的語句句柄。 ColumnNumber 是要綁定的結(jié)果數(shù)據(jù)的列號(hào)。 TargetType 是存放結(jié)果數(shù)據(jù)的變量類型。 TargetValuePtr 是指向存放結(jié)果

44、數(shù)據(jù)的變量指針。 BufferLength 是存放結(jié)果數(shù)據(jù)的變量的緩沖區(qū)大小。 StrLen_or_Ind 是輸出真正返回的數(shù)據(jù)的長(zhǎng)度。9.4.6 結(jié)果集處理(續(xù))應(yīng)用程序使用SQLFetch函數(shù)移動(dòng)游標(biāo),并返回所有由SQLBindCol函數(shù)綁定的列的結(jié)果數(shù)據(jù)。SQLFetch函數(shù)的格式是: SQLRETURN SQLFetch( SQLHSTMT StatementHandle); 參數(shù)StatementHandle是一個(gè)有效的語句句柄。SQLFetch函數(shù)每次返回一行數(shù)據(jù),并把游標(biāo)向前滾動(dòng)一行。當(dāng)游標(biāo)位于結(jié)果集的末尾時(shí),SQLFetch函數(shù)返回SQL_NO_DATA_FOUND。 例如:

45、SQLCHAR Sno11, Sname10;SQLINTEGER SnoInd, SnameInd;SQLRETURN rc;SQLHSTMT hstmt; 9.4.6 結(jié)果集處理(續(xù))SQLGetData函數(shù)的格式如下: SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr); Stat

46、ementHandle 是一個(gè)有效的語句句柄。 ColumnNumber 是結(jié)果數(shù)據(jù)的列號(hào)。 TargetType 是存放結(jié)果數(shù)據(jù)的變量的類型。 TargetValuePtr 是數(shù)據(jù)存儲(chǔ)區(qū)的指針。 BufferLength 是緩沖區(qū)的最大長(zhǎng)度。 StrLen_or_IndPtr 是本次調(diào)用之前rgbValue中可以返回的字節(jié)總數(shù)。9.4.6 結(jié)果集處理(續(xù))第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 JDBC的工作流程9.7 小結(jié)9.5 JDBC簡(jiǎn)介 9.5.1 JDBC原理概述 9.5.2 JDBC

47、驅(qū)動(dòng)程序的分類 9.5.1 JDBC原理概述Sun公司為了解決程序的跨平臺(tái)性,推出了Java語言獨(dú)有的JDBC(Java Database Connectivity)解決方案。JDBC向應(yīng)用程序開發(fā)者提供了獨(dú)立于數(shù)據(jù)庫(kù)的統(tǒng)一的API,用于連接Java應(yīng)用程序和數(shù)據(jù)庫(kù)。借助于JDBC,開發(fā)者使用Java語言可以訪問不同位置的各種數(shù)據(jù)庫(kù)。JDBC和ODBC的原理是相同的,但是JDBC可以運(yùn)行在任何平臺(tái)上。JDBC是一套類集,支持SQL工業(yè)標(biāo)準(zhǔn),被用于編寫與平臺(tái)和數(shù)據(jù)庫(kù)管理系統(tǒng)軟件無關(guān)的代碼,非常適合開發(fā)使用Java的客戶/服務(wù)器數(shù)據(jù)庫(kù)應(yīng)用程序。通過JBDBC-ODBC橋,把JDBC的方法調(diào)用轉(zhuǎn)換成

48、ODBC的函數(shù)調(diào)用,從而使程序員使用JDBC技術(shù)可以訪問ODBC數(shù)據(jù)源。 JDBC借鑒了ODBC和X/OPEN SQL 調(diào)用級(jí)別接口規(guī)范(Call Level Interface)的經(jīng)驗(yàn),提供了一個(gè)簡(jiǎn)單的接口,使程序員可以使用熟悉的SQL語言訪問數(shù)據(jù)庫(kù)。JDBC的原理同ODBC相同,其組成結(jié)構(gòu)類似于圖9.2,由以下幾部分組成:應(yīng)用程序應(yīng)用程序接口驅(qū)動(dòng)程序管理器驅(qū)動(dòng)程序數(shù)據(jù)庫(kù) 9.5.1 JDBC原理概述(續(xù))JDBC由一些Java語言編寫的類和接口組成,包含在下面的兩個(gè)類包中。Java.sql包:提供在Java中訪問和處理存儲(chǔ)于客戶端數(shù)據(jù)源中數(shù)據(jù)的API。Javax.sql包:提供在Java中

49、對(duì)服務(wù)器端數(shù)據(jù)源進(jìn)行訪問和處理的API。JDBC提供的主要的類和接口有:DriverManager類:用于處理驅(qū)動(dòng)程序的加載。Connection接口:與特定數(shù)據(jù)庫(kù)建立連接。Statement接口:用于SQL語句的執(zhí)行,包括查詢語句、更新語句、創(chuàng)建數(shù)據(jù)庫(kù)語句等。ResultSet接口組成:用于保存查詢所得到的結(jié)果。 9.5.1 JDBC原理概述(續(xù))1. 應(yīng)用程序應(yīng)用層的應(yīng)用程序可以是Java應(yīng)用程序或者Java小程序,用戶界面可以由程序?qū)崿F(xiàn)或者直接使用瀏覽器。應(yīng)用層使用JDBC提供的API訪問數(shù)據(jù)庫(kù),一般的步驟為:請(qǐng)求連接數(shù)據(jù)庫(kù)。建立數(shù)據(jù)庫(kù)連接。建立語句對(duì)象。執(zhí)行SQL語句。處理結(jié)果集。關(guān)閉

50、連接。9.5.1 JDBC原理概述(續(xù))2、驅(qū)動(dòng)程序管理器驅(qū)動(dòng)程序管理器由java.sql.DriverManager類實(shí)現(xiàn),負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序。DriverManager類主要跟蹤已經(jīng)加載的JDBC驅(qū)動(dòng)程序,在數(shù)據(jù)庫(kù)和驅(qū)動(dòng)程序之間建立連接,也處理如登錄時(shí)間限制、跟蹤信息等工作。DriverManager類的初始化操作會(huì)調(diào)用其成員方法registerDriver(Driver driver)加載驅(qū)動(dòng)程序,參數(shù)Driver是一個(gè)java接口,每個(gè)驅(qū)動(dòng)程序類都必須實(shí)現(xiàn)這個(gè)接口,要加載的驅(qū)動(dòng)程序由系統(tǒng)屬性jdbc.drivers所指定。DriverManager類的成員方法getConnect

51、ion(String url)試圖建立與指定數(shù)據(jù)庫(kù)的連接。其中,url是數(shù)據(jù)庫(kù)統(tǒng)一資源定位符號(hào),是一個(gè)完整的數(shù)據(jù)庫(kù)連接名稱。9.5.1 JDBC原理概述(續(xù))3、數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序JDBC通過驅(qū)動(dòng)程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性的。驅(qū)動(dòng)程序與具體的RDBMS有關(guān)。 例如:若要對(duì)Oracle數(shù)據(jù)庫(kù)操作就要用Oracle的驅(qū)動(dòng)程序。若要對(duì)Sybase數(shù)據(jù)庫(kù)操作就要用Sybase的驅(qū)動(dòng)程序。 9.5.1 JDBC原理概述(續(xù))4、訪問ODBC數(shù)據(jù)源 JDBC提供了ODBC橋,通過ODBC橋可以訪問ODBC數(shù)據(jù)源。橋由Intersolv和JavaSoft開發(fā),作為包sun.jdbc.odbc與JDK

52、一起被自動(dòng)安裝,無需特殊配置,即可以訪問本地的ODBC數(shù)據(jù)源。9.5.1 JDBC原理概述(續(xù))9.5 JDBC簡(jiǎn)介 9.5.1 JDBC原理概述 9.5.2 JDBC驅(qū)動(dòng)程序的分類 9.5.2 JDBC驅(qū)動(dòng)程序的分類訪問數(shù)據(jù)庫(kù)需要使用合適的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序由數(shù)據(jù)庫(kù)管理系統(tǒng)廠商提供或者由第三方軟件開發(fā)者提供。Sun在http:/products/jdbc/drivers頁(yè)面中有JDBC驅(qū)動(dòng)程序提供者列表。驅(qū)動(dòng)程序有兩個(gè)版本:JDBC 1.x和JDBC 2.x。在開發(fā)代碼之前,應(yīng)該決定使用哪個(gè)版本的驅(qū)動(dòng)程序。JDBC 1驅(qū)動(dòng)程序被劃分為4種類型。JDBC 2仍能識(shí)別這些類型并添加附加驅(qū)動(dòng)程序以

53、支持接口javax.sql.datasource。如果程序只使用java.sql程序包,有以下4種類型的驅(qū)動(dòng)程序供選擇。 DB類型1JDBC驅(qū)動(dòng)程序類型2JDBC驅(qū)動(dòng)程序類型4JDBC驅(qū)動(dòng)程序第3方API數(shù)據(jù)庫(kù)API類型3JDBC驅(qū)動(dòng)程序圖9.12 JDBC驅(qū)動(dòng)程序分類 9.5.2 JDBC驅(qū)動(dòng)程序的分類(續(xù))1、JDBC-ODBC橋橋?qū)DBC操作轉(zhuǎn)換成ODBC操作,易于理解和使用。需要在客戶端安裝ODBC驅(qū)動(dòng)程序,應(yīng)用程序和數(shù)據(jù)庫(kù)要在同一臺(tái)機(jī)器上。9.5.2 JDBC驅(qū)動(dòng)程序的分類(續(xù))2、本機(jī)代碼和Java驅(qū)動(dòng)程序,即JDBC-Native橋驅(qū)動(dòng)程序包含調(diào)用數(shù)據(jù)庫(kù)編程接口(由C或C+實(shí)現(xiàn)

54、)的Java代碼。大多數(shù)數(shù)據(jù)庫(kù)廠商都在其數(shù)據(jù)庫(kù)產(chǎn)品中提供了這種方式的驅(qū)動(dòng)程序。優(yōu)點(diǎn):運(yùn)行效率高。缺點(diǎn):由于數(shù)據(jù)庫(kù)編程接口代碼與平臺(tái)有關(guān),使用這種類型的驅(qū)動(dòng)程序失去了Java的平臺(tái)無關(guān)性。另外,要求應(yīng)用程序和數(shù)據(jù)庫(kù)要在同一臺(tái)機(jī)器上。 9.5.2 JDBC驅(qū)動(dòng)程序的分類(續(xù))3、JDBC網(wǎng)絡(luò)的純Java驅(qū)動(dòng)程序,即JDBC-Network橋不需要客戶端的數(shù)據(jù)庫(kù)驅(qū)動(dòng),而是使用網(wǎng)絡(luò)-服務(wù)器中間件來訪問數(shù)據(jù)庫(kù)。這種類型的驅(qū)動(dòng)程序與平臺(tái)無關(guān),并且不需要客戶端的安裝和管理,因此非常適合Internet環(huán)境。 9.5.2 JDBC驅(qū)動(dòng)程序的分類(續(xù))4、基于本機(jī)協(xié)議的純Java驅(qū)動(dòng)程序驅(qū)動(dòng)程序使用數(shù)據(jù)庫(kù)特有的

55、網(wǎng)絡(luò)協(xié)議,通過Java Socket直接與數(shù)據(jù)庫(kù)對(duì)話。四種類型的驅(qū)動(dòng)程序的原理及相互關(guān)系如圖9.12,虛線表示本機(jī)API,實(shí)線表示網(wǎng)絡(luò)API。類型1調(diào)用本機(jī)的第3方API(ODBC)訪問數(shù)據(jù)庫(kù)。類型2調(diào)用本機(jī)的數(shù)據(jù)庫(kù)編程接口訪問數(shù)據(jù)庫(kù)。類型4通過數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)協(xié)議訪問數(shù)據(jù)庫(kù)。類型3通過Socket訪問中間件實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問。9.5.2 JDBC驅(qū)動(dòng)程序的分類(續(xù))第9章 數(shù)據(jù)庫(kù)互連方法9.1 學(xué)習(xí)目標(biāo)9.2 數(shù)據(jù)庫(kù)互連原理 9.3 ODBC簡(jiǎn)介 9.4 ODBC的工作流程9.5 JDBC簡(jiǎn)介9.6 JDBC的工作流程9.7 小結(jié)9.6 JDBC的工作流程 9.6.1 一般的查詢流程 9.6.2

56、 一般的更新流程 9.6.1 一般的查詢流程1、建立數(shù)據(jù)庫(kù)連接 (1)加載要使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類。 使用Class類的靜態(tài)方法forName完成,例如,加載JDBC-ODBC橋驅(qū)動(dòng)程序: Class.forName(” sun:jdbc:odbc:JdbcOdbcDriver”); (2)聲明一個(gè)Connection接口的對(duì)象; Connection conn; (3)使用driverManager類的靜態(tài)方法getConnection建立與數(shù)據(jù)庫(kù)的連接,getConnection方法有兩種重載形式:Connection getConnection(String url);Connectio

57、n getConnection(String url, String user, String password);url是數(shù)據(jù)庫(kù)統(tǒng)一資源定位器,user和password是登錄數(shù)據(jù)庫(kù)所需要的用戶名和密碼。url的格式如下: jdbc: 其中: jdbc是連接數(shù)據(jù)庫(kù)的協(xié)議; 指驅(qū)動(dòng)程序或數(shù)據(jù)庫(kù)連接機(jī)制; 是的參數(shù)。 下面是使用JDBC-ODBC橋連接實(shí)例數(shù)據(jù)庫(kù)的語句: Jdbc:odbc:SExample9.6.1 一般的查詢流程(續(xù)) 例 9.2 使用ODBC連接本機(jī)SQL Server的S_C_SC數(shù)據(jù)庫(kù)。 Class.forName(“sun:jdbc:odbc:JdbcOdbcDriv

58、er”); Connection conn; conn = driverManager. getConnection(”jdbc:odbc:SExample”, ”Manager”, ”);9.6.1 一般的查詢流程(續(xù)) 2、建立語句對(duì)象,執(zhí)行查詢操作首先聲明語句對(duì)象st和結(jié)果集對(duì)象rs。調(diào)用Connection的成員方法createStaement創(chuàng)建語句對(duì)象st。調(diào)用Statement的成員方法executeQuery創(chuàng)建結(jié)果集對(duì)象rs。執(zhí)行查詢語句,獲取結(jié)果,存放在rs中。 Statement st; ResultSet rs; st = conn.createStatement();

59、 rs = st.executeQuery(”SELECT * FROM Student”);9.6.1 一般的查詢流程(續(xù))3、處理查詢結(jié)果集executeQuery()方法建立了一個(gè)結(jié)果集。結(jié)果集有若干種類型,結(jié)果集的類型決定了游標(biāo)的移動(dòng)方式和操作種類。結(jié)果集的類型由createStatement方法確定,createStatement方法的另外一種形式如下: createStatement(int resultSetType, int resultSetConcurrency) 參數(shù)resultSetType指名結(jié)果集的類型。TYPE_FORWARD_ONLY:結(jié)果集的游標(biāo)只能向前移動(dòng)。

60、TYPE_SCROLL_INSENSITIVE:游標(biāo)向前或向后雙向移動(dòng),結(jié)果集不反映表中數(shù)據(jù)的最新變化。TYPE_SCROLL_SENSITIVE:游標(biāo)向前或向后雙向移動(dòng),結(jié)果集立刻反映表中數(shù)據(jù)的最新變化。 參數(shù)resultSetConcurrency決定結(jié)果集的更新方式。CONCUR_READ_ONLY:不可以進(jìn)行修改結(jié)果集中的數(shù)據(jù)。CONCUR_UPDATABLE:可以進(jìn)行修改結(jié)果集中的數(shù)據(jù)。9.6.1 一般的查詢流程(續(xù))結(jié)果集對(duì)記錄進(jìn)行了編號(hào),并且有一個(gè)游標(biāo)(記錄指針),初始時(shí)指向第一條記錄之前。ResultSet接口提供了若干方法供移動(dòng)游標(biāo)。beforeFirst():移動(dòng)到結(jié)果集的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論