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

下載本文檔

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

文檔簡介

第10章數(shù)據(jù)庫訪問

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

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

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

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

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

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

●?數(shù)據(jù)的獨(dú)立性:數(shù)據(jù)的獨(dú)立性包括數(shù)據(jù)庫中數(shù)據(jù)庫的邏輯結(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),不同的用戶或同一用戶在不同處理中其文件之間毫無關(guān)系。利用數(shù)據(jù)庫可對數(shù)據(jù)進(jìn)行集中控制和管理,并通過數(shù)據(jù)模型表示各種數(shù)據(jù)的組織以及數(shù)據(jù)間的聯(lián)系。

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

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

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

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

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

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

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

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

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

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

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

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

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

createtablePersons(

idintauto_increment, //第一個字段,自動增長記錄行序號

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

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

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

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

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

(2)當(dāng)表建立成功后就可以添加數(shù)據(jù)。在該表中由于ID字段被設(shè)置為自動增長屬性,所以只需要添加其他三個字段內(nèi)容即可,通過SQL語句向該表插入數(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)可以通過選擇語句從表中讀取指定的數(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"如果要刪除所有記錄,則:

DELETEFROMPersons;

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

10.2.1MySQL

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

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

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

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

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

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

showdatabases;

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

usedatabases_name;

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

showtables_name;

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

describetables_name;

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

createdatabasedatabases_name;

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

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

select*fromtables_name;

●?將表中記錄清空:

deletefromtables_name;

●?刪庫和刪表:

droptabletables_name;

dropdatabasedatabases_name;

10.3JDBC

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

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

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

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

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

目前比較常見的JDBC驅(qū)動程序可分為以下四個種類:

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

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

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

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

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

1.JDBCURL

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

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

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

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

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

它由三部分組成,各部分間用冒號分隔。JDBCURL的三個部分可分解如下:

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

2.DriverManager類

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

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

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

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

3.Connection接口

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

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

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

Stringurl=“JDBC:odbc:Fred”;

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

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

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

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

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

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

Stringurl=“JDBC:odbc:fred”;

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

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

importjava.sql.*;

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

Stringurl=“JDBC:odbc:LibrarySQLServer”;

Connectionconn=null;

//建立連接類

try{

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

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

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

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

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

}catch(Exceptione){}又例如:

//加載數(shù)據(jù)庫驅(qū)動

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

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

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

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

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

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

Statementstat=con.createStatement();

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

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

●?Statement:執(zhí)行簡單的無參數(shù)的SQL語句;

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

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

例如:

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

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

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

●?Voidclose()throwsSQLException:釋放Statement對象的數(shù)據(jù)庫和JDBC資源。對SELECT語句來說,可以使用executeQuery()方法。要創(chuàng)建或修改表的語句,使用的方法是executeUpdate()。

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

Statementstmt=con.createStatement();

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

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

stmt.executeUpdate(“createtablePersons”+

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

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

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

//加載數(shù)據(jù)庫驅(qū)動

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

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

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

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

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

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

Statementstat=con.createStatement();

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

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

//加載數(shù)據(jù)庫驅(qū)動

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

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

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

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

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

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

PreparedStatementstat=con.preparedStatement(sql);

stat.setInt(1,1);

stat.setString(2,"Li");

stat.executeQuery();

5.ResultSet接口

ResultSet接口用于通過statement或preparedStatement調(diào)用excuteQuery()方法后,存儲返回的查詢結(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ù)庫的維護(hù)

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

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

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

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

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

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

(3)如果表中某第一個字段具有自動增加屬性,則可不必寫主鍵字段名,會自動填寫;

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

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

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

createtablePersons(

idintauto_increment,

//第一個字段,自動增長記錄行序號

LastNamechar(20)notnull,

//第二字段,名

FirstNamechar(20)notnull,

//第三字段,姓

Addressvarchar(50),

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

Citychar(30),

//第五字段,居住城市

PrimaryKey(id));

//序號字段為主鍵則考查以下SQL語句:

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”)錯誤,因?yàn)閷?yīng)LastName字段應(yīng)該為字符串類型,使用單引號或者雙引號包括:

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

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

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

InsertintoPersons(FirstName,Address)values(“Zhang”,“HeBei”)錯誤,沒有列出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語句,需要調(diào)用Statement.executeUpdate()方法,該方法的返回值為整數(shù),表示因該SQL語句執(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ù)錯誤,可以利用SQL語句刪除該數(shù)據(jù),語法如下:

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

例如:

deletefromPersonswhereid=1

deletefromPersonswhereFirstName=“Cao”

deletefromPersonswhereCitylike“He%”

deletefromPersonswhereLastName=“yu”andFirstName=“Guan”

deletefromPersonswhereFirstName="Cao"orFirstName="XiaHou"在JDBC中為了實(shí)現(xiàn)以上SQL語句,需要調(diào)用Statement.executeUpdate()方法,該方法的返回值為整數(shù),表示因該SQL語句執(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ù)錯誤時(shí),可利用SQL語句修改,語法如下:

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

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

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

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

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

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

updatePersonssetCity=“JiNan”whereFirstName=“Liu”

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

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

Statementstat=con.createStatement();

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

inti=stat.executeUpdate(sql);

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

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

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

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

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

在該語句中,需要給出查詢結(jié)果的字段集合,多個字段之間使用“,”間隔,如要需要查詢所有字段使用“*”來代替;查詢的結(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語句,需要調(diào)用Statement.executeQuery()方法,該方法的返回值為查詢結(jié)果集(ResultSet),表示因該SQL語句執(zhí)行獲得的數(shù)據(jù)記錄集合,例如:

Statementstat=con.createStatement();

Stringsql=“SelectFirstName,LastNamefromPersonswhereid=1”;

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

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

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

例如:

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

Pstmt.setInt(1,10);

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

Pstmt.executeUpdate()

以上語句等效于:

Statementstmt=conn.createStatement();

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

對查詢語句使用PreparedStatement,例如:

PreparedStatementstat=con.preparedStatement();

Stringsql=“SelectFirstName,LastNamefromPersonswhereid=?”;

Pstmt.setInt(1,1);

ResultSetrs=Pstat.executeQuery(sql);

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

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

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

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論