版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 受激布里淵散射在微波信號(hào)中的應(yīng)用
- 2024版合作投資合同協(xié)議3篇
- 2024石材廢料處理與回收合同
- 2024年高新技術(shù)產(chǎn)業(yè)區(qū)委托招商合作協(xié)議3篇
- 2025年度工廠貨車承包運(yùn)營(yíng)服務(wù)協(xié)議合同
- 二零二五年度大米期貨交易簡(jiǎn)易合同
- 2025年度委托育苗與農(nóng)業(yè)產(chǎn)業(yè)升級(jí)合同
- 2025年度手房居間合同:新房交易安全指南3篇
- 2025年度手車二手車置換協(xié)議及交易保障合同3篇
- 建筑公司勞務(wù)合同(2025年度)施工現(xiàn)場(chǎng)環(huán)境及安全責(zé)任協(xié)議3篇
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫(kù)(共380題含答案)
- 施工現(xiàn)場(chǎng)環(huán)境因素識(shí)別、評(píng)價(jià)及環(huán)境因素清單、控制措施
- 【9道期末】安徽省宣城市2023-2024學(xué)年九年級(jí)上學(xué)期期末道德與法治試題(含解析)
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 《工程造價(jià)專業(yè)應(yīng)用型本科畢業(yè)設(shè)計(jì)指導(dǎo)標(biāo)準(zhǔn)》
- 倉(cāng)庫(kù)主管2025年終總結(jié)及2025工作計(jì)劃
- 廣州英語(yǔ)小學(xué)六年級(jí)英語(yǔ)六上冊(cè)作文范文1-6單元
- 接觸鏡臨床驗(yàn)配智慧樹(shù)知到期末考試答案2024年
- 徐州市2023-2024學(xué)年八年級(jí)上學(xué)期期末英語(yǔ)試卷(含答案解析)
- 譯林版小學(xué)英語(yǔ)六年級(jí)上冊(cè)英文作文范文
- 某城市污水處理廠設(shè)計(jì)污水處理廠設(shè)計(jì)說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論