第12章JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第1頁(yè)
第12章JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第2頁(yè)
第12章JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第3頁(yè)
第12章JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第4頁(yè)
第12章JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第12章章 JDBC與數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)與數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)本章主要內(nèi)容: SQL語(yǔ)言簡(jiǎn)介 JDBC基本概念 JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)方法 綜合案例分析12.1 SQL語(yǔ)言12.1.1 SQL語(yǔ)言簡(jiǎn)介語(yǔ)言簡(jiǎn)介SQL(Structured Query Language)結(jié)構(gòu)化查詢(xún)語(yǔ)言,是一種數(shù)據(jù)庫(kù)查詢(xún)和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢(xún)、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。SQL是用于訪(fǎng)問(wèn)和處理數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)的計(jì)算機(jī)語(yǔ)言。它具有極大的靈活性和強(qiáng)大的功能,其他語(yǔ)言中需要一大段程序?qū)崿F(xiàn)的功能可能只需要一個(gè)簡(jiǎn)單的SQL語(yǔ)句就可以實(shí)現(xiàn)。SQL語(yǔ)言結(jié)構(gòu)簡(jiǎn)潔,功能強(qiáng)大,簡(jiǎn)單易學(xué),自從IBM公司1981年推出以來(lái),就得到了廣泛的應(yīng)用,目前大

2、部分的數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQL語(yǔ)言12.1 SQL語(yǔ)言12.1.2 SQL的基本用法的基本用法1. SQL中的數(shù)據(jù)類(lèi)型中的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型用來(lái)設(shè)定數(shù)據(jù)庫(kù)表中某一個(gè)具體列中數(shù)據(jù)的類(lèi)型。例如,在“姓名”列中采用文本類(lèi)型,而不能使用數(shù)字類(lèi)型。不同的數(shù)據(jù)庫(kù)支持的數(shù)據(jù)類(lèi)型是有區(qū)別的。下面列舉部分Microsoft Access支持的數(shù)據(jù)類(lèi)型:(1)TEXT(size):文本類(lèi)型,固定長(zhǎng)度字符串,其中括號(hào)中的size用來(lái)設(shè)定字符串的最大長(zhǎng)度。(2)INTEGER:數(shù)字類(lèi)型,長(zhǎng)整型數(shù)。(3)FLOAT:數(shù)字類(lèi)型,雙精度浮點(diǎn)數(shù)。(4)DATETIME:日期時(shí)間類(lèi)型,介于 100 到 9999 年的日期或時(shí)間

3、數(shù)值。(5)MONEY:貨幣類(lèi)型,有符號(hào)整數(shù)。12.1 SQL語(yǔ)言2.創(chuàng)建表格創(chuàng)建表格創(chuàng)建表格的SQL語(yǔ)句為CREATE TABLE命令,該命令的使用格式如下:CREATE TABLE tablename (column1 type, column2 type, )例如:CREATE TABLE student(name TEXT(15),age INTEGER,address TEXT(30),city TEXT(20)簡(jiǎn)單來(lái)說(shuō),創(chuàng)建新表格時(shí),在關(guān)鍵詞CREATE TABLE后面加入所要建立的表格的名稱(chēng),然后在括號(hào)內(nèi)順次設(shè)定各列的名稱(chēng),數(shù)據(jù)類(lèi)型,以及可選的限制條件等。12.1 SQL語(yǔ)言3.

4、數(shù)據(jù)查詢(xún)數(shù)據(jù)查詢(xún)?cè)诒姸嗟腟QL命令中,SELECT語(yǔ)句應(yīng)該算是使用最頻繁的。SELECT語(yǔ)句主要被用來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)并返回符合用戶(hù)查詢(xún)標(biāo)準(zhǔn)的結(jié)果數(shù)據(jù)。SELECT語(yǔ)句的語(yǔ)法格式如下:SELECT column1 , column2, etc FROM tablename WHERE conditionSELECT語(yǔ)句中位于SELECT關(guān)鍵詞之后的列名用來(lái)決定哪些列將作為查詢(xún)結(jié)果返回。用戶(hù)可以按照自己的需要選擇任意列,還可以使用通配符“*”來(lái)設(shè)定返回表格中的所有列。SELECT語(yǔ)句中位于FROM關(guān)鍵詞之后的表格名稱(chēng)用來(lái)決定將要進(jìn)行查詢(xún)操作的目標(biāo)表格。SELECT語(yǔ)句中的WHERE可選從句用來(lái)規(guī)

5、定哪些數(shù)據(jù)值或哪些行將被作為查詢(xún)結(jié)果返回或顯示。12.1 SQL語(yǔ)言在WHERE條件從句中可以使用關(guān)系運(yùn)算符來(lái)設(shè)定查詢(xún)標(biāo)準(zhǔn),如:=( 等于)、(大于)、=(大于等于)、= (小于等于)、(不等于)等。例如,通過(guò)如下語(yǔ)句:SELECT * FROM student WHERE name = 張三查詢(xún)所有名稱(chēng)為張三的記錄。4.向表格中添加、更新、刪除記錄向表格中添加、更新、刪除記錄(1)添加新記錄SQL語(yǔ)言使用INSERT語(yǔ)句向數(shù)據(jù)庫(kù)表格中插入或添加新的數(shù)據(jù)行。INSERT語(yǔ)句的使用格式如下:12.1 SQL語(yǔ)言INSERT INTO tablename(first_column,.,last_c

6、olumn)VALUES (first_value,.,last_value)例如:INSERT INTO student(name, age, address, city)VALUES (張三, 45, 迎澤西大街79號(hào), 太原市)簡(jiǎn)單來(lái)說(shuō),當(dāng)向數(shù)據(jù)庫(kù)表格中添加新記錄時(shí),在關(guān)鍵詞INSERT INTO后面輸入所要添加的表格名稱(chēng),然后在括號(hào)中列出將要添加新值的列的名稱(chēng)。最后,在關(guān)鍵詞VALUES的后面按照前面輸入的列的順序?qū)?yīng)的輸入所有要添加的記錄值。12.1 SQL語(yǔ)言(2)更新記錄SQL語(yǔ)言使用UPDATE語(yǔ)句更新或修改滿(mǎn)足規(guī)定條件的現(xiàn)有記錄。UPDATE語(yǔ)句的格式為:UPDATE tab

7、lename SET columnname1 = newvalue1 ,columnname2 = newvalue2,.WHERE condition例如:UPDATE student SET age = age+1 WHERE name= 張三AND city= 太原市使用UPDATE語(yǔ)句時(shí),關(guān)鍵一點(diǎn)就是要設(shè)定好用于進(jìn)行判斷的WHERE條件從句。12.1 SQL語(yǔ)言(3)刪除記錄SQL語(yǔ)言使用DELETE語(yǔ)句刪除數(shù)據(jù)庫(kù)表格中的行或記錄。DELETE語(yǔ)句的格式為:DELETE FROM tablename WHERE condition例如:DELETE FROM student WHERE

8、 name = 張三簡(jiǎn)單來(lái)說(shuō),當(dāng)需要?jiǎng)h除某一行或某個(gè)記錄時(shí),在DELETE FROM關(guān)鍵詞之后輸入表格名稱(chēng),然后在WHERE從句中設(shè)定刪除記錄的判斷條件。注意,如果用戶(hù)在使用DELETE語(yǔ)句時(shí)不設(shè)定WHERE從句,則表格中的所有記錄將全部被刪除。12.1 SQL語(yǔ)言5.刪除數(shù)據(jù)庫(kù)表格刪除數(shù)據(jù)庫(kù)表格在SQL語(yǔ)言中使用DROP TABLE命令刪除某個(gè)表格以及該表格中的所有記錄。DROP TABLE命令的使用格式為:DROP TABLE tablename例如:DROP TABLE student如果用戶(hù)希望將某個(gè)數(shù)據(jù)庫(kù)表格完全刪除,只需要在DROP TABLE命令后輸入希望刪除的表格名稱(chēng)即可。12

9、.1 SQL語(yǔ)言12.1.3 創(chuàng)建創(chuàng)建ODBC數(shù)據(jù)源數(shù)據(jù)源ODBC(Open DataBase Conectivity)是微軟公司制定的標(biāo)準(zhǔn)編程接口,只要有相應(yīng)的ODBC驅(qū)動(dòng)程序,就可以通過(guò)ODBC連接操作各種不同的數(shù)據(jù)庫(kù)。所謂ODBC數(shù)據(jù)源就是命名的一組信息,包括需要連接的數(shù)據(jù)庫(kù)所在位置、對(duì)應(yīng)的ODBC驅(qū)動(dòng)程序以及訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)所需的其他相關(guān)信息,用戶(hù)可以通過(guò)數(shù)據(jù)源的名稱(chēng)(DSNs,Data Source Names)來(lái)指定所需的ODBC連接。ODBC數(shù)據(jù)源通??梢酝ㄟ^(guò)控制面板中的ODBC Data Source來(lái)配置。下面以Access2007數(shù)據(jù)庫(kù)為例說(shuō)明如何建立ODBC數(shù)據(jù)源。建立ODBC

10、數(shù)據(jù)源之前,首先通過(guò)Access建立名為university.accdb的數(shù)據(jù)庫(kù)。12.1 SQL語(yǔ)言在Windows操作系統(tǒng)下,建立ODBC數(shù)據(jù)源的過(guò)程為:(1)打開(kāi)控制面板。(2)打開(kāi)管理工具。(4)選擇用戶(hù)DNS或系統(tǒng)DNS,單擊添加按鈕(如圖12-1所示)。圖12-1選擇用戶(hù)DNS或系統(tǒng)DNS12.1 SQL語(yǔ)言(5)選擇驅(qū)動(dòng)程序Microsoft Access Driver(*.mdb, *.accdb)(如圖12-2所示)。圖12-2 選擇驅(qū)動(dòng)程序12.1 SQL語(yǔ)言(6)輸入數(shù)據(jù)源名,本例為student(如圖12-3所示)。 圖12-3 輸入數(shù)據(jù)源名(7)單擊選擇按鈕,選擇數(shù)據(jù)

11、庫(kù)(如圖12-4所示),選擇前面建立的university.accdb。圖12-4 選擇數(shù)據(jù)庫(kù)12.1 SQL語(yǔ)言這樣ODBC數(shù)據(jù)源student就建立好了(圖12-5所示)。通過(guò)該ODBC數(shù)據(jù)源就可以連接到university.accdb數(shù)據(jù)庫(kù),再使用SQL語(yǔ)句就能夠?qū)υ摂?shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn)。圖12-4 選擇數(shù)據(jù)庫(kù)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)12.2.1 JDBC簡(jiǎn)介簡(jiǎn)介JDBC(Java Data Base Connectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成。JDBC為開(kāi)發(fā)人員提供了

12、一個(gè)標(biāo)準(zhǔn)的API,使開(kāi)發(fā)人員能夠方便編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。JDBC和微軟公司提出的ODBC(Open DataBase Connectivity,開(kāi)放數(shù)據(jù)庫(kù)連接)功能是類(lèi)似的,它們都可以讓程序員編寫(xiě)?yīng)毩⒂跀?shù)據(jù)庫(kù)的代碼。JDBC擴(kuò)展了Java的功能。隨著越來(lái)越多的程序員開(kāi)始使用Java編程語(yǔ)言,對(duì)從Java中便捷地訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的要求也在日益增加。程序員使用Java語(yǔ)言編寫(xiě)應(yīng)用程序,通過(guò)JDBC API訪(fǎng)問(wèn)相關(guān)數(shù)據(jù)庫(kù),實(shí)現(xiàn)對(duì)信息的各類(lèi)操作,其方式如圖12-6所示。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)JDBC API 對(duì)數(shù)據(jù)庫(kù)所做的操作大體包括:連接數(shù)據(jù)庫(kù);建立SQL描述;在數(shù)據(jù)庫(kù)中執(zhí)行SQL查詢(xún);查看和修改結(jié)

13、果記錄。本質(zhì)上JDBC提供了訪(fǎng)問(wèn)底層數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)接口,從而使得Java可以在很多類(lèi)型的應(yīng)用中訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。這些應(yīng)用通常有Java應(yīng)用程序(Java Applications)、Java小應(yīng)用程序(Java Applets)、Java Servlets、JSP(Java ServerPages)和EJBs(Enterprise JavaBeans)。圖12-6 Java應(yīng)用程序通過(guò)JDBC API訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)12.2.2 JDBC體系結(jié)構(gòu)體系結(jié)構(gòu) JDBC的體系結(jié)構(gòu)如圖12-7所示。該體系結(jié)構(gòu)分為五層,應(yīng)用程序、JDBC API、JDBC驅(qū)動(dòng)管理器、JDBC驅(qū)動(dòng)程序和數(shù)據(jù)

14、庫(kù)。 圖12-7 JDBC體系結(jié)構(gòu)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)Java應(yīng)用程序調(diào)用JDBC API,JDBC通過(guò)JDBC驅(qū)動(dòng)程序管理器加載JDBC驅(qū)動(dòng)程序,由驅(qū)動(dòng)程序和具體的數(shù)據(jù)庫(kù)打交道。JDBC驅(qū)動(dòng)程序管理器 (Driver Manager)為應(yīng)用程序裝載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。驅(qū)動(dòng)程序與具體的數(shù)據(jù)庫(kù)相關(guān),用于向數(shù)據(jù)庫(kù)提交SQL請(qǐng)求??梢酝ㄟ^(guò)替換驅(qū)動(dòng)程序來(lái)訪(fǎng)問(wèn)另外一種數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)代碼不需要改變。有一類(lèi)特殊的JDBC驅(qū)動(dòng)程序叫做JDBC-ODBC橋,這類(lèi)驅(qū)動(dòng)程序使得Java語(yǔ)言可以訪(fǎng)問(wèn)任何支持ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù),擴(kuò)大了Java的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)類(lèi)型。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)12.2.3 JD

15、BC驅(qū)動(dòng)程序驅(qū)動(dòng)程序目前比較常見(jiàn)的JDBC驅(qū)動(dòng)程序可分為以下四個(gè)種類(lèi):(1)JDBC-ODBC橋把標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)換成相應(yīng)的ODBC調(diào)用,并通過(guò)ODBC庫(kù)把它們發(fā)送給ODBC數(shù)據(jù)源。這種方式訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),需要經(jīng)過(guò)多層調(diào)用,效率比較低。適用于快速的原型系統(tǒng),沒(méi)有提供JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù)。其驅(qū)動(dòng)結(jié)構(gòu)如圖12-8所示。 圖12-8 JDBC-ODBC橋驅(qū)動(dòng)結(jié)構(gòu)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(2)本地API 利用本地API訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí),JDBC驅(qū)動(dòng)程序?qū)⒄{(diào)用請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)廠(chǎng)商提供的本地API調(diào)用,數(shù)據(jù)庫(kù)處理完請(qǐng)求將結(jié)果通過(guò)這些API返回,進(jìn)而返回給JDBC驅(qū)動(dòng)程序,JDBC驅(qū)動(dòng)程序?qū)⒔Y(jié)果轉(zhuǎn)化為JDB

16、C標(biāo)準(zhǔn)形式,再返回客戶(hù)程序。這種類(lèi)型減少了ODBC的調(diào)用環(huán)節(jié),提高了數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的效率,并且能夠充分利用廠(chǎng)商提供的本地API的功能。其驅(qū)動(dòng)結(jié)構(gòu)如圖12-9所示。圖12-9 本地API驅(qū)動(dòng)結(jié)構(gòu)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(3)網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序這種驅(qū)動(dòng)利用應(yīng)用服務(wù)器作為中間件來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。應(yīng)用服務(wù)器作為一個(gè)到多個(gè)數(shù)據(jù)庫(kù)的網(wǎng)關(guān),客戶(hù)端通過(guò)它可以連接到不同的數(shù)據(jù)服務(wù)器。Java客戶(hù)程序通過(guò)JDBC驅(qū)動(dòng)程序?qū)DBC調(diào)用發(fā)送給應(yīng)用服務(wù)器,應(yīng)用服務(wù)器使用本地驅(qū)動(dòng)程序訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),從而完成請(qǐng)求。其驅(qū)動(dòng)結(jié)構(gòu)如圖12-10所示。 圖12-10 網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序驅(qū)動(dòng)結(jié)構(gòu)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(4)本

17、地協(xié)議純Java驅(qū)動(dòng)程序客戶(hù)程序通過(guò)網(wǎng)絡(luò)直接與數(shù)據(jù)庫(kù)進(jìn)行通信,數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)效率最高。其驅(qū)動(dòng)結(jié)構(gòu)如圖12-11所示。 圖12-11 本地協(xié)議純Java驅(qū)動(dòng)程序驅(qū)動(dòng)結(jié)構(gòu)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)12.2.4 JDBC基本組件基本組件在使用Java語(yǔ)言面向?qū)ο蠓椒ň幊淘L(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí),會(huì)用到JDBC提供的各類(lèi)組件。常用的組件有DriverManager、Connection、Statement和ResultSet,如圖12-12所示。 圖12-12 JDBC基本組件12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)對(duì)于這些組件,JDBC API中的相關(guān)描述如表12-1所示。 組件類(lèi)組件類(lèi) 作用作用java.sql.Drive

18、rManager處理驅(qū)動(dòng)程序的加載和建立新數(shù)據(jù)庫(kù)連接java.sql.Connection處理與特定數(shù)據(jù)庫(kù)的連接java.sql.Statement在指定連接中處理SQL語(yǔ)句java.sql.ResultSet處理數(shù)據(jù)庫(kù)操作結(jié)果集 表12-1 組件類(lèi)和作用12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)1.DriverManager類(lèi)類(lèi) DriverManager是Java.sql包中用于數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序管理的類(lèi),作用于用戶(hù)和驅(qū)動(dòng)程序之間。它跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。對(duì)于簡(jiǎn)單的應(yīng)用程序,程序開(kāi)發(fā)人員需要在此類(lèi)中直接使用的唯一方法是DriverManager.getConnection

19、( )。該方法是用來(lái)建立與數(shù)據(jù)庫(kù)的連接的。2.Connection Connection是用來(lái)表示數(shù)據(jù)庫(kù)連接的對(duì)象,對(duì)數(shù)據(jù)庫(kù)的一切操作都是在這個(gè)連接的基礎(chǔ)上進(jìn)行的。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)3.StatementStatement用于在已經(jīng)建立的連接的基礎(chǔ)上向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的對(duì)象。它只是一個(gè)接口的定義,其中包括了執(zhí)行SQL語(yǔ)句和獲取返回結(jié)果的方法。 實(shí)際上有3種 Statement 對(duì)象:Statement、PreparedStatement(繼承自Statement )和 CallableStatement(繼承自PreparedStatement)。它們都作為在給定連接上執(zhí)行 SQ

20、L 語(yǔ)句的容器,每個(gè)都專(zhuān)用于發(fā)送特定類(lèi)型的SQL 語(yǔ)句。Statement 對(duì)象用于執(zhí)行不帶參數(shù)的簡(jiǎn)單 SQL 語(yǔ)句。PreparedStatement 對(duì)象用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語(yǔ)句。CallableStatement 對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)已存儲(chǔ)過(guò)程的調(diào)用。4. ResultSetResultSet用來(lái)暫時(shí)存放數(shù)據(jù)庫(kù)查詢(xún)操作獲得的結(jié)果。它包含了符合 SQL 語(yǔ)句中條件的所有行,并且它提供了一套 get( )方法對(duì)這些行中的數(shù)據(jù)進(jìn)行訪(fǎng)問(wèn)。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)12.2.5 JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)1.數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的一般步驟數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的一般步驟JDBC的主要優(yōu)點(diǎn)是

21、為所有的數(shù)據(jù)庫(kù)管理系統(tǒng)提供標(biāo)準(zhǔn)的調(diào)用接口。概括起來(lái),使用JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)大致需要五個(gè)基本步驟(如圖12-13所示)。圖12-13 JDBC操作的基本步驟12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)各步驟簡(jiǎn)單描述如下:(1)加載驅(qū)動(dòng)程序。為數(shù)據(jù)庫(kù)管理系統(tǒng)加載一個(gè)JDBC驅(qū)動(dòng)程序。通過(guò) Class.forName()方法調(diào)用來(lái)完成這一操作,需要給出驅(qū)動(dòng)類(lèi)的名稱(chēng)。(2)打開(kāi)數(shù)據(jù)庫(kù)連接。使用驅(qū)動(dòng)程序打開(kāi)特定數(shù)據(jù)庫(kù)的連接。(3)獲取Statement對(duì)象。(4)執(zhí)行SQL語(yǔ)句。通過(guò)Statement提出SQL請(qǐng)求。(5)處理結(jié)果集。如果返回結(jié)果集則對(duì)結(jié)果集進(jìn)行處理。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)2.數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)簡(jiǎn)單代碼數(shù)

22、據(jù)庫(kù)訪(fǎng)問(wèn)簡(jiǎn)單代碼根據(jù)以上步驟,給出一個(gè)簡(jiǎn)單的Java代碼片段如下:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);/加載驅(qū)動(dòng)程序Connection con = DriverManager.getConnection(jdbc:odbc:student,user,password);/打開(kāi)數(shù)據(jù)庫(kù)連接Statement stmt = con.createStatement();/獲取Statement對(duì)象ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM Table1”);/執(zhí)行SQL語(yǔ)句while

23、(rs.next( ) /處理結(jié)果集 int x = rs.getInt(a); String s = rs.getString(b); float f = rs.getFloat(c);上述代碼對(duì)基于JDBC的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)做了經(jīng)典的總結(jié),下面對(duì)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)過(guò)程做詳細(xì)講述。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)3.數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)過(guò)程詳述數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)過(guò)程詳述(1)加載驅(qū)動(dòng)程序)加載驅(qū)動(dòng)程序通過(guò)類(lèi)裝載器來(lái)加載相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,格式為:Class.forName(driverName)【例12-1】加載驅(qū)動(dòng)程序import java.sql.*;public class EX12_1_StudentSQL publ

24、ic static void main(String args) Connection con=null; Statement stmt=null; String strTemp = ;try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(2)建立連接)建立連接 通過(guò)DriverManager: Connection con=DriverManager.getConnection(url,user,password); (3)獲取)獲取statementsta

25、tement用來(lái)發(fā)送要執(zhí)行的sql語(yǔ)句。有三種Statement對(duì)象。Statement執(zhí)行不帶參數(shù)的sql語(yǔ)句。創(chuàng)建方法:connection.createStatement() PreParedStatement執(zhí)行帶參數(shù)或不帶參數(shù)的預(yù)編譯的SQL語(yǔ)句,下次執(zhí)行的時(shí)候就不要編譯和優(yōu)化了。 創(chuàng)建方法:connection.prepareStatement() CallableStatement調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程或函數(shù)等。創(chuàng)建方法:connection.parpareCall() 12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)【例12-2】建立連接并獲取Statementimport java.sql.*;

26、public class EX12_2_StudentSQL public static void main(String args) Connection con=null; Statement stmt=null; String strTemp = ; try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e)try con=DriverManager.getConnection(jdbc:odbc:student,);stmt=con.createStatement();catch(SQ

27、LException ee)12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(4)執(zhí)行sql語(yǔ)句 statement.executeQuery(); 返回類(lèi)型ResultSet。statement.executeUpdate();返回類(lèi)型int,執(zhí)行此sql語(yǔ)句所影響的記錄數(shù)。statement.execute();返回類(lèi)型boolean,代表執(zhí)行此語(yǔ)句是否有resultset返回,有就是ture。 【例12-3】執(zhí)行SQL語(yǔ)句import java.sql.*;public class EX12_3_StudentSQL public static void main(String args) Connecti

28、on con=null; Statement stmt=null; String strTemp = ;12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e)try con=DriverManager.getConnection(jdbc:odbc:student,); stmt=con.createStatement();catch(SQLException ee) strTemp = CREATE TABLE student(id TEXT(20) PRIM

29、ARY KEY,name TEXT(20),gender TEXT(2),address TEXT(50),phone TEXT(20),major TEXT(30);try stmt.executeUpdate(strTemp); catch (SQLException e) e.printStackTrace();12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(5)處理結(jié)果集 只有SELECT語(yǔ)句才會(huì)有結(jié)果集返回。代碼片斷如下:while(rs.next()/rs是一個(gè)游標(biāo),初始時(shí)在第一條記錄的上面一行。/每next一次,向下一行。rs.getString(1);rs.getInt(2); 可以使用位置標(biāo)識(shí)

30、,也可以使用列名來(lái)標(biāo)識(shí)(當(dāng)結(jié)果集字段比較多的時(shí)候用列名標(biāo)識(shí)法,可以增強(qiáng)程序的可讀性)。 12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)【例12-4】處理結(jié)果集import java.sql.*;/* * author gaobaolu * version 2012 v1.0 * JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)測(cè)試程序。 */public class EX12_4_StudentSQL public static void main(String args) Connection con=null; Statement stmt=null; ResultSet rs = null; String strTemp = ;/加載

31、驅(qū)動(dòng)程序 12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e)/建立數(shù)據(jù)庫(kù)連接trycon=DriverManager.getConnection(jdbc:odbc:student,); stmt=con.createStatement();catch(SQLException ee)/建立表strTemp = CREATE TABLE student(id TEXT(20) PRIMARY KEY,name TEXT(20),gender TEXT(2),a

32、ddress TEXT(50),phone TEXT(20),major TEXT(30);try stmt.executeUpdate(strTemp); catch (SQLException e) e.printStackTrace(); /添加數(shù)據(jù) 12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)strTemp = INSERT INTO student VALUES(2012001,張三,男,太原市迎澤西大街79號(hào)軟件工程);try stmt.executeUpdate(strTemp); catch (SQLException e) e.printStackTrace();/

33、獲取并瀏覽數(shù)據(jù) strTemp = SELECT * FROM student;try rs = stmt.executeQuery(strTemp);while(rs.next() System.out.println(rs.getString(id);System.out.println(rs.getString(name);System.out.println(rs.getString(gender);System.out.println(rs.getString(address);System.out.println(rs.getString(“phone”);12.2 JDBC數(shù)據(jù)庫(kù)

34、訪(fǎng)問(wèn)System.out.println(rs.getString(major); catch (SQLException e) e.printStackTrace();/釋放資源 try rs.close();stmt.close();con.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace(); 注意,釋放資源 一般寫(xiě)在finally語(yǔ)句塊中。所釋放的資源一般有ResultSet,Statement,Connection。12.2 JDBC數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)運(yùn)行結(jié)果為:2012001

35、張三男太原市迎澤西大街79件工程12.3 綜合應(yīng)用舉例12.3.1數(shù)據(jù)庫(kù)表結(jié)構(gòu)數(shù)據(jù)庫(kù)表結(jié)構(gòu)本節(jié)所使用的數(shù)據(jù)庫(kù)類(lèi)型為Access 2007,數(shù)據(jù)庫(kù)的名稱(chēng)為university,ODBC數(shù)據(jù)源名為student。在university數(shù)據(jù)庫(kù)中建立表student,其結(jié)構(gòu)如表12-2所示。表12-2 student表的結(jié)構(gòu)字段名字段名字段類(lèi)型字段類(lèi)型字段長(zhǎng)度字段長(zhǎng)度 描述描述備注備注id文本20學(xué)號(hào)主鍵name文本20姓名gender文本2性別address文本50地址phone文本20電話(huà)major文本30專(zhuān)業(yè)12.3 綜合應(yīng)用舉例 student表可以使用Access可

36、視化環(huán)境建立,也可以用本章介紹的Java代碼建立。需要調(diào)用的SQL語(yǔ)句為: CREATE TABLE student(id TEXT(20) PRIMARY KEY,name TEXT(20),gender TEXT(2),address TEXT(50),phone TEXT(20),major TEXT(30) 其中PRIMARY KEY表明id字段為主鍵。12.3 綜合應(yīng)用舉例12.3.2 系統(tǒng)功能描述系統(tǒng)功能描述學(xué)生信息管理系統(tǒng)包含信息錄入、信息查詢(xún)、信息修改、信息刪除和系統(tǒng)退出等幾個(gè)功能模塊。系統(tǒng)功能模塊如圖12-14所示。 圖12-14 學(xué)生信息管理系統(tǒng)功能模塊12.3 綜合應(yīng)用舉

37、例12.3.3 實(shí)現(xiàn)代碼和系統(tǒng)運(yùn)行界面實(shí)現(xiàn)代碼和系統(tǒng)運(yùn)行界面【例12-5】學(xué)生信息管理系統(tǒng)主界面學(xué)生信息管理系統(tǒng)主界面如圖12-15所示。相應(yīng)的類(lèi)為EX12_5_StudentManagement,文件名為EX12_5_StudentManagement.java。該程序中在JFrame容器中添加了菜單、菜單項(xiàng)和一個(gè)表明系統(tǒng)名稱(chēng)的標(biāo)簽。 圖12-15 學(xué)生信息管理系統(tǒng)主界面12.3 綜合應(yīng)用舉例import java.sql.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.b

38、order.*;import javax.swing.JOptionPane;public class EX12_5_StudentManagement extends JFrame implements ActionListener JMenuBar bar=null; JMenu menu1,menu2,menu3,menu4,menu5; JMenuItem item1,item2,item3,item4,item5; EX12_6_StudentAdd zengjia; EX12_7_StudentQuery chaxun; EX12_8_StudentUpdate gengxin;

39、EX12_9_StudentDelete shanchu;12.3 綜合應(yīng)用舉例EX12_5_StudentManagement() super(學(xué)生信息管理系統(tǒng)學(xué)生信息管理系統(tǒng)); zengjia=new StudentAdd(); chaxun=new StudentQuery(); gengxin=new StudentUpdate();shanchu=new StudentDelete(); bar=new JMenuBar(); menu1=new JMenu(信息錄入信息錄入); menu2=new JMenu(信息查詢(xún)信息查詢(xún)); menu3=new JMenu(信息更新信息更新

40、); menu4=new JMenu(信息刪除信息刪除); menu5=new JMenu(退出系統(tǒng)退出系統(tǒng)); item1=new JMenuItem(錄入錄入); item2=new JMenuItem(查詢(xún)查詢(xún)); item3=new JMenuItem(更新更新); item4=new JMenuItem(刪除刪除); item5=new JMenuItem(“退出退出”);12.3 綜合應(yīng)用舉例menu1.add(item1); menu2.add(item2); menu3.add(item3); menu4.add(item4); menu5.add(item5); bar.ad

41、d(menu1); bar.add(menu2); bar.add(menu3);bar.add(menu4); bar.add(menu5); setJMenuBar(bar); item1.addActionListener(this); item2.addActionListener(this); item3.addActionListener(this); item4.addActionListener(this); item5.addActionListener(this); JLabel label=new JLabel(學(xué)生信息管理系統(tǒng)學(xué)生信息管理系統(tǒng),JLabel.CENTER

42、); String s= ;12.3 綜合應(yīng)用舉例 Font f=new Font(s,Font.BOLD,22); label.setFont(f); label.setBackground(Color.green); label.setForeground(Color.BLUE); add(label,Center); setVisible(true); setSize(350,300); public void actionPerformed(ActionEvent e) if(e.getSource()=item1) this.getContentPane().removeAll();

43、this.getContentPane().add(zengjia,Center);this.getContentPane().repaint(); this.getContentPane().validate(); 12.3 綜合應(yīng)用舉例if(e.getSource()=item2)this.getContentPane().removeAll();this.getContentPane().add(chaxun,Center);this.getContentPane().repaint(); this.getContentPane().validate(); if(e.getSource(

44、)=item3)this.getContentPane().removeAll();this.getContentPane().add(gengxin,Center);this.getContentPane().repaint(); this.getContentPane().validate(); if(e.getSource()=item4) this.getContentPane().removeAll();this.getContentPane().add(shanchu,Center);12.3 綜合應(yīng)用舉例this.getContentPane().repaint(); this.

45、getContentPane().validate(); if(e.getSource()=item5) System.exit(0); public static void main(String args) EX12_5_StudentManagement stuM=new EX12_5_StudentManagement(); stuM.setVisible(true); stuM.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); 12.3 綜

46、合應(yīng)用舉例圖12-16 學(xué)生信息錄入界面12.3 綜合應(yīng)用舉例【例12-6】學(xué)生信息錄入學(xué)生信息錄入界面如圖12-16所示。相應(yīng)的類(lèi)為EX12_6_StudentAdd,文件名為EX12_6_StudentAdd.java。import java.sql.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.border.*;import javax.swing.JOptionPane;public class EX12_6_StudentAdd extends JPanel im

47、plements ActionListener Connection con; Statement sql; JButton b1,b2; JTextField tf1,tf2,tf3,tf4,tf5,tf6; Box baseBox,bv1,bv2;12.3 綜合應(yīng)用舉例EX12_6_StudentAdd() try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) trycon=DriverManager.getConnection(jdbc:odbc:student,); sql=co

48、n.createStatement(); catch(SQLException ee) setLayout(new BorderLayout(); JPanel p1=new JPanel(); JPanel p2=new JPanel(); tf1=new JTextField(16); tf2=new JTextField(16); tf3=new JTextField(16);12.3 綜合應(yīng)用舉例 tf4=new JTextField(16); tf5=new JTextField(16); tf6=new JTextField(16); b1=new JButton(錄入錄入); b

49、2=new JButton(重置重置); b1.addActionListener(this); b2.addActionListener(this); p1.add(b1); p1.add(b2); bv1=Box.createVerticalBox(); bv1.add(new JLabel(學(xué)號(hào)學(xué)號(hào)); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(姓名姓名); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(性別性別); bv1.add(Box.createVe

50、rticalStrut(8); bv1.add(new JLabel(地址地址);12.3 綜合應(yīng)用舉例 bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(電話(huà)電話(huà)); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(專(zhuān)業(yè)專(zhuān)業(yè)); bv1.add(Box.createVerticalStrut(8); bv2=Box.createVerticalBox(); bv2.add(tf1); bv2.add(Box.createVerticalStrut(8); bv2.add(

51、tf2); bv2.add(Box.createVerticalStrut(8); bv2.add(tf3); bv2.add(Box.createVerticalStrut(8); bv2.add(tf4); bv2.add(Box.createVerticalStrut(8); bv2.add(tf5); bv2.add(Box.createVerticalStrut(8); bv2.add(tf6);12.3 綜合應(yīng)用舉例 bv2.add(Box.createVerticalStrut(8); baseBox=Box.createHorizontalBox(); baseBox.add(

52、bv1); baseBox.add(Box.createHorizontalStrut(10); baseBox.add(bv2); p2.add(baseBox); add(p1,South); add(p2,Center); setSize(350,300); setBackground(Color.pink); public void actionPerformed(ActionEvent e) if(e.getSource()=b1) try insert(); catch(SQLException ee) JOptionPane.showMessageDialog(this,“數(shù)據(jù)已

53、入庫(kù)數(shù)據(jù)已入庫(kù)!”,“提示對(duì)話(huà)框提示對(duì)話(huà)框”,JOptionPane.INFORMATION_MESSAGE); 12.3 綜合應(yīng)用舉例else if(e.getSource()=b2) tf1.setText( ); baseBox.add(Box.createHorizontalStrut(10); baseBox.add(bv2); p2.add(baseBox); add(p1,South); add(p2,Center); setSize(350,300); setBackground(Color.pink); public void actionPerformed(ActionEv

54、ent e) if(e.getSource()=b1) try insert(); catch(SQLException ee) JOptionPane.showMessageDialog(this,數(shù)據(jù)已入庫(kù)數(shù)據(jù)已入庫(kù)!,提示對(duì)話(huà)框提示對(duì)話(huà)框,JOptionPane.INFORMATION_MESSAGE); 12.3 綜合應(yīng)用舉例else if(e.getSource()=b2) tf1.setText( ); tf2.setText( ); tf3.setText( ); tf4.setText( ); tf5.setText( ); tf6.setText( ); setBackgro

55、und(Color.pink); public void actionPerformed(ActionEvent e) if(e.getSource()=b1) try insert(); catch(SQLException ee) JOptionPane.showMessageDialog(this,數(shù)據(jù)已入庫(kù)數(shù)據(jù)已入庫(kù)!,提示對(duì)話(huà)框提示對(duì)話(huà)框,JOptionPane.INFORMATION_MESSAGE); else if(e.getSource()=b2)12.3 綜合應(yīng)用舉例 tf1.setText( ); tf2.setText( ); tf3.setText( ); tf4.s

56、etText( ); tf5.setText( ); tf6.setText( ); 12.3 綜合應(yīng)用舉例圖12-17 學(xué)生信息查詢(xún)界面12.3 綜合應(yīng)用舉例【例12-7】學(xué)生信息查詢(xún)學(xué)生信息查詢(xún)界面如圖12-17所示。相應(yīng)的類(lèi)為EX12_7_StudentQuery,文件名為EX12_7_StudentQuery.java。import java.sql.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.border.*;import javax.swing.JOption

57、Pane;public class EX12_7_StudentQuery extends JPanel implements ActionListener Connection con; Statement sql; JTextField t1,t2,t3,t4,t5,t6; JButton b; Box baseBox,bv1,bv2; int flag=0;12.3 綜合應(yīng)用舉例EX12_7_StudentQuery() try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) try

58、 con=DriverManager.getConnection(jdbc:odbc:student,); sql=con.createStatement(); catch(SQLException ee) setLayout(new BorderLayout(); b=new JButton(查詢(xún)查詢(xún)); b.setBackground(Color.orange); b.addActionListener(this);12.3 綜合應(yīng)用舉例 t1=new JTextField(8); t2=new JTextField(16); t3=new JTextField(16); t4=new J

59、TextField(16); t5=new JTextField(16); t6=new JTextField(16); t2.setEditable(false); t3.setEditable(false); t4.setEditable(false); t5.setEditable(false); t6.setEditable(false); JPanel p1=new JPanel(),p2=new JPanel(); p1.add(new Label(請(qǐng)輸入學(xué)號(hào):請(qǐng)輸入學(xué)號(hào):); p1.add(t1); p1.add(b);12.3 綜合應(yīng)用舉例 bv1=Box.createVerticalBox(); bv1.add(new JLabel(姓名姓名); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(性別性別); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(地址地址); bv1.add(Box.createVerticalStrut(8); bv1.add(new JLabel(電話(huà)電話(huà)); bv1.add(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論