java JDBC與數(shù)據(jù)庫訪問PPT課件_第1頁
java JDBC與數(shù)據(jù)庫訪問PPT課件_第2頁
java JDBC與數(shù)據(jù)庫訪問PPT課件_第3頁
java JDBC與數(shù)據(jù)庫訪問PPT課件_第4頁
java JDBC與數(shù)據(jù)庫訪問PPT課件_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目錄 10.1 數(shù)據(jù)庫基礎(chǔ)知識 10.2 通過JDBC訪問數(shù)據(jù)庫 10.3 本章小結(jié)第1頁/共60頁10.1 數(shù)據(jù)庫基礎(chǔ)知識 數(shù)據(jù)管理的兩個階段 文件管理 各種數(shù)據(jù)都是以文件為單位存儲在外存,且由操作系統(tǒng)統(tǒng)一管理 文件相對獨(dú)立,文件結(jié)構(gòu)不能很好地反映現(xiàn)實世界中事物之間的聯(lián)系,文件中存在大量的數(shù)據(jù)冗余 數(shù)據(jù)庫管理 以數(shù)據(jù)為中心組織數(shù)據(jù),減少冗余,并提供更高的數(shù)據(jù)共享能力,由數(shù)據(jù)庫系統(tǒng)進(jìn)行管理 程序和數(shù)據(jù)具有較高的獨(dú)立性,當(dāng)數(shù)據(jù)的邏輯結(jié)構(gòu)改變時,不涉及數(shù)據(jù)的物理結(jié)構(gòu),也不影響應(yīng)用程序,從而降低應(yīng)用程序研制與維護(hù)的費(fèi)用第2頁/共60頁10.1.1 數(shù)據(jù)庫技術(shù)的特點 數(shù)據(jù)庫技術(shù)有如下一些特點 面向企業(yè)

2、或部門,以數(shù)據(jù)為中心組織數(shù)據(jù),形成綜合性的數(shù)據(jù)庫為各應(yīng)用共享 采用一定的數(shù)據(jù)模型。數(shù)據(jù)模型不僅要描述數(shù)據(jù)本身的特點,而且要描述數(shù)據(jù)之間的聯(lián)系 數(shù)據(jù)冗余小,易修改、易擴(kuò)充。不同的應(yīng)用程序根據(jù)處理要求,從數(shù)據(jù)庫中獲取需要的數(shù)據(jù),這樣就減少了數(shù)據(jù)的重復(fù)存貯,也便于維護(hù)數(shù)據(jù)的一致性 程序和數(shù)據(jù)有較高的獨(dú)立性。當(dāng)數(shù)據(jù)的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)改變時,有可能不影響或較少影響應(yīng)用程序 具有良好的用戶接口,用戶可方便地開發(fā)和使用數(shù)據(jù)庫 對數(shù)據(jù)進(jìn)行統(tǒng)一管理和控制,提供了數(shù)據(jù)的安全性、完整性、以及并發(fā)控制數(shù)據(jù)庫基礎(chǔ)知識第3頁/共60頁10.1.1 數(shù)據(jù)庫技術(shù)的特點(續(xù)) 應(yīng)用程序訪問數(shù)據(jù)庫的基本模式 DBMS(數(shù)據(jù)庫管

3、理系統(tǒng))是數(shù)據(jù)庫的核心軟件。數(shù)據(jù)庫系統(tǒng)的各種操作,包括創(chuàng)建數(shù)據(jù)庫對象、檢索和修改數(shù)據(jù)庫中的數(shù)據(jù),都是通過DBMS實現(xiàn)的數(shù)據(jù)庫基礎(chǔ)知識DBMS 數(shù)據(jù)庫應(yīng)用程序 1 數(shù)據(jù)庫應(yīng)用程序 2 數(shù)據(jù)庫應(yīng)用程序 3 數(shù)據(jù)庫 第4頁/共60頁10.1.2 數(shù)據(jù)模型 數(shù)據(jù)模型 數(shù)據(jù)庫的邏輯結(jié)構(gòu) 所有的數(shù)據(jù)庫系統(tǒng)都是基于某種數(shù)據(jù)模型的 不同種類的數(shù)據(jù)庫可能支持不同的數(shù)據(jù)模型 關(guān)系數(shù)據(jù)庫就是因為支持關(guān)系模型而得名數(shù)據(jù)庫基礎(chǔ)知識第5頁/共60頁 關(guān)系模型 形象地說就是二維表結(jié)構(gòu),也稱之為關(guān)系表 一個關(guān)系數(shù)據(jù)庫可以包含多個關(guān)系表,關(guān)系表是數(shù)據(jù)庫中組織和存儲數(shù)據(jù)的基本單位 每個表都用于存儲面向某個主題的信息。例如: 學(xué)生

4、表存儲學(xué)生信息 系表存儲各系的信息 課程表存儲課程信息等 關(guān)系表每一行存儲一個記錄,每一列表示記錄的一個屬性。設(shè)計一個關(guān)系表時需要 為表命名 設(shè)計表的列結(jié)構(gòu),其中包括列名及列的數(shù)據(jù)類型10.1.2 數(shù)據(jù)模型數(shù)據(jù)庫基礎(chǔ)知識第6頁/共60頁10.1.2 數(shù)據(jù)模型 學(xué)生表 由5列組成,每一列表示學(xué)生的一個屬性 每個學(xué)生都是用學(xué)號、姓名、性別、出生年月及所屬系的系號等屬性來描述,在這些屬性上的一組合法取值就對應(yīng)一個學(xué)生記錄(表中的一行)數(shù)據(jù)庫基礎(chǔ)知識 學(xué)號 姓名 性別 出生年月 系號 2005001 張小紅 女 1987 -4-23 d01 2005002 李平 男 1988 -2-13 d01 20

5、05101 成功 男 1986 -10 -21 d02 學(xué)生表 系號 系名 電話 d01 計算機(jī)系 3395 d02 物理系 3787 系表 第7頁/共60頁10.1.3 關(guān)系表中的主碼與外來碼 主碼 為了保證關(guān)系表中沒有重復(fù)的記錄,需要為關(guān)系表定義一個主碼,作用是唯一標(biāo)識表中的一個記錄 可以是表中的一列,也可以由幾列組合而成 在建表時如果定義了主碼,系統(tǒng)可以對輸入該表的數(shù)據(jù)進(jìn)行檢查,要求主碼不能重、也不能空(NULL) 例如在學(xué)生表中 學(xué)號可以作為主碼,因為一個學(xué)號可以唯一地確定表中的一個學(xué)生記錄 由于學(xué)生中有重名現(xiàn)象,姓名就不能用來做為主碼數(shù)據(jù)庫基礎(chǔ)知識第8頁/共60頁10.1.3 關(guān)系表

6、中的主碼與外來碼(續(xù)) 外來碼 現(xiàn)實世界中事物之間的聯(lián)系反 映到數(shù)據(jù)庫中就體現(xiàn)為表之間的聯(lián)系,在關(guān)系數(shù)據(jù)庫中,借助“外來碼”實現(xiàn)存貯這種聯(lián)系的信息 如果一個表中的某一列是另外一個表中的主碼,那么該列稱之為外來碼。 例如在學(xué)生表中,“系號”就是外來碼,因為系號是系表的主碼,在學(xué)生表中設(shè)計了“系號”一列,就是為了存儲學(xué)生和系之間的聯(lián)系信息 通過外來碼和主碼的等值連接將不同表里的相關(guān)記錄連接在一起,從而實現(xiàn)數(shù)據(jù)庫中相關(guān)數(shù)據(jù)的查找 可以查詢每個學(xué)生所在系的信息,也可以查詢指定系所包含的學(xué)生信息數(shù)據(jù)庫基礎(chǔ)知識第9頁/共60頁NumberNameDepartmentSalaryLocation23603J

7、ones4131100New Jersey24568Kerwin4132000New Jersey34589Larson6421800Los Angeles35761Myers6111400Orlando47132Neumann4139000New Jersey78321Stephens6118500OrlandoRowColumnPrimary key10.1.3 關(guān)系表中的主碼與外來碼(續(xù))數(shù)據(jù)庫基礎(chǔ)知識第10頁/共60頁 該數(shù)據(jù)庫中建有 員工基本信息表(person) 包括工作證號、姓名、部門編號、職務(wù)、工資、學(xué)歷編號等字段 工作證號(ID)是該表的主碼 Department列是一個外來

8、碼,匹配部門編碼表中的DepID主碼 Education列也是一個外來碼,匹配學(xué)歷編碼表中的EduID主碼 部門編碼表(department) 保存了部門編號和部門名稱 部門編號(DepID)是主碼 學(xué)歷編碼表(education) 保存了學(xué)歷編號和學(xué)歷名稱 學(xué)歷編號(EduID)是主碼10.1.3關(guān)系表中的主碼與外來碼(續(xù))員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫基礎(chǔ)知識第11頁/共60頁10.1.3關(guān)系表中的主碼與外來碼(續(xù))員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫基礎(chǔ)知識 ID Name Dep artment Occupation Salary Education 1 張三 1 Man

9、ager 3500 5 2 李四 2 Secretary 1200 3 3 王五 3 Driver 1500 2 4 韓六 4 Engineer 3000 4 DepID Name 1 經(jīng)理室 2 項目部 3 財務(wù)部 4 市場部 5 運(yùn)輸部 6 后勤部 person department education EduID Name 1 初中 2 高中 3 大專 4 本科 5 碩士 6 博士 第12頁/共60頁10.1.4 建立一個實例數(shù)據(jù)庫 建立數(shù)據(jù)庫需要借助于數(shù)據(jù)庫管理系統(tǒng),不同的數(shù)據(jù)庫管理系統(tǒng)其具體操作方法是不同的,以Windows平臺上的一個簡單的關(guān)系型數(shù)據(jù)庫Access為例,建立一個數(shù)據(jù)

10、庫,為編寫Java的數(shù)據(jù)庫訪問程序提供一個實例環(huán)境 1啟動Office 的Microsoft Access,選擇“新建一個Access數(shù)據(jù)庫選項”,在文件名輸入欄中輸入“PMS.mdb”。該文件代表一個Access數(shù)據(jù)庫數(shù)據(jù)庫基礎(chǔ)知識第13頁/共60頁10.1.4 建立一個實例數(shù)據(jù)庫 PMS數(shù)據(jù)庫窗口出現(xiàn)在Access主窗口中。在數(shù)據(jù)庫窗口的左側(cè),列出了常用的7類數(shù)據(jù)庫對象。當(dāng)選中某對象類后,就可以在右窗口中進(jìn)行有關(guān)該對象的操作,如建立、修改,運(yùn)行等。7類對象的主要含義分別是: 表 關(guān)系表,可以實現(xiàn)的操作包括表的建立、數(shù)據(jù)的維護(hù)、查詢等 查詢 可以建立一個查詢(視圖的概念),還可以運(yùn)行SQL語

11、句 窗體 數(shù)據(jù)庫應(yīng)用界面,可進(jìn)行簡單數(shù)據(jù)庫應(yīng)用開發(fā) 報表 報表的制作與打印輸出 頁 可生成基于web頁面的數(shù)據(jù)庫應(yīng)用界面 宏 可定義完成特定任務(wù)的操作或操作集 模塊 可定義數(shù)據(jù)庫中使用的公共過程與函數(shù) 數(shù)據(jù)庫基礎(chǔ)知識第14頁/共60頁10.1.4 建立一個實例數(shù)據(jù)庫 2 在對象欄中選擇“表”,再選擇“使用設(shè)計器創(chuàng)建表”方式,單擊工具欄中的“設(shè)計”按鈕,就會出現(xiàn)表設(shè)計窗口。在該窗口中可以定義字段的名稱、數(shù)據(jù)類型、字段說明信息等。分別設(shè)計Person表、 Department表、Education表數(shù)據(jù)庫基礎(chǔ)知識第15頁/共60頁10.1.4 建立一個實例數(shù)據(jù)庫數(shù)據(jù)庫基礎(chǔ)知識第16頁/共60頁10

12、.1.4 建立一個實例數(shù)據(jù)庫 3建立表之間的聯(lián)系 點擊主窗口“工具”菜單中的“關(guān)系”選項,打開“關(guān)系”視圖 用鼠標(biāo)拖動Education表的EduID屬性,拉到Person表的Education屬性上,在自動彈出的“編輯關(guān)系”對話框中,選擇實施參照完整性,點擊“創(chuàng)建”按鈕 用同樣方法建立Department表中DepID列和Person表中Department列數(shù)據(jù)庫基礎(chǔ)知識第17頁/共60頁10.1.4 建立一個實例數(shù)據(jù)庫4 為每個表創(chuàng)建數(shù)據(jù) 數(shù)據(jù)庫基礎(chǔ)知識第18頁/共60頁10.1.5 SQL語言簡介 SQL語言 關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,從大型數(shù)據(jù)庫(如Oracle)到微機(jī)數(shù)據(jù)庫(如Acce

13、ss)都支持 可以實現(xiàn)對數(shù)據(jù)庫的各種操作。例如 表及其他數(shù)據(jù)庫對象的定義 數(shù)據(jù)的查詢與數(shù)據(jù)維護(hù) 對數(shù)據(jù)庫進(jìn)行控制 是非過程化的語言,只需要告訴數(shù)據(jù)庫做什么,而不需要描述怎么做 語句都是獨(dú)立執(zhí)行的,無上下文聯(lián)系 本身不區(qū)分大小寫數(shù)據(jù)庫基礎(chǔ)知識第19頁/共60頁SQL 關(guān)鍵字 描述 SELECT 從一個或多個表中提取數(shù)據(jù) FROM SELECT查詢的數(shù)據(jù)表格 WHERE 決定數(shù)據(jù)行被提取、刪除或更新的標(biāo)準(zhǔn) GROUP BY 對行進(jìn)行分組的標(biāo)準(zhǔn) ORDER BY 對行進(jìn)行排序的標(biāo)準(zhǔn) INNER JOIN 合并多個表格中的行 INSERT 向指定表中插入行 UPDATE 更新指定表中的行 DELETE

14、 刪除指定表格中的行 10.1.5 SQL語言簡介(續(xù))SQL關(guān)鍵字?jǐn)?shù)據(jù)庫基礎(chǔ)知識第20頁/共60頁 在SQL語言中,對數(shù)據(jù)庫中數(shù)據(jù)的操作可分為讀寫兩種 讀操作(查詢)通過SELECT語句實現(xiàn),該語句的執(zhí)行不會改變數(shù)據(jù)庫中的數(shù)據(jù) 可以返回一行或多行數(shù)據(jù) 也可能沒有返回結(jié)果(沒有查到滿足條件的記錄) 涉及到寫操作的語句共有3個 INSERT UPDATE DELETE10.1.5 SQL語言簡介(續(xù)) SQL語言的讀/寫操作數(shù)據(jù)庫基礎(chǔ)知識第21頁/共60頁 建表語句 定義表中各列的名稱及數(shù)據(jù)類型 有關(guān)列的數(shù)據(jù)類型可參考具體數(shù)據(jù)庫的語法手冊CREATE TABLE person ( id INTE

15、GER PRIMARY KEY, /定義該列為主碼 name VARCHAR(10), /列定義,字符型 department INTEGER, /列定義,整型 occupation VARCHAR(10), salary NUMBER, education INTEGER);10.1.5 SQL語言簡介(續(xù))建表語句數(shù)據(jù)庫基礎(chǔ)知識第22頁/共60頁 插入語句 向指定表插入一條記錄,插入的值要與表的定義匹配 插入一行數(shù)據(jù)NSERT INTO table_nameVALUES (value1, value2,.) 插入一行數(shù)據(jù)在指定的字段上INSERT INTO table_name (colu

16、mn1, column2,.)VALUES (value1, value2,.) 例如在person表中插入一行INSERT INTO person VALUES (1, 張三, 1, manager, 3500, 5); 10.1.5 SQL語言簡介(續(xù))插入語句數(shù)據(jù)庫基礎(chǔ)知識第23頁/共60頁 修改語句 修改指定記錄中某列的值,更新表中原有數(shù)據(jù) 其格式為UPDATE table_name SET column_name = new_valueWHERE column_name = some_value 例如:將person表中id號為1的人員的工資修改為3700元UPDATE person

17、 SET salary = 3700 /指定對哪列進(jìn)行修改、如何修改WHERE id = 1 ; /選擇要修改的行 10.1.5 SQL語言簡介(續(xù))修改語句數(shù)據(jù)庫基礎(chǔ)知識第24頁/共60頁 刪除語句 刪除表中的指定的數(shù)據(jù) 其格式為DELETE FROM table_name WHERE column_name = some_value 例如刪除部門號為4的員工記錄DELETE FROM person WHERE department = 4 ; 10.1.5 SQL語言簡介(續(xù))刪除語句數(shù)據(jù)庫基礎(chǔ)知識第25頁/共60頁 查詢語句 從指定表中取出指定的數(shù)據(jù)SELECT select_list

18、INTO new_table FROM table_source WHERE search_condition GROUP BY group_by_expression HAVING search_condition ORDER BY order_expression ASC | DESC 10.1.5 SQL語言簡介(續(xù))查詢語句數(shù)據(jù)庫基礎(chǔ)知識第26頁/共60頁 例:查詢工資大于2000的員工的姓名及職務(wù)SELECT * / “*”號表示輸出全部列的值FROM person /指定查詢的表,本查詢只用到person表WHERE salary2000 ; /查詢條件 例:查詢員工“張三”的學(xué)歷

19、,輸出學(xué)歷名SELECT FROM person , education /該查詢用到兩個表WHERE = 張三 AND cation =id ; 10.1.5 SQL語言簡介(續(xù))查詢語句數(shù)據(jù)庫基礎(chǔ)知識第27頁/共60頁10.2 通過JDBC訪問數(shù)據(jù)庫 JDBC (Java DataBase Connectivity) 是用于執(zhí)行SQL語句的Java應(yīng)用程序接口,由一組用Java語言編寫的類與接口組成,是一種底層API 使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序 用JDBC寫的程序能夠

20、自動地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫管理系統(tǒng)(DBMS)第28頁/共60頁 JDBC (Java DataBase Connectivity) 是一種規(guī)范,它讓各數(shù)據(jù)庫廠商為Java程序員提供標(biāo)準(zhǔn)的數(shù)據(jù)庫訪問類和接口,這樣就使得獨(dú)立于DBMS的Java應(yīng)用開發(fā)工具和產(chǎn)品成為可能 隔離了Java與不同數(shù)據(jù)庫之間的對話,使得 程序員只須寫一遍程序就可讓它在任何數(shù)據(jù)庫管理系統(tǒng)平臺上運(yùn)行 使用已有的SQL標(biāo)準(zhǔn),并支持其它數(shù)據(jù)庫連接標(biāo)準(zhǔn),如與ODBC之間的橋接10.2 通過JDBC訪問數(shù)據(jù)庫(續(xù))JDBC通過JDBC訪問數(shù)據(jù)庫第29頁/共60頁 Java程序通過JDBC訪問數(shù)據(jù)庫的關(guān)系通過JDBC

21、訪問數(shù)據(jù)庫10.2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) 應(yīng)用程序應(yīng)用程序 (Java) Java JDBC 驅(qū)動程序驅(qū)動程序 (Java 類)類) Sun JDBC/ODBC 橋橋 (本地)(本地) ODBC驅(qū)動程序驅(qū)動程序 (本地)(本地) 數(shù)據(jù)庫客戶機(jī)數(shù)據(jù)庫客戶機(jī) 數(shù)數(shù) 據(jù)據(jù) 庫庫 100%純純Java 解決方案解決方案 Java本地代碼本地代碼 混合解決方案混合解決方案 第30頁/共60頁 ODBC( OpenDatabaseConnectivity ) 由微軟公司提出,用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)中存取數(shù)據(jù) 是一套用C語言實現(xiàn)的訪問數(shù)據(jù)庫的API 通過ODBC API,應(yīng)用程序可以存取保

22、存在多種不同數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個DBMS使用了何種數(shù)據(jù)存儲格式和編程接口 對于沒有提供JDBC驅(qū)動的數(shù)據(jù)庫,從Java程序調(diào)用本地的C程序訪問數(shù)據(jù)庫會帶來一系列安全性、完整性、健壯性等方面的問題,因而通過JDBC-ODBC橋來訪問沒有提供JDBC接口的數(shù)據(jù)庫是一個常用的方案10.1.2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) ODBC通過JDBC訪問數(shù)據(jù)庫第31頁/共60頁 ODBC的結(jié)構(gòu) 應(yīng)用程序(Application) :本身不直接與數(shù)據(jù)庫打交道,主要負(fù)責(zé)處理并調(diào)用ODBC函數(shù),發(fā)送對數(shù)據(jù)庫的SQL請求及取得結(jié)果 驅(qū)動器管理器(ODBC manager) :為應(yīng)用程序裝載

23、數(shù)據(jù)庫驅(qū)動器 數(shù)據(jù)庫驅(qū)動器(ODBC Drivers) :實現(xiàn)ODBC的函數(shù)調(diào)用,提供對特定數(shù)據(jù)源的SQL請求。 數(shù)據(jù)源(Data Sources,數(shù)據(jù)庫) :由用戶想要存取的數(shù)據(jù)以及與它相關(guān)的操作系統(tǒng)、DBMS和用于訪問DBMS的網(wǎng)絡(luò)平臺組成。 訪問數(shù)據(jù)庫的模式你的程序 ODBC管理器 ODBC驅(qū)動程序 數(shù)據(jù)庫10.1.2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) ODBC的結(jié)構(gòu)通過JDBC訪問數(shù)據(jù)庫第32頁/共60頁 ODBC的不足 是一個C語言實現(xiàn)的API,并不適合在Java中直接使用。從Java程序調(diào)用本地的C程序會帶來一系列類似安全性、完整性、健壯性的缺點 完全精確地實現(xiàn)從C代碼ODBC到Jav

24、a API寫的ODBC的翻譯也并不令人滿意。比如,Java沒有指針,而ODBC中大量地使用了指針,包括極易出錯的無類型指針“void”。 ODBC并不容易學(xué)習(xí),它將簡單特性和復(fù)雜特性混雜在一起,甚至對非常簡單的查詢都有復(fù)雜的選項。而JDBC剛好相反,它保持了簡單事物的簡單性,但又允許復(fù)雜的特性10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) ODBC的不足通過JDBC訪問數(shù)據(jù)庫第33頁/共60頁 JDBC API 是一組由Java語言編寫的類和接口,包含在java.sql和javax.sql兩個包中 java.sql為核心包,這個包包含于J2SE中 javax.sql包擴(kuò)展了JDBC API的功能,成

25、為了J2EE的一個基本組成部分 可分為兩個層次 面向底層的JDBC Driver API 主要是針對數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫底層驅(qū)動程序使用 面向程序員的JDBC API10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC API通過JDBC訪問數(shù)據(jù)庫第34頁/共60頁 應(yīng)用程序通過JDBC API和底層的JDBC Driver API打交道10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC API的體系結(jié)構(gòu)通過JDBC訪問數(shù)據(jù)庫JAVA 應(yīng)用程序JDBC 驅(qū)動器管理器純JDBC驅(qū)動程序JDBC -ODBC橋接驅(qū)動程序ODBC 和數(shù)據(jù)庫驅(qū)動DBMS 提供的本機(jī)JAVA APIJDBC APIJDBC

26、 DRIVER API數(shù)據(jù)庫別的驅(qū)動方式第35頁/共60頁10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC的Driver類型 JDBC的Driver可以分為4種類型通過JDBC訪問數(shù)據(jù)庫名稱 解釋 JDBC-ODBC 和 ODBC Driver 通過 ODBC 驅(qū)動器提供數(shù)據(jù)庫連接。使用這種驅(qū)動器,要求每一臺客戶機(jī)都裝入 ODBC 驅(qū)動。 Native-API partly-Java Driver 將數(shù)據(jù)庫廠商的特殊協(xié)議轉(zhuǎn)換成 Java代碼及二進(jìn)制類碼,客戶機(jī)上需要裝有相應(yīng) DBMS 的驅(qū)動程序。 JDBC-Net All-Java Driver 將 JDBC指令轉(zhuǎn)化成獨(dú)立于 DBMS 的網(wǎng)

27、絡(luò)協(xié)議形式,再由服務(wù)器轉(zhuǎn)化為特定 DBMS 的協(xié)議形式。目前一些廠商已經(jīng)開始添加 JDBC 的這種驅(qū)動器到它們已有的數(shù)據(jù)庫中介產(chǎn)品中。 Native-protocol All-Java Driver 將 JDBC 指令轉(zhuǎn)化成網(wǎng)絡(luò)協(xié)議后不再轉(zhuǎn)換,而是由 DBMS 直接使用。 第36頁/共60頁 在這四種驅(qū)動器中,后兩種“純Java”的驅(qū)動器效率更高,也更具有通用性,它們能夠充分表現(xiàn)出Java技術(shù)的優(yōu)勢,例如可以在applet中自動下載需要的JDBC驅(qū)動器 如果不能得到純Java的驅(qū)動器,則可以使用前兩種驅(qū)動器作為中間解決方案,因為它們比較容易獲得,使用也較普遍。后面的例子就是用JDBC-ODBC

28、 Bridge驅(qū)動器完成的10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC的Driver類型通過JDBC訪問數(shù)據(jù)庫第37頁/共60頁 面向程序員的JDBC API可以完成以下主要任務(wù) 首先建立和數(shù)據(jù)源的連接 然后向其傳送查詢和修改等SQL命令 最后處理數(shù)據(jù)源返回的SQL執(zhí)行的結(jié)果10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC API的任務(wù)通過JDBC訪問數(shù)據(jù)庫第38頁/共60頁控制執(zhí)行查詢語句得到的結(jié)果集ResultSet代表一個特定的容器,容納并執(zhí)行一條SQL語句Statement代表對特定數(shù)據(jù)庫的連接Connection在JDBC 2.0 API中被推薦使用代替DriverManag

29、er實現(xiàn)和數(shù)據(jù)庫的連接DataSource處理驅(qū)動的調(diào)入并且對產(chǎn)生新的數(shù)據(jù)庫連接提供支持DriverManager解釋名稱10.2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC API中重要的接口和類通過JDBC訪問數(shù)據(jù)庫第39頁/共60頁 一個基本的JDBC程序開發(fā)包含如下步驟 設(shè)置環(huán)境,引入相應(yīng)的JDBC類 選擇合適的JDBC驅(qū)動程序并加載 分配一個Connection對象 分配一個Statement對象 用該Statement對象進(jìn)行查詢等操作 從返回的ResultSet對象中獲取相應(yīng)的數(shù)據(jù) 關(guān)閉Connection10. 2 通過JDBC訪問數(shù)據(jù)庫(續(xù)) JDBC程序開發(fā)步驟通過JDBC訪問

30、數(shù)據(jù)庫第40頁/共60頁10.2.1 設(shè)置環(huán)境 在本機(jī)上安裝有關(guān)數(shù)據(jù)庫軟件 下載相應(yīng)數(shù)據(jù)庫驅(qū)動程序并安裝 在Java程序中引入相應(yīng)的類和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動程序的包import java.sql.*;import sun.jdbc.odbc.JdbcOdbcDriver;通過JDBC訪問數(shù)據(jù)庫第41頁/共60頁 通過JDBC-ODBC橋訪問數(shù)據(jù)庫 安裝 Java 和 JDBC API 安裝JDK的同時就自動安裝了 安裝數(shù)據(jù)庫驅(qū)動程序 安裝JDK的同時就自動安裝了安裝JDBC-ODBC橋驅(qū)動程序 安裝 DBM

31、S 建立一個數(shù)據(jù)庫,并注冊數(shù)據(jù)源10.2.1 設(shè)置環(huán)境(續(xù)) 通過JDBC-ODBC橋訪問數(shù)據(jù)庫通過JDBC訪問數(shù)據(jù)庫第42頁/共60頁 1確定數(shù)據(jù)源名稱和說明。依次進(jìn)入本機(jī)的控制面板管理工具數(shù)據(jù)源(ODBC),彈出“ODBC數(shù)據(jù)源管理器”對話框,單擊“系統(tǒng)DSN”選項卡,選擇”Add”按鈕10.2.1 設(shè)置環(huán)境(續(xù))注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第43頁/共60頁 2. 單擊“添加”按鈕后彈出“創(chuàng)建數(shù)據(jù)源”對話框,選擇“Microsoft AccessDriver”選項。單擊“完成”按鈕后,彈出“ODBC Microsoft Access安裝”對話框,在“數(shù)據(jù)源名”輸入框中填寫“PIMS”

32、;在“說明”輸入中填寫“員工信息管理系統(tǒng)”;單擊選擇按鈕,彈出“選擇數(shù)據(jù)庫”對話框,在目錄中選定剛剛建好的數(shù)據(jù)庫文件“PMS.mdb”10.2.1 設(shè)置環(huán)境(續(xù))注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第44頁/共60頁 3. 單擊“高級”按鈕,彈出“設(shè)置高級選項”對話框,在“登錄名稱”文本編輯框中設(shè)定登陸名稱為“Test”,在“密碼”文本編輯框中設(shè)定密碼為“1234”。依次確定返回到“ODBC 數(shù)據(jù)源管理器”對話框,這時可以發(fā)現(xiàn)“系統(tǒng)數(shù)據(jù)源”選項中增添了一個新確定的數(shù)據(jù)源“PIMS”,單擊“ODBC Microsoft Access”對話框的“確定”按鈕,就完成了數(shù)據(jù)源的注冊10.2.1 設(shè)置環(huán)境(

33、續(xù))注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第45頁/共60頁10.2.2 建立連接 裝載驅(qū)動器 接下來要建立和DBMS的連接。包括兩個步驟 裝載驅(qū)動器,用Class.forName方法顯式裝載驅(qū)動程序,如:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); 以完整的Java類名字符串為參數(shù),裝載此類,并返回一個Class對象描述此類 執(zhí)行上述代碼時將自動創(chuàng)建一個驅(qū)動器類的實例,并自動調(diào)用驅(qū)動器管理器DriverManager類中的RegisterDriver方法來注冊它 這里“sun.jdbc.odbc.JdbcOdbcDriver”是驅(qū)動器類的名字,可以從驅(qū)動

34、程序的說明文檔中得到 需要注意的是,如果驅(qū)動器類有可能不存在,使用此方法就可能會拋出ClassNotFoundException異常,因此需要捕獲這個異常:try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch(ClassNotFoundException e) System.out.println(e.getMessage); 通過JDBC訪問數(shù)據(jù)庫第46頁/共60頁10.2.2 建立連接(續(xù)) 建立連接 建立與數(shù)據(jù)庫的連接,調(diào)用DriverManager.getConnection()方法。例如,我們要連接上一節(jié)創(chuàng)建的Access數(shù)據(jù)庫P

35、IMS,語句如下:Connection con = DriverManager.getConnection(jdbc:odbc:PIMS, test,1234); 將返回與指定數(shù)據(jù)庫建立的連接 該方法有三個字符串參數(shù) 第一個是JDBC URL,格式為 jdbc:子協(xié)議:子名稱 Jdbc表示協(xié)議,JDBC URL 中的協(xié)議總是 jdbc; 子協(xié)議是驅(qū)動器名稱; 子名稱是數(shù)據(jù)庫的名稱,如果是位于遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫,則還應(yīng)該包括網(wǎng)絡(luò)地址,/主機(jī)名:端口/數(shù)據(jù)庫名 第二個是訪問數(shù)據(jù)庫所需的用戶名 第三個是用戶密碼 Connection是一個接口,表示與指定數(shù)據(jù)庫的連接 DriverManager類位

36、于JDBC的管理層,作用于用戶和驅(qū)動程序之間。它負(fù)責(zé)跟蹤在一個系統(tǒng)中所有可用的JDBC驅(qū)動程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連接通過JDBC訪問數(shù)據(jù)庫第47頁/共60頁10.2.3 對數(shù)據(jù)庫進(jìn)行操作 建立好到數(shù)據(jù)庫的連接后,就可以進(jìn)行對數(shù)據(jù)庫的操作了,一般包括如下三個步驟 使用Connection對象創(chuàng)建Statement對象 使用Statement對象執(zhí)行SQL命令 從上一步驟返回的ResultSet對象中提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第48頁/共60頁 Connection接口有3個方法可用來創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的對象 createStatement 創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語

37、句的Statement對象,用于簡單的SQL語句 Statement stmt = con.createStatement(); prepareStatement 創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的PreparedStatement對象,用于帶有一個或多個參數(shù)的SQL語句。在SQL語句執(zhí)行前,這些參數(shù)將被賦值 prepareCall 創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的CallableStatement對象,用于調(diào)用數(shù)據(jù)庫中的存儲過程通過JDBC訪問數(shù)據(jù)庫10.2.3 對數(shù)據(jù)庫進(jìn)行操作(續(xù)) 創(chuàng)建Statement對象第49頁/共60頁 Statement 接口提供了三種執(zhí)行 SQL 語句的方法,使用哪一個

38、方法由 SQL 語句所產(chǎn)生的內(nèi)容決定 executeQuery 用于產(chǎn)生單個結(jié)果集的語句,例如 SELECT 語句 ResultSet rs = stmt.executeQuery(Select * From Person); executeUpdate 用于執(zhí)行 INSERT、UPDATE 或 DELETE 語句,以及 CREATE TABLE stmt.executeUpdate(DELETE FROM Person WHERE Name=李四); 返回值是一個整數(shù),表示受影響的行數(shù)(即更新計數(shù)),比如修改了多少行、刪除了多少行等。對于 CREATE TABLE 等語句,因不涉及到行的操作

39、,所以executeUpdate的返回值總為零 Execute 用于執(zhí)行返回多個結(jié)果集(ResultSet 對象)、多個更新計數(shù)或二者組合的語句。例如執(zhí)行某個已存儲過程或動態(tài)執(zhí)行SQL,這時有可能出現(xiàn)多個結(jié)果的情況10.2.3 對數(shù)據(jù)庫進(jìn)行操作(續(xù)) 使用Statement對象執(zhí)行語句通過JDBC訪問數(shù)據(jù)庫第50頁/共60頁 查詢結(jié)果作為結(jié)果集(ResultSet)對象返回后,我們可以從ResultSet對象中提取結(jié)果 使用next方法 ResultSet對象中含有檢索出來的行,其中有一個指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前 方法next的功能是將指示器下移一行,所以第

40、一次調(diào)用next方法時便將指示器指向第一行,以后每一次對next的成功調(diào)用都會將指示器移向下一行10.2.3 對數(shù)據(jù)庫進(jìn)行操作(續(xù)) 提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第51頁/共60頁 使用getXXX方法 使用相應(yīng)類型的getXXX方法可以從當(dāng)前行指定列中提取不同類型的數(shù)據(jù)。例如,提取VARCHAR類型數(shù)據(jù)時就要用getString方法,而提取FLOAT類型數(shù)據(jù)的方法是getFloat 允許使用列名或列序號作為getXXX方法的參數(shù) String s = rs.getString(Name); 提取當(dāng)前行Name列中的數(shù)據(jù),并把其從SQL的VARCHAR類型轉(zhuǎn)換成Java的String類型

41、,然后賦值給對象s String s = rs.getString(2);/提取當(dāng)前行的第2列數(shù)據(jù) 這里的列序號指的是結(jié)果集中的列序號,而不是原表中的列序號10.2.3 對數(shù)據(jù)庫進(jìn)行操作(續(xù)) 提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第52頁/共60頁 通過JDBC訪問PIMS數(shù)據(jù)庫,進(jìn)行查詢、添加操作 import java.sql.*;public class ex10_1 public static void main(String args) throws Exception String DBDriver=sun.jdbc.odbc.JdbcOdbcDriver; String conne

42、ctionStr=jdbc:odbc:PIMS; Connection con = null; Statement stmt = null; ResultSet rs = null; Class.forName(DBDriver); /加載驅(qū)動器 con=DriverManager.getConnection(connectionStr,Test,1234); /連接數(shù)據(jù)庫 stmt=con.createStatement(); /創(chuàng)建Statement對象 rs=stmt.executeQuery(Select * From Person); /查詢表 while(rs.next() /顯示

43、所有記錄的ID和姓名 System.out.print(rs.getInt(ID)+ ); System.out.println(rs.getString(Name)+ ); ;10.2.3 對數(shù)據(jù)庫進(jìn)行操作(續(xù)) 例10_1通過JDBC訪問數(shù)據(jù)庫第53頁/共60頁 stmt.executeUpdate(INSERT INTO Person VALUES(9,林時,3,accountant,2000,4); /添加一條記錄 System.out.println(添加數(shù)據(jù)后的信息為); rs=stmt.executeQuery(Select * From Person); /查詢表格 while(rs.next() /顯示 System.out.print(rs.getInt(ID)+ ); System.out.println(rs.getString(Name)+ ); ; stmt.executeUpdate(D

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論