《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第10章_第1頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第10章_第2頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第10章_第3頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第10章_第4頁(yè)
《Java網(wǎng)絡(luò)程序設(shè)計(jì)》課件-第10章_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章數(shù)據(jù)庫(kù)訪問(wèn)

10.1數(shù)據(jù)庫(kù)概述10.2MySQL數(shù)據(jù)庫(kù)10.3JDBC10.4數(shù)據(jù)庫(kù)的維護(hù)10.5數(shù)據(jù)庫(kù)查詢10.6數(shù)據(jù)庫(kù)操作實(shí)例

10.1數(shù)?據(jù)?庫(kù)?概?述

數(shù)據(jù)庫(kù)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù),它產(chǎn)生于50年前。隨著信息技術(shù)和市場(chǎng)的發(fā)展,數(shù)據(jù)管理不再僅僅是存儲(chǔ)和管理數(shù)據(jù),而轉(zhuǎn)變成用戶所需要的各種數(shù)據(jù)管理的方式。數(shù)據(jù)庫(kù)有很多種類型,從最簡(jiǎn)單的存儲(chǔ)有各種數(shù)據(jù)的表格到能夠進(jìn)行海量數(shù)據(jù)存儲(chǔ)的大型數(shù)據(jù)庫(kù)系統(tǒng),在各個(gè)方面都得到了廣泛的應(yīng)用。10.1.1數(shù)據(jù)庫(kù)的功能

數(shù)據(jù)庫(kù)提供了以下主要功能:

●?實(shí)現(xiàn)數(shù)據(jù)共享:數(shù)據(jù)共享包含所有用戶可同時(shí)存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),也包括用戶可以用各種方式通過(guò)接口使用數(shù)據(jù)庫(kù),并提供數(shù)據(jù)共享。

●?減少數(shù)據(jù)的冗余度:與文件系統(tǒng)相比,由于數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)共享,從而避免了用戶各自建立應(yīng)用文件,減少了大量重復(fù)數(shù)據(jù),減少了數(shù)據(jù)冗余,維護(hù)了數(shù)據(jù)的一致性。

●?數(shù)據(jù)的獨(dú)立性:數(shù)據(jù)的獨(dú)立性包括數(shù)據(jù)庫(kù)中數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和應(yīng)用程序相互獨(dú)立,也包括數(shù)據(jù)物理結(jié)構(gòu)的變化不影響數(shù)據(jù)的邏輯結(jié)構(gòu)?!?數(shù)據(jù)實(shí)現(xiàn)集中控制:文件管理方式中,數(shù)據(jù)處于一種分散的狀態(tài),不同的用戶或同一用戶在不同處理中其文件之間毫無(wú)關(guān)系。利用數(shù)據(jù)庫(kù)可對(duì)數(shù)據(jù)進(jìn)行集中控制和管理,并通過(guò)數(shù)據(jù)模型表示各種數(shù)據(jù)的組織以及數(shù)據(jù)間的聯(lián)系。

●?數(shù)據(jù)一致性和可維護(hù)性,以確保數(shù)據(jù)的安全性和可靠性:主要包括安全性控制,以防止數(shù)據(jù)丟失、錯(cuò)誤更新和越權(quán)使用;完整性控制,保證數(shù)據(jù)的正確性、有效性和相容性;并發(fā)控制,使在同一時(shí)間周期內(nèi),允許對(duì)數(shù)據(jù)實(shí)現(xiàn)多路存取,還能防止用戶之間的不正常交互作用;故障的發(fā)現(xiàn)和恢復(fù),由數(shù)據(jù)庫(kù)管理系統(tǒng)提供一套方法,可及時(shí)發(fā)現(xiàn)故障和修復(fù)故障,從而防止數(shù)據(jù)被破壞?!?故障恢復(fù):由數(shù)據(jù)庫(kù)管理系統(tǒng)提供一套方法,發(fā)現(xiàn)故障后及時(shí)修復(fù),從而防止數(shù)據(jù)被破壞。數(shù)據(jù)庫(kù)系統(tǒng)能盡快恢復(fù)數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行時(shí)出現(xiàn)的故障,這些故障可能是物理上或是邏輯上的錯(cuò)誤,比如對(duì)系統(tǒng)的誤操作造成的數(shù)據(jù)錯(cuò)誤等。10.1.2SQL語(yǔ)句

SQL(StructureQueryLanguage)是用于訪問(wèn)和處理數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)的計(jì)算機(jī)語(yǔ)言。SQL是一種由美國(guó)國(guó)家標(biāo)準(zhǔn)化組織(AmericanNationalStandardsInstitute,ANSI)推薦的標(biāo)準(zhǔn)計(jì)算機(jī)語(yǔ)言,提供訪問(wèn)數(shù)據(jù)庫(kù)的能力。

SQL可以實(shí)現(xiàn)以下功能:

●?面向數(shù)據(jù)庫(kù)執(zhí)行查詢和取回?cái)?shù)據(jù);

●?在數(shù)據(jù)庫(kù)中插入新的記錄;

●?更新數(shù)據(jù)庫(kù)中的數(shù)據(jù);

●?從數(shù)據(jù)庫(kù)刪除記錄;●?創(chuàng)建新數(shù)據(jù)庫(kù);

●?在數(shù)據(jù)庫(kù)中創(chuàng)建新表;

●?在數(shù)據(jù)庫(kù)中創(chuàng)建存儲(chǔ)過(guò)程;

●?在數(shù)據(jù)庫(kù)中創(chuàng)建視圖;

●?設(shè)置表、存儲(chǔ)過(guò)程和視圖的權(quán)限。

數(shù)據(jù)庫(kù)通常包含一個(gè)或多個(gè)表,每個(gè)表由一個(gè)名字標(biāo)識(shí)(例如“學(xué)生信息”或者“課程成績(jī)”),表包含帶有數(shù)據(jù)的記錄(行)。例如一個(gè)名為?"Students"?的學(xué)生信息表:上面的表包含三條記錄(每一條對(duì)應(yīng)一個(gè)人)和五個(gè)字段(Id、姓、名、地址和城市)。在數(shù)據(jù)庫(kù)上執(zhí)行的大部分工作都由SQL語(yǔ)句完成。

(1)通過(guò)SQL語(yǔ)句創(chuàng)建該表:

createtablePersons(

idintauto_increment, //第一個(gè)字段,自動(dòng)增長(zhǎng)記錄行序號(hào)

LastNamechar(20)notnull, //第二字段,名

FirstNamechar(20)notnull, //第三字段,姓

Addressvarchar(50), //第四字段,聯(lián)系住址

Citychar(30), //第五字段,居住城市

PrimaryKey(id)); //序號(hào)字段為主鍵

(2)當(dāng)表建立成功后就可以添加數(shù)據(jù)。在該表中由于ID字段被設(shè)置為自動(dòng)增長(zhǎng)屬性,所以只需要添加其他三個(gè)字段內(nèi)容即可,通過(guò)SQL語(yǔ)句向該表插入數(shù)據(jù):

insertintoPersons(LastName,FirstName,Address,City)values(“Adams”,“Zhang”,“YantaStreet”,“XiAn”)

同時(shí)插入多條數(shù)據(jù):

insertintoPersons(LastName,FirstName,Address,City)values(“Bush”,“Li”,“CentruyAvenue”,“ShangHai”),(“Carter”,“Wang”,“ChanganStreet”,“BeiJing”)

(3)可以通過(guò)選擇語(yǔ)句從表中讀取指定的數(shù)據(jù),例如選取LastName列的數(shù)據(jù):

SELECTLastNameFROMStudents結(jié)果集類似這樣:如果要選擇FirstName=Bush:

SELECT*FROMPersonswhereFirstName=“Bush”

結(jié)果集類似這樣:

(4)當(dāng)發(fā)現(xiàn)存在不合理的數(shù)據(jù)時(shí)應(yīng)該刪除該記錄,例如,刪除LastName=Bush:

DELETEFROMPersonsWHERELastName="Bush"如果要?jiǎng)h除所有記錄,則:

DELETEFROMPersons;

10.2MySQL數(shù)據(jù)庫(kù)

10.2.1MySQL

在本書(shū)中采用MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)軟件。MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典MySQLAB公司,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫(kù)。MySQL的官方網(wǎng)站的網(wǎng)址是:www.MySQL.com。

與其他的大型數(shù)據(jù)庫(kù)例如Oracle、DB2、SQLServer等相比,MySQL有它的不足之處,如規(guī)模小、功能有限等,但是這絲毫也沒(méi)有減少它受歡迎的程度。對(duì)于一般的個(gè)人使用者和中小型企業(yè)來(lái)說(shuō),MySQL提供的功能已經(jīng)綽綽有余,而且由于MySQL是開(kāi)放源碼軟件,因此可以大大降低總體擁有成本。在各大下載網(wǎng)站均可免費(fèi)下載MySQL,其當(dāng)前最新版本為MySQL5.1.46。在Windows環(huán)境下安裝,可選MySQL穩(wěn)定版本MySQL-5.0.67-win32.zip,安裝步驟簡(jiǎn)單,容易入手,如圖10-1所示。圖10-1MySQL安裝主界面圖10-2設(shè)置服務(wù)端口但需要注意配置MySQL服務(wù)端口、支持的字體編碼和管理員密碼。其默認(rèn)服務(wù)端口3306,可改為自定義的端口,如圖10-2所示。其默認(rèn)字體編碼Latin1,需要修改為UTF-8,以便支持多國(guó)文字,如圖10-3所示。圖10-3設(shè)置默認(rèn)字符集

MySQL安裝完畢后,下載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類庫(kù)MySQL-connector-java-5.1.7-bin.jar,并將其復(fù)制到Java安裝路徑,例如:安裝路徑為C:\ProgramFiles\Java\jdk1.5.0_02\lib。然后在JCreator編譯環(huán)境中添加該數(shù)據(jù)庫(kù)連接文件的存儲(chǔ)路徑,如圖10-4所示。圖10-4在JCreator中引入MySQL連接工具開(kāi)發(fā)包10.2.2MySQL常用命令

管理MySQL數(shù)據(jù)庫(kù)可以通過(guò)MySQL安裝目錄下\bin\中的命令行工具M(jìn)ySQL和MySQLadmin來(lái)進(jìn)行,也可以從MySQL的網(wǎng)站下載圖形管理工具M(jìn)ySQLAdministrator和MySQLQueryBrowser。

如果使用命令行工具,常用的命令如下:

●?顯示數(shù)據(jù)庫(kù)列表:

showdatabases;

剛開(kāi)始時(shí)只有兩個(gè)數(shù)據(jù)庫(kù):MySQL和test。MySQL庫(kù)很重要,它里面有MySQL的系統(tǒng)信息,我們改密碼和新增用戶,實(shí)際上就是用這個(gè)庫(kù)進(jìn)行操作?!?使用某數(shù)據(jù)庫(kù):

usedatabases_name;

●?顯示庫(kù)中的數(shù)據(jù)表:

showtables_name;

●?顯示數(shù)據(jù)表的結(jié)構(gòu):

describetables_name;

●?建立數(shù)據(jù)庫(kù):

createdatabasedatabases_name;

●?建立數(shù)據(jù)表:

createtabletables_name(字段設(shè)定列表);●?顯示表中的記錄:

select*fromtables_name;

●?將表中記錄清空:

deletefromtables_name;

●?刪庫(kù)和刪表:

droptabletables_name;

dropdatabasedatabases_name;

10.3JDBC

10.3.1JDBC的結(jié)構(gòu)

JDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn)接口,它由一組用Java語(yǔ)言編寫(xiě)的類和接口組成。JDBC對(duì)Java程序員而言是API,對(duì)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)連接的服務(wù)提供商而言是接口模型。作為API,JDBC為程序開(kāi)發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫(kù)廠商及第三方中間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其他數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實(shí)現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡(jiǎn)單、嚴(yán)格類型定義且高性能實(shí)現(xiàn)的接口。JDBC的結(jié)構(gòu)如圖10-5所示。圖10-5JDBC層次結(jié)構(gòu)在JDBC體系結(jié)構(gòu)中包含兩個(gè)層次:

●?JDBCAPI和JDBC驅(qū)動(dòng)程序管理器API通信,向它發(fā)送各種不同的SQL語(yǔ)句。

●?驅(qū)動(dòng)程序管理器和各種不同的第三方驅(qū)動(dòng)程序通信,完成數(shù)據(jù)庫(kù)連接,返回查詢信息或執(zhí)行查詢語(yǔ)句指定的操作。

JDBC擴(kuò)展了Java的功能。例如,用Java和JDBCAPI可以發(fā)布含有applet的網(wǎng)頁(yè),而該applet使用的信息可能來(lái)自遠(yuǎn)程數(shù)據(jù)庫(kù)。企業(yè)也可以用JDBC通過(guò)Intranet將所有職員信息存儲(chǔ)到一個(gè)或多個(gè)內(nèi)部數(shù)據(jù)庫(kù)中。隨著越來(lái)越多的程序員開(kāi)始使用Java編程語(yǔ)言,對(duì)從Java中便捷地訪問(wèn)數(shù)據(jù)庫(kù)的要求也在日益增加。10.3.2JDBC的驅(qū)動(dòng)程序

目前比較常見(jiàn)的JDBC驅(qū)動(dòng)程序可分為以下四個(gè)種類:

(1)?JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序。JavaSoft橋產(chǎn)品利用ODBC驅(qū)動(dòng)程序提供JDBC訪問(wèn)。注意,必須將ODBC二進(jìn)制代碼加載到使用該驅(qū)動(dòng)程序的每個(gè)客戶機(jī)上。因此,這種類型的驅(qū)動(dòng)程序最適合于企業(yè)網(wǎng),或者是用Java編寫(xiě)的三層結(jié)構(gòu)的應(yīng)用程序服務(wù)器代碼。

(2)本地API。這種類型的驅(qū)動(dòng)程序把客戶機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其他DBMS的調(diào)用。注意,像橋驅(qū)動(dòng)程序一樣,這種類型的驅(qū)動(dòng)程序要求將某些二進(jìn)制代碼加載到每臺(tái)客戶機(jī)上。

(3)?JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序。這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議,之后這種協(xié)議又被某個(gè)服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上。所用的具體協(xié)議取決于提供者,所以,這是最為靈活的JDBC驅(qū)動(dòng)程序。

(4)本地協(xié)議純Java驅(qū)動(dòng)程序。這種類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許從客戶機(jī)上直接調(diào)用DBMS服務(wù)器,是Intranet訪問(wèn)的一個(gè)很實(shí)用的解決方法。10.3.3數(shù)據(jù)庫(kù)編程的基本步驟

在JDBC中訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟:首先加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,其次建立數(shù)據(jù)庫(kù)連接,接下來(lái)執(zhí)行SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù),然后處理結(jié)果集,最后關(guān)閉結(jié)果集,并斷開(kāi)連接。所以,JDBC由一系列連接(Connection)、SQL語(yǔ)句聲明(Statement)和結(jié)果集(ResultSet)構(gòu)成,如圖10-6所示。圖10-6JDBC結(jié)構(gòu)

1.JDBCURL

在加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序時(shí)需要對(duì)網(wǎng)絡(luò)上的數(shù)據(jù)庫(kù)進(jìn)行定位。JDBCURL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能識(shí)別該數(shù)據(jù)庫(kù)并與之建立連接。其作用是提供某些約定,驅(qū)動(dòng)程序編程員在構(gòu)造他們的JDBCURL時(shí)應(yīng)該遵循這些約定。由于JDBCURL要與各種不同的驅(qū)動(dòng)程序一起使用,因此這些約定應(yīng)非常靈活。

●?首先,它們應(yīng)允許不同的驅(qū)動(dòng)程序使用不同的方案來(lái)命名數(shù)據(jù)庫(kù)。例如,odbc子協(xié)議允許(但并不是要求)URL含有屬性值?!?其次,JDBCURL應(yīng)允許驅(qū)動(dòng)程序編程員將一切所需的信息編入其中。這樣就可以讓要與給定數(shù)據(jù)庫(kù)對(duì)話的applet打開(kāi)數(shù)據(jù)庫(kù)連接,而無(wú)須要求用戶去做任何系統(tǒng)管理工作。

●?最后,JDBCURL應(yīng)允許某種程度的間接性。也就是說(shuō),JDBCURL可指向邏輯主機(jī)或數(shù)據(jù)庫(kù)名,而這種邏輯主機(jī)或數(shù)據(jù)庫(kù)名將由網(wǎng)絡(luò)命名系統(tǒng)動(dòng)態(tài)地轉(zhuǎn)換為實(shí)際的名稱。

JDBCURL的標(biāo)準(zhǔn)語(yǔ)法如下:

JDBC:<子協(xié)議><子名稱>

它由三部分組成,各部分間用冒號(hào)分隔。JDBCURL的三個(gè)部分可分解如下:

●?JDBC協(xié)議:JDBCURL中的協(xié)議總是JDBC。●?<子協(xié)議>:驅(qū)動(dòng)程序名或數(shù)據(jù)庫(kù)連接機(jī)制(這種機(jī)制可由一個(gè)或多個(gè)驅(qū)動(dòng)程序支持)的名稱。子協(xié)議名的典型示例是“odbc”,該名稱是為用于指定ODBC風(fēng)格的數(shù)據(jù)資源名稱的URL專門(mén)保留的。例如,為了通過(guò)JDBC-ODBC橋來(lái)訪問(wèn)某個(gè)數(shù)據(jù)庫(kù),可以用如下所示的URL:JDBC:odbc:book。本例中,子協(xié)議為“odbc”,子名稱“book”是本地ODBC數(shù)據(jù)資源。如果要用網(wǎng)絡(luò)命名服務(wù)(這樣JDBCURL中的數(shù)據(jù)庫(kù)名稱不必是實(shí)際名稱),則命名服務(wù)作為子協(xié)議,例如,URL:JDBC:dcenaming:accounts。●?<子名稱>:一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依不同的子協(xié)議而變化。它還可以有子名稱的子名稱(含有驅(qū)動(dòng)程序編程員所選的任何內(nèi)部語(yǔ)法)。使用子名稱的目的是為定位數(shù)據(jù)庫(kù)提供足夠的信息。若數(shù)據(jù)庫(kù)是通過(guò)Internet來(lái)訪問(wèn)的,則必須遵循如下的標(biāo)準(zhǔn)URL命名約定://主機(jī)名:端口/子協(xié)議。假設(shè)“dbnet”是個(gè)用于將某個(gè)主機(jī)連接到Internet上的協(xié)議,則JDBCURL應(yīng)為:JDBC:dbnet://wombat:356/fred。

2.DriverManager類

當(dāng)明確了數(shù)據(jù)庫(kù)的URL后,用戶還需要安裝與指定數(shù)據(jù)庫(kù)相應(yīng)的驅(qū)動(dòng)程序。在Java語(yǔ)言中,DriverManager類負(fù)責(zé)加載和注冊(cè)JDBC驅(qū)動(dòng)程序,管理應(yīng)用程序和已注冊(cè)的驅(qū)動(dòng)程序的連接。加載和注冊(cè)驅(qū)動(dòng)程序使用Class類的forName方法,裝載驅(qū)動(dòng)程序只需要非常簡(jiǎn)單的一行代碼。例如,若要使用JDBC-ODBC橋驅(qū)動(dòng)程序,可以用下列代碼裝載它:

Class.forName(“sun.JDBC.odbc.JdbcOdbcDriver”);

驅(qū)動(dòng)程序文檔將提示應(yīng)該使用的類名。例如,如果類名是JDBC.DriverXYZ,那么將用以下代碼裝載驅(qū)動(dòng)程序:

Class.forName("JDBC.DriverXYZ");不需要?jiǎng)?chuàng)建一個(gè)驅(qū)動(dòng)程序類的實(shí)例并且用DriverManager登記它,因?yàn)檎{(diào)用Class.forName將自動(dòng)加載驅(qū)動(dòng)程序類。如果你曾自己創(chuàng)建實(shí)例,你將創(chuàng)建一個(gè)不必要的副本,但它不會(huì)帶來(lái)什么壞處。加載Driver類后,它們即可用來(lái)與數(shù)據(jù)庫(kù)建立連接。

3.Connection接口

Connection接口負(fù)責(zé)維護(hù)Java應(yīng)用程序與數(shù)據(jù)庫(kù)之間的連接。用適當(dāng)?shù)尿?qū)動(dòng)程序類與DBMS建立一個(gè)連接。下列代碼是一般的做法:

Connectioncon=DriverManager.getConnection(url,“user”,“Password”);

在這里url是關(guān)鍵。如果你正在使用JDBC-ODBC橋,JDBCURL將以JDBC:odbc開(kāi)始,余下URL通常是你的數(shù)據(jù)源名或數(shù)據(jù)庫(kù)系統(tǒng)名。因此,假設(shè)你正在使用ODBC存取一個(gè)叫“Fred”的ODBC數(shù)據(jù)源,你的JDBCURL是JDBC:odbc:Fred。把“user”及“Password”替換為你登錄DBMS的用戶名及口令。如果你登錄數(shù)據(jù)庫(kù)系統(tǒng)的用戶名為“Fernanda”,口令為“J8”,只需下面的2行代碼就可以建立一個(gè)連接:

Stringurl=“JDBC:odbc:Fred”;

Connectioncon=DriverManager.getConnection(url,“Fernanda”,“J8”);

如果你使用了第三方JDBC驅(qū)動(dòng)程序,程序文檔將告訴你該使用什么子協(xié)議,就是在JDBCURL中放在JDBC后面的部分。例如,如果驅(qū)動(dòng)程序開(kāi)發(fā)者注冊(cè)了acme作為子協(xié)議,JDBCURL的第一和第二部分將是JDBC:acme。JDBCURL最后一部分提供了定位數(shù)據(jù)庫(kù)的信息。

如果裝載的驅(qū)動(dòng)程序識(shí)別了提供給DriverManager.getConnection的JDBCURL,那么驅(qū)動(dòng)程序?qū)⒏鶕?jù)JDBCURL建立一個(gè)到指定DBMS的連接。DriverManager類在后臺(tái)為你管理建立連接的所有細(xì)節(jié)。程序員在此類中直接使用唯一方法DriverManager.getConnection()。該方法返回一個(gè)打開(kāi)的連接,你可以使用此連接創(chuàng)建JDBCstatements并發(fā)送SQL語(yǔ)句到數(shù)據(jù)庫(kù)。在前面的例子里,con對(duì)象是一個(gè)打開(kāi)的連接,并且我們要在以后的例子里使用它。所以,JDBC連接數(shù)據(jù)庫(kù)的準(zhǔn)備工作分三個(gè)步驟,分別是:

(1)加載驅(qū)動(dòng)程序。

Class.forName(“sun.JDBC.odbc.JdbcOdbcDriver”);

(2)創(chuàng)建指定數(shù)據(jù)庫(kù)的URL。

Stringurl=“JDBC:odbc:fred”;

(3)建立數(shù)據(jù)庫(kù)連接。

DriverManager.getConnection(url,"userID","password");例如:

importjava.sql.*;

//定義連接字串,LibrarySQLServer是ODBC數(shù)據(jù)源名

Stringurl=“JDBC:odbc:LibrarySQLServer”;

Connectionconn=null;

//建立連接類

try{

//告訴程序使用JDBC與ODBC橋創(chuàng)建數(shù)據(jù)庫(kù)連接

Class.forName(“sun.JDBC.odbc.JdbcOdbcDriver”);

//使用DriverManager類的getConnection()方法建立連接,

//第一個(gè)字符參數(shù)定義用戶名,第二個(gè)字符參數(shù)定義密碼

conn=DriverManager.getConnection(url,“”,“”);

}catch(Exceptione){}又例如:

//加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)

Class.forName(“com.MySQL.JDBC.Driver”);

//連接數(shù)據(jù)庫(kù),IP地址:3306(是端口):數(shù)據(jù)庫(kù)名

Stringurl=“JDBC:MySQL://88:3306/bbs”;

//root是用戶名,123456是密碼

Connectioncon=DriverManager.getConnection(url,“root”,“123456”);

//聲明SQL語(yǔ)句執(zhí)行實(shí)例對(duì)象

Statementstat=con.createStatement();

4.Statement類和接口,以及PreparedStatement接口

數(shù)據(jù)庫(kù)連接完畢,接下來(lái)創(chuàng)建SQL語(yǔ)句執(zhí)行實(shí)例對(duì)象,預(yù)備進(jìn)行數(shù)據(jù)庫(kù)的維護(hù)。在Java中,定義了三種類,來(lái)分別執(zhí)行不同的SQL語(yǔ)句:

●?Statement:執(zhí)行簡(jiǎn)單的無(wú)參數(shù)的SQL語(yǔ)句;

●?PrepareStatement:采用預(yù)編譯的Statement,用于執(zhí)行帶參數(shù)的SQL語(yǔ)句;

●?CallableStatement:執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)用。

例如:

Statementstmt=conn.createStatement();創(chuàng)建JDBCStatements對(duì)象,Statement對(duì)象用于把SQL語(yǔ)句發(fā)送到DBMS。需要?jiǎng)?chuàng)建一個(gè)Statement對(duì)象并且執(zhí)行它。Statement對(duì)象有三個(gè)常用的方法,分別是:

●?ResultSetexecuteQuery(Stringsql)throwsSQLException:執(zhí)行一條SELECT語(yǔ)句,返回查詢結(jié)果集;

●?IntexecuteUpdate(Stringsql)throwsSQLException:執(zhí)行INSERT\UPDATE\DELETE語(yǔ)句,返回操作成功的記錄數(shù);

●?Voidclose()throwsSQLException:釋放Statement對(duì)象的數(shù)據(jù)庫(kù)和JDBC資源。對(duì)SELECT語(yǔ)句來(lái)說(shuō),可以使用executeQuery()方法。要?jiǎng)?chuàng)建或修改表的語(yǔ)句,使用的方法是executeUpdate()。

需要一個(gè)活躍的連接的來(lái)創(chuàng)建Statement對(duì)象的實(shí)例。例如,使用Connection對(duì)象con創(chuàng)建Statement對(duì)象stmt:

Statementstmt=con.createStatement();

到此stmt已經(jīng)存在了,但它還沒(méi)有把SQL語(yǔ)句傳遞到DBMS。我們需要提供SQL語(yǔ)句作為參數(shù)提供給我們使用的Statement的方法。

例如,在下面的代碼段里,使用上面例子中的SQL語(yǔ)句作為executeUpdate的參數(shù):

stmt.executeUpdate(“createtablePersons”+

"(idintauto_increment,LastNamechar(20)notnull,FirstNamechar(20)notnull,

Addressvarchar(50),Citychar(30),PrimaryKey(id)“);

SQL準(zhǔn)備完畢就該執(zhí)行語(yǔ)句,我們使用executeUpdate()方法是因?yàn)槠渲械腟QL語(yǔ)句是DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句。創(chuàng)建表、改變表、刪除表都是DDL語(yǔ)句,要用executeUpdate()方法來(lái)執(zhí)行。方法executeUpdate()也被用于執(zhí)行更新表SQL語(yǔ)句。實(shí)際上,相對(duì)于創(chuàng)建表來(lái)說(shuō),executeUpdate()用于更新表的時(shí)間更多,因?yàn)楸碇恍枰獎(jiǎng)?chuàng)建一次,但經(jīng)常被更新。使用最多的執(zhí)行SQL語(yǔ)句的方法是executeQuery()。例如:

//加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)

Class.forName(”com.MySQL.JDBC.Driver“);

//連接數(shù)據(jù)庫(kù),IP地址:3306(是端口):數(shù)據(jù)庫(kù)名

Stringurl="JDBC:MySQL://88:3306/bbs";

//root是用戶名,123456是密碼

Connectioncon=DriverManager.getConnection(url,“root”,“123456”);

//聲明SQL語(yǔ)句執(zhí)行實(shí)例對(duì)象

Statementstat=con.createStatement();

stat.executeQuery(“select*fromStudentswhereid=1”);

在Java語(yǔ)言中,PreparedStatement是Statement的子接口,兩者功能相似。如果某SQL指令被執(zhí)行多次,PreparedStatement的效率比Statement高,且PreparedStatement可以給SQL指令傳遞參數(shù)。例如:

//加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)

Class.forName("com.MySQL.JDBC.Driver");//連接數(shù)據(jù)庫(kù),IP地址:3306(是端口):數(shù)據(jù)庫(kù)名

Stringurl="JDBC:MySQL://88:3306/bbs";

//root是用戶名,123456是密碼

Connectioncon=DriverManager.getConnection(url,"root","123456");

//聲明SQL語(yǔ)句執(zhí)行實(shí)例對(duì)象

Stringsql="select*fromStudentswhereid=?andfirstName=?";

PreparedStatementstat=con.preparedStatement(sql);

stat.setInt(1,1);

stat.setString(2,"Li");

stat.executeQuery();

5.ResultSet接口

ResultSet接口用于通過(guò)statement或preparedStatement調(diào)用excuteQuery()方法后,存儲(chǔ)返回的查詢結(jié)果集。其常用的讀取數(shù)據(jù)的方法如表10-1所示。例如:

Class.forName(“com.MySQL.JDBC.Driver”);

Stringurl=“JDBC:MySQL://88:3306/bbs”;

Connectioncon=DriverManager.getConnection(url,“root”,“123456”);

Stringsql=“select*fromStudents”;

PreparedStatementstat=con.preparedStatement(sql);

ResultSetrs=stat.executeQuery();

while(rs.next()){

System.out.print(“ID=”+rs.getInt(“id”));

System.out.print(“LastName=”+rs.getString(“l(fā)astname”));

System.out.print(“FirstName=”+rs.getString(“firstname”));

}

stat.close();

con.close();

10.4數(shù)據(jù)庫(kù)的維護(hù)

10.4.1數(shù)據(jù)的添加

當(dāng)在指定的數(shù)據(jù)庫(kù)內(nèi)建立了相應(yīng)的數(shù)據(jù)表,就需要向該表中添加數(shù)據(jù)。在表中插入一條新的記錄的語(yǔ)法如下:

insertinto表名稱(字段名1,字段名2,…)values(值1,值2,…)

向表中添加數(shù)據(jù)有以下規(guī)則:

(1)?values中值的類型必須和字段類型保持一致;

(2)如果值包括了所有字段,則可不必列出字段名稱,依次按表中字段順序賦值;

(3)如果表中某第一個(gè)字段具有自動(dòng)增加屬性,則可不必寫(xiě)主鍵字段名,會(huì)自動(dòng)填寫(xiě);

(4)可以不必列出所有表中字段,但必須列出表中屬性不為空的字段;

(5)需要同時(shí)插入多條記錄,可以在values后跟多個(gè)記錄集合。

例如,有表結(jié)構(gòu)如

createtablePersons(

idintauto_increment,

//第一個(gè)字段,自動(dòng)增長(zhǎng)記錄行序號(hào)

LastNamechar(20)notnull,

//第二字段,名

FirstNamechar(20)notnull,

//第三字段,姓

Addressvarchar(50),

//第四字段,聯(lián)系住址

Citychar(30),

//第五字段,居住城市

PrimaryKey(id));

//序號(hào)字段為主鍵則考查以下SQL語(yǔ)句:

InsertintoPersons(id,LastName,F(xiàn)irstName,Address,City)values(1,“Nick”,“Bush”,“FirstStreetNo.1”,“NewYork”)正確

InsertintoPersons(id,LastName,F(xiàn)irstName,Address,City)values(1,123,“Bush”,“FirstStreetNo.1”,“NewYork”)錯(cuò)誤,因?yàn)閷?duì)應(yīng)LastName字段應(yīng)該為字符串類型,使用單引號(hào)或者雙引號(hào)包括:

InsertintoPersonsvalues(1,“Mark”,“Johns”,“ChangAnAvenve”,“Xi‘a(chǎn)n”)正確

InsertintoPersonsvalues(“Mark”,1,“Johns”,“ChangAnAvenve”,“Xi’an”)錯(cuò)誤,?字段順序不一致,序號(hào)值排到了第2個(gè)位置

InsertintoPersons(LastName,F(xiàn)irstName,Address,City)values("Mofy","Bush","FirstStreetNo.1","BeiJing")正確

InsertintoPersons(FirstName,Address)values(“Zhang”,“HeBei”)錯(cuò)誤,沒(méi)有列出LastName字段,該字段內(nèi)容不能為空

InsertintoPersons(id,LastName,F(xiàn)irstName,Address,City)values(8,“yu”,“Guan”,“zhuozhou”,“HeBei”)(9,“bei”,“Liu”,“zhuozhou”,“HeBei”)正確

InsertintoPersons(LastName,F(xiàn)irstName)values(12,“ren”,“Cao”)(13,“yuan”,“XiaHou”)正確

在JDBC中為了實(shí)現(xiàn)以上SQL語(yǔ)句,需要調(diào)用Statement.executeUpdate()方法,該方法的返回值為整數(shù),表示因該SQL語(yǔ)句執(zhí)行而插入的數(shù)據(jù)記錄行數(shù),例如:

Statementstat=con.createStatement();

Stringsql=“InsertintoPersons(id,LastName,F(xiàn)irstName,Address,City)values(1,‘Nick’,‘Bush’,‘FirstStreetNo.1’,‘NewYork’)”;

inti=stat.executeUpdate(sql);10.4.2數(shù)據(jù)的刪除

當(dāng)數(shù)據(jù)表中某些數(shù)據(jù)不再需要,如發(fā)現(xiàn)該數(shù)據(jù)錯(cuò)誤,可以利用SQL語(yǔ)句刪除該數(shù)據(jù),語(yǔ)法如下:

deletefrom數(shù)據(jù)表名where刪除條件

例如:

deletefromPersonswhereid=1

deletefromPersonswhereFirstName=“Cao”

deletefromPersonswhereCitylike“He%”

deletefromPersonswhereLastName=“yu”andFirstName=“Guan”

deletefromPersonswhereFirstName="Cao"orFirstName="XiaHou"在JDBC中為了實(shí)現(xiàn)以上SQL語(yǔ)句,需要調(diào)用Statement.executeUpdate()方法,該方法的返回值為整數(shù),表示因該SQL語(yǔ)句執(zhí)行而刪除的數(shù)據(jù)記錄行數(shù),例如:

Statementstat=con.createStatement();

Stringsql=“deletefromPersonswhereFirstName=‘Cao’”;

inti=stat.executeUpdate(sql);10.4.3數(shù)據(jù)的修改

當(dāng)數(shù)據(jù)表中某些數(shù)據(jù)錯(cuò)誤時(shí),可利用SQL語(yǔ)句修改,語(yǔ)法如下:

update數(shù)據(jù)表名set字段名=值where修改條件

在修改數(shù)據(jù)時(shí)有如下規(guī)則:

●?若字段被標(biāo)識(shí)為自增字段,則修改無(wú)效;

●?若字段是主鍵,則修改后的取值不能和表中相同字段值相同;

●?不能將非空的字段設(shè)置為Null。例如:

updatePersonssetCity=“Xi‘a(chǎn)n”//修改所有記錄

updatePersonssetCity=“JiNan”whereFirstName=“Liu”

updatePersonssetAddress=“theCenterRoad”,City=“BeiJing”whereFirstName=“Liu”

在JDBC中為了實(shí)現(xiàn)以上SQL語(yǔ)句,需要調(diào)用Statement.executeUpdate()方法,該方法的返回值為整數(shù),表示因該SQL語(yǔ)句執(zhí)行而修改的數(shù)據(jù)記錄行數(shù),例如:

Statementstat=con.createStatement();

Stringsql=“updatePersonssetCity=’JiNan‘whereFirstName=’Liu‘”;

inti=stat.executeUpdate(sql);

10.5數(shù)?據(jù)?庫(kù)?查?詢

查詢操作是數(shù)據(jù)庫(kù)的基本操作,一個(gè)數(shù)據(jù)庫(kù)應(yīng)用中80%的工作量是完成了查詢操作。

10.5.1數(shù)據(jù)庫(kù)的查詢方法

實(shí)現(xiàn)查詢數(shù)據(jù)的SQL語(yǔ)法如下:

Select字段1[,字段2]from數(shù)據(jù)表名where查詢條件orderby字段名

在該語(yǔ)句中,需要給出查詢結(jié)果的字段集合,多個(gè)字段之間使用“,”間隔,如要需要查詢所有字段使用“*”來(lái)代替;查詢的結(jié)果可以根據(jù)“orderby”所指定的順序給出。例如:

Select*fromPersons

Select*fromPersonswhereid=1

SelectFirstName,LastNamefromPersonswhereid=1

Select*fromPersonswhereid=1andid=2

Select*fromPersonswhereLastNamelike“c%”

Select*fromPersonsorderbyid

SelectFirstName,LastName,Address,CityfromPersonswhereCity=“BeiJing”orderbyFirstName

Selectcount(*)asafromPersons

Selectcount(*)asafromPersonswhereCity="BeiJing"在JDBC中為了實(shí)現(xiàn)以上SQL語(yǔ)句,需要調(diào)用Statement.executeQuery()方法,該方法的返回值為查詢結(jié)果集(ResultSet),表示因該SQL語(yǔ)句執(zhí)行獲得的數(shù)據(jù)記錄集合,例如:

Statementstat=con.createStatement();

Stringsql=“SelectFirstName,LastNamefromPersonswhereid=1”;

ResultSetrs=stat.executeQuery(sql);10.5.2PreparedStatement類

Java中的PreparedStatement接口繼承了Statement。由于PreparedStatement對(duì)象已預(yù)編譯過(guò),所以其執(zhí)行速度要快于Statement對(duì)象。因此,多次執(zhí)行的SQL語(yǔ)句經(jīng)常創(chuàng)建為PreparedStatement對(duì)象,以提高效率。

PreparedStatement實(shí)例包含已編譯的SQL語(yǔ)句。這就是使語(yǔ)句“準(zhǔn)備好”。包含于PreparedStatement對(duì)象中的SQL語(yǔ)句可具有一個(gè)或多個(gè)插入?yún)?shù)。IN參數(shù)的值在SQL語(yǔ)句創(chuàng)建時(shí)未被指定。相反的,該語(yǔ)句為每個(gè)插入?yún)?shù)使用一個(gè)問(wèn)號(hào)(“?”)作為占位符。每個(gè)問(wèn)號(hào)的值必須在該語(yǔ)句執(zhí)行之前,通過(guò)適當(dāng)?shù)膕etXXX()方法來(lái)提供,常用的方法如表10-2所示。

例如:

PreparedStatementpstmt=conn.preparedStatement(“InsertintoStudent(Id,Name)values(?,?)”);

Pstmt.setInt(1,10);

Pstmt.setString(2,“張三”);

Pstmt.executeUpdate()

以上語(yǔ)句等效于:

Statementstmt=conn.createStatement();

Inti=stmt.executeUpdate(“InsertintoStudent(Id,Name)values(10,‘張三’)”);

對(duì)查詢語(yǔ)句使用PreparedStatement,例如:

PreparedStatementstat=con.preparedStatement();

Stringsql=“SelectFirstName,LastNamefromPersonswhereid=?”;

Pstmt.setInt(1,1);

ResultSetrs=Pstat.executeQuery(sql);

10.6數(shù)據(jù)庫(kù)操作實(shí)例

本節(jié)在以前章節(jié)的基礎(chǔ)上設(shè)計(jì)一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用。

【例10-1】假設(shè)有一個(gè)學(xué)校學(xué)生的課程成績(jī)登記數(shù)據(jù)庫(kù)。在經(jīng)過(guò)一系列簡(jiǎn)化后,需要設(shè)計(jì)3個(gè)數(shù)據(jù)表來(lái)實(shí)現(xiàn)功能,分

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論