天學(xué)通Java電子教案JDBC數(shù)據(jù)庫(kù)編程_第1頁(yè)
天學(xué)通Java電子教案JDBC數(shù)據(jù)庫(kù)編程_第2頁(yè)
天學(xué)通Java電子教案JDBC數(shù)據(jù)庫(kù)編程_第3頁(yè)
天學(xué)通Java電子教案JDBC數(shù)據(jù)庫(kù)編程_第4頁(yè)
天學(xué)通Java電子教案JDBC數(shù)據(jù)庫(kù)編程_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第17章 JDBC數(shù)據(jù)庫(kù)編程在超市中購(gòu)買東西時(shí),在很多的商品中是不容易找到自己想要的商品的,這時(shí)候通常就會(huì)找超市管理人員來幫忙解決。這就好像Java中的數(shù)據(jù)庫(kù)編程JDBC。在Java程序中,如果希望對(duì)很多的數(shù)據(jù)進(jìn)行操作時(shí),通過使用數(shù)據(jù)庫(kù)編程來解決。在本章中就來學(xué)習(xí)如何進(jìn)行數(shù)據(jù)庫(kù)編程。通過本章的學(xué)習(xí),讀者應(yīng)該完成如下幾個(gè)目標(biāo)。對(duì)數(shù)據(jù)庫(kù)有基本了解。熟練掌握J(rèn)DBC的編程步驟。掌握如何在Java中進(jìn)行數(shù)據(jù)庫(kù)操作。17.1 數(shù)據(jù)庫(kù)基本介紹數(shù)據(jù)庫(kù)在應(yīng)用程序中占有相當(dāng)重要的地位,幾乎所有的系統(tǒng)都必須要有數(shù)據(jù)。數(shù)據(jù)庫(kù)發(fā)展到現(xiàn)在已經(jīng)相當(dāng)成熟了,已由原來的Sybase數(shù)據(jù)庫(kù),發(fā)展到現(xiàn)在的SQL(Structur

2、ed Query Language)、Oracal等高級(jí)數(shù)據(jù)庫(kù)。17.1.1 數(shù)據(jù)庫(kù)介紹首先從數(shù)據(jù)庫(kù)的介紹上來看一下什么是數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的基本結(jié)構(gòu)分三個(gè)層次,反映了觀察數(shù)據(jù)庫(kù)的三種不同角度。物理數(shù)據(jù)層是數(shù)據(jù)庫(kù)的最內(nèi)層,是物理存貯設(shè)備上實(shí)際存儲(chǔ)的數(shù)據(jù)的集合。這些數(shù)據(jù)是原始數(shù)據(jù),同時(shí)也是加工的對(duì)象,由內(nèi)部模式描述的指令操作處理的位串、字符和字組成。概念數(shù)據(jù)層是數(shù)據(jù)庫(kù)的中間一層,是數(shù)據(jù)庫(kù)的整體邏輯表示,指出了每個(gè)數(shù)據(jù)的邏輯定義及數(shù)據(jù)間的邏輯聯(lián)系,是保存記錄的集合。它所涉及的是數(shù)據(jù)庫(kù)所有對(duì)象的邏輯關(guān)系,不是它們的物理情況,而是數(shù)據(jù)庫(kù)管理員概念下的數(shù)據(jù)庫(kù)。邏輯數(shù)據(jù)層是用戶所看到和使用的數(shù)據(jù)庫(kù),表示了一個(gè)

3、或一些特定用戶使用的數(shù)據(jù)集合,即邏輯記錄的集合。17.1.2 數(shù)據(jù)庫(kù)應(yīng)用架構(gòu)數(shù)據(jù)庫(kù)應(yīng)用架構(gòu)包括兩種不同形式的數(shù)據(jù)庫(kù)應(yīng)用程序架構(gòu)模型,主要包括C/S兩層結(jié)構(gòu)的與三層(或多層)結(jié)構(gòu)的兩種。兩層結(jié)構(gòu)數(shù)據(jù)庫(kù)應(yīng)用架構(gòu)模型的特點(diǎn)是所有的用戶輸入、驗(yàn)證以及數(shù)據(jù)訪問的功能都位于客戶端中,一般來說客戶端只適用于某一種特定的數(shù)據(jù)庫(kù)??蛻舳伺c數(shù)據(jù)庫(kù)服務(wù)器二者之間一般使用專用的協(xié)議進(jìn)行聯(lián)接,也有的情況是使用通用的數(shù)據(jù)庫(kù)聯(lián)接,如JDBC、ODBC等。但是使用兩層結(jié)構(gòu)數(shù)據(jù)庫(kù)也是存在很大缺點(diǎn)的??蛻舳伺c數(shù)據(jù)庫(kù)服務(wù)器之間直接耦合,依賴度很高,無論哪邊發(fā)生變化,都會(huì)直接影響到另一邊。任何一種數(shù)據(jù)庫(kù)服務(wù)器能夠支持的聯(lián)接數(shù)都是很有

4、限的,如果客戶端很多,而又讓每個(gè)客戶端獨(dú)自占用一個(gè)數(shù)據(jù)庫(kù)聯(lián)接不利于提高數(shù)據(jù)庫(kù)的利用效率,也有可能造成其他用戶不能正常使用數(shù)據(jù)庫(kù)。提示:在現(xiàn)在的開發(fā)中,已經(jīng)很少使用兩層結(jié)構(gòu)的數(shù)據(jù)庫(kù)應(yīng)用模型了,而都是使用更加優(yōu)越的三層結(jié)構(gòu)數(shù)據(jù)庫(kù)應(yīng)用模型。三層結(jié)構(gòu)的數(shù)據(jù)庫(kù)應(yīng)用模型的特點(diǎn)主要是,客戶端與數(shù)據(jù)庫(kù)之間不直接耦合,而是通過中間層應(yīng)用服務(wù)器進(jìn)行耦合,當(dāng)客戶端或數(shù)據(jù)庫(kù)需要發(fā)生變化時(shí)可以通過中間層隔離變化,減小影響。一般情況下在三層結(jié)構(gòu)中,客戶端軟件都由通用的瀏覽器來?yè)?dān)任,這樣在對(duì)應(yīng)用進(jìn)行部署時(shí)就省去了為每臺(tái)機(jī)器安裝專用客戶端的麻煩。同時(shí),當(dāng)開發(fā)了新的應(yīng)用后,客戶端機(jī)器也不需要做任何改變,打開瀏覽器瀏覽的自然就是

5、新的功能了。根據(jù)需要,中間層的應(yīng)用服務(wù)器可以同時(shí)連接幾個(gè)同構(gòu)或異構(gòu)的數(shù)據(jù)庫(kù)服務(wù)器,而這些在客戶端的使用者是感覺不到也不用關(guān)心的。每個(gè)客戶端不必獨(dú)占一個(gè)數(shù)據(jù)庫(kù)連接,可以大大提高數(shù)據(jù)庫(kù)連接與數(shù)據(jù)庫(kù)的利用效率。17.1.3 數(shù)據(jù)庫(kù)模型數(shù)據(jù)庫(kù)又可以從基于不同的模型來分類,可以分為層次型數(shù)據(jù)庫(kù)、網(wǎng)狀型數(shù)據(jù)庫(kù)、關(guān)系型數(shù)據(jù)庫(kù)、面向?qū)ο笮蛿?shù)據(jù)庫(kù)。層次型數(shù)據(jù)庫(kù)是一組通過鏈接而互相聯(lián)系在一起的記錄。樹結(jié)構(gòu)圖是層次型數(shù)據(jù)庫(kù)的模式。層次模型的特點(diǎn)是記錄之間的聯(lián)系是通過指針實(shí)現(xiàn),表示的是對(duì)象的聯(lián)系。其缺點(diǎn)是無法反映多對(duì)象的聯(lián)系,并且由于層次順序的嚴(yán)格和復(fù)雜,導(dǎo)致數(shù)據(jù)的查詢和更新操作復(fù)雜,因此應(yīng)用程序的編寫也比較復(fù)雜。網(wǎng)

6、狀數(shù)據(jù)庫(kù)是基于網(wǎng)絡(luò)模型建立的數(shù)據(jù)庫(kù)。網(wǎng)絡(luò)模型,是使用網(wǎng)格結(jié)構(gòu)表示實(shí)體類型、實(shí)體間聯(lián)系的數(shù)據(jù)模型。網(wǎng)狀模型的特點(diǎn)是記錄之間的聯(lián)系通過指針實(shí)現(xiàn),多對(duì)多的聯(lián)系容易實(shí)現(xiàn)。缺點(diǎn)是編寫應(yīng)用程序比較復(fù)雜,程序員必須熟悉數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)。關(guān)系數(shù)據(jù)庫(kù)是基于關(guān)系模型建立的數(shù)據(jù)庫(kù)。關(guān)系模型由一系列表格組成,用表格來表達(dá)數(shù)據(jù)集,用外鍵(關(guān)系)來表達(dá)數(shù)據(jù)集之間的聯(lián)系。現(xiàn)在應(yīng)用最常見的就是關(guān)系數(shù)據(jù)庫(kù),在下一節(jié)也主要來介紹一下關(guān)系數(shù)據(jù)庫(kù)。提示:關(guān)系數(shù)據(jù)庫(kù)是使用最廣泛的數(shù)據(jù)庫(kù)。對(duì)象型數(shù)據(jù)庫(kù)是建立在面向?qū)ο竽P突A(chǔ)之上。面向?qū)ο竽P椭凶罨镜母拍钍菍?duì)象和類。對(duì)象是現(xiàn)實(shí)世界中實(shí)體的模型化,共享同一屬性集和方法集的所有對(duì)象構(gòu)成一個(gè)

7、類。類可以有嵌套結(jié)構(gòu)。系統(tǒng)中的所有類組成一個(gè)有根、有向無環(huán)圖,稱為類層次。17.2 JDBC數(shù)據(jù)庫(kù)編程介紹JDBC就是Java DataBase Connectivity,Java數(shù)據(jù)庫(kù)連接。JDBC主要完成下面幾個(gè)任務(wù)。與數(shù)據(jù)庫(kù)建立一個(gè)連接。向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。處理數(shù)據(jù)庫(kù)返回的結(jié)果。實(shí)用Java程序語(yǔ)言和JDBC工具包開發(fā)程序,是獨(dú)立于平臺(tái)和廠商的。JDBC就是將Java程序語(yǔ)言編寫出來的程序,與數(shù)據(jù)庫(kù)相連接。接下來,將詳細(xì)講述如何利用JDBC為程序連接數(shù)據(jù)庫(kù)。17.2.1 JDBC和ODBC的關(guān)系在JDBC數(shù)據(jù)庫(kù)編程中經(jīng)常要使用ODBC。所以,在講述JDBC的驅(qū)動(dòng)程序分類之前,首先介紹

8、什么是ODBC。ODBC是指Open DataBase Connectivity,即開放數(shù)據(jù)庫(kù)互連,它建立了一組規(guī)范,并且提供了一組對(duì)數(shù)據(jù)庫(kù)訪問的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口),這些API利用SQL來完成其大部分任務(wù)。ODBC也提供了對(duì)SQL的支持。JDBC驅(qū)動(dòng)程序由實(shí)施了這些接口的類組成,JDBC的總體結(jié)構(gòu)有四個(gè)組件:應(yīng)用程序、驅(qū)動(dòng)程序管理器、驅(qū)動(dòng)程序和數(shù)據(jù)源。將JDBC轉(zhuǎn)換成ODBC驅(qū)動(dòng)器,依靠ODBC驅(qū)動(dòng)器和數(shù)據(jù)庫(kù)通信。在這種方式下,ODBC驅(qū)動(dòng)程序和橋代碼必須出現(xiàn)在用戶的每臺(tái)機(jī)器中,這種類型的驅(qū)動(dòng)程序最適合于企業(yè)網(wǎng)(這種網(wǎng)絡(luò)上客戶機(jī)的安裝不是主要問題),或者是用Java編寫的三層結(jié)構(gòu)的

9、應(yīng)用程序服務(wù)器代碼。本地API一部分用Java來編寫的驅(qū)動(dòng)程序。這種類型的驅(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ī)上。JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無關(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)程序。所有這種解決方案的提供者,都提供適合于Intranet用的產(chǎn)品。為了使這些

10、產(chǎn)品支持Internet,它們必須處理Web所提出的安全性、通過防火墻的訪問等額外要求,幾家提供者正將JDBC驅(qū)動(dòng)程序,加到他們現(xiàn)有的數(shù)據(jù)庫(kù)中間件產(chǎn)品中。本地協(xié)議純Java驅(qū)動(dòng)程序類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議,這將允許從客戶機(jī)機(jī)器上直接調(diào)用DBMS服務(wù)器,是Intranet訪問的一個(gè)很實(shí)用的解決方法。由于許多這樣的協(xié)議都是專用的,因此數(shù)據(jù)庫(kù)提供者自己將是主要來源。17.2.2 為什么使用JDBC數(shù)據(jù)庫(kù)編程目前市面上有很多種數(shù)據(jù)庫(kù),例如Oracle、Sybase、MS SQL Server和MS Access等數(shù)據(jù)庫(kù)。有些讀者就會(huì)認(rèn)為這些多數(shù)據(jù)庫(kù),這里要學(xué)習(xí)數(shù)據(jù)

11、庫(kù)編程,是不是就要學(xué)習(xí)對(duì)應(yīng)每一種數(shù)據(jù)庫(kù)的編程方法呢。在JDBC之前是這樣的,但是有了JDBC后,就變的非常容易。使用JDBC在數(shù)據(jù)庫(kù)編程中將起到非常重要的作用。首先程序員可以使用Java開發(fā)基于數(shù)據(jù)庫(kù)的應(yīng)用程序,在遵守Java語(yǔ)言規(guī)則的同時(shí),可以使用標(biāo)準(zhǔn)的SQL語(yǔ)句訪問任何數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)廠商提供較低層的驅(qū)動(dòng)程序,程序員可以在自己的軟件中,使用比較優(yōu)化的驅(qū)動(dòng)程序。很多數(shù)據(jù)庫(kù)系統(tǒng)帶有JDBC驅(qū)動(dòng)程序,Java程序就通過JDBC驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)相連,執(zhí)行查詢、提取數(shù)據(jù)等操作。Sun公司還開發(fā)了JDBC-ODBC bridge,用此技術(shù),Java程序就可以訪問帶有ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)。目前,大

12、多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)都帶有ODBC驅(qū)動(dòng)程序,所以,Java程序能訪問諸如Oracle、Sybase、MS SQL Server和MS Access等數(shù)據(jù)庫(kù)。17.3 SQL數(shù)據(jù)庫(kù)操作技術(shù)在Java中進(jìn)行數(shù)據(jù)庫(kù)操作,除了需要JDBC編程外,還需要一個(gè)數(shù)據(jù)庫(kù)的技術(shù),那就是SQL技術(shù)。SQL技術(shù)是專門的,直接的對(duì)數(shù)據(jù)庫(kù)操作的技術(shù)。17.3.1 什么是SQLSQL是Structured Query Language的縮寫,Structured Query Language翻譯過來叫做結(jié)構(gòu)化查詢語(yǔ)言。SQL是一種專門用來與數(shù)據(jù)庫(kù)通信的語(yǔ)言。與其他語(yǔ)言(如Java、Visual Basic這樣的程序設(shè)計(jì)語(yǔ)言)不

13、一樣,SQL由很少的詞構(gòu)成,這是有意而為的。SQL能夠很好地完成一項(xiàng)任務(wù)提供一種從數(shù)據(jù)庫(kù)中讀寫數(shù)據(jù)的簡(jiǎn)單有效的方法。SQL是存在很多優(yōu)點(diǎn)的,從整體的角度來說SQL有如下的優(yōu)點(diǎn)。首先SQL不是某個(gè)特定數(shù)據(jù)庫(kù)供應(yīng)商專有的語(yǔ)言,幾乎所有重要的DBMS都支持SQL,所以,此語(yǔ)言幾乎能與所有數(shù)據(jù)庫(kù)打交道。然后就是SQL簡(jiǎn)單易學(xué)。它的語(yǔ)句全都是由具有很強(qiáng)描述性的英語(yǔ)單詞組成,而且這些單詞的數(shù)目不多,這個(gè)就是它簡(jiǎn)單易學(xué)的主要原因。最后SQL看上去盡管很簡(jiǎn)單,但實(shí)際上是一種強(qiáng)有力的語(yǔ)言,靈活使用其語(yǔ)言元素,可以進(jìn)行非常復(fù)雜和高級(jí)的數(shù)據(jù)庫(kù)操作。17.3.2 如何進(jìn)行SQL操作使用SQL能夠完成數(shù)據(jù)庫(kù)的創(chuàng)建、添加

14、、刪除、修改、查詢等操作。在本節(jié)中就來簡(jiǎn)單的學(xué)習(xí)一下如何進(jìn)行SQL操作。查詢操作是數(shù)據(jù)庫(kù)操作中最常見的操作。在SQL中,使用Select語(yǔ)句可在需要的表單中檢索數(shù)據(jù),在進(jìn)行檢索之前,必須知道需要的數(shù)據(jù)存儲(chǔ)在哪里,Select語(yǔ)句可由多個(gè)查詢子句組成。查詢操作的基本結(jié)構(gòu)如下所示。Select all|distinct into new_table_name From 表名|視圖名where 搜索條件Group by 把查到的按什么標(biāo)準(zhǔn)分組having 搜索條件order by 按什么順序排序升序|降序在查詢操作的基本結(jié)構(gòu)中,all是指明查詢結(jié)果中可以顯示值相同的列,同時(shí)all是系統(tǒng)默認(rèn)值。dis

15、tinct是指明查詢結(jié)果中如有值相同的列,只顯示其中的一列,對(duì)distinct來說,NULL被認(rèn)為相同的值。into子句用于把查詢結(jié)果存放到一個(gè)新建表中。注意:o句式不能與compute子句一起使用。新表是由select子句指定的列構(gòu)成。From子句指定需要進(jìn)行數(shù)據(jù)查詢的表。where子句指定數(shù)據(jù)檢索的條件,以限制返回的數(shù)據(jù)。Group by子句指定查詢結(jié)果的分組條件。having子句指定分組搜索條件,它通常與Group by子句一起使用。order by子句指定查詢結(jié)果的排序方式。除了查詢操作外,還有其他操作。數(shù)據(jù)插入語(yǔ)句如下:數(shù)據(jù)插入:insert into 列名val

16、ue對(duì)應(yīng)列的值數(shù)據(jù)修改語(yǔ)句如下:數(shù)據(jù)修改:update setwhere數(shù)據(jù)刪除語(yǔ)句如下:數(shù)據(jù)刪除:delete from表名|視圖名where 子句17.4 創(chuàng)建數(shù)據(jù)庫(kù)在前面的學(xué)習(xí)中已經(jīng)對(duì)數(shù)據(jù)庫(kù)編程的基本知識(shí)有了一些基本介紹。在學(xué)習(xí)在Java中進(jìn)行數(shù)據(jù)庫(kù)操作之前,首先來學(xué)習(xí)一下如何創(chuàng)建數(shù)據(jù)庫(kù)。這里以Access數(shù)據(jù)庫(kù)和SQLServer數(shù)據(jù)庫(kù)為例。17.4.1 創(chuàng)建Access數(shù)據(jù)庫(kù)學(xué)習(xí)如何使用JDBC進(jìn)行數(shù)據(jù)庫(kù)開發(fā)之前,首先需要建立一個(gè)數(shù)據(jù)庫(kù)。本節(jié)使用的是非常簡(jiǎn)單易用的Access創(chuàng)建的數(shù)據(jù)庫(kù)。例如創(chuàng)建一個(gè)記錄學(xué)生信息的數(shù)據(jù)庫(kù),如表所示。17.5 JDBC編程步驟前面四節(jié)的介紹,都是進(jìn)行J

17、DBC數(shù)據(jù)庫(kù)編程的基礎(chǔ)。在本節(jié)就來對(duì)如何進(jìn)行JDBC編程進(jìn)行詳細(xì)的講解。JDBC編程是有嚴(yán)格的步驟的,在該節(jié)來就一步一步的學(xué)習(xí)如何進(jìn)行JDBC數(shù)據(jù)庫(kù)編程。從前面的介紹中可以看出,在使用JDBC連接特定的數(shù)據(jù)庫(kù)之前首先要加載相應(yīng)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)類,本小節(jié)將向讀者介紹如何在開發(fā)中加載各種數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)類。下面的代碼片段說明了如何加載特定數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)類。1try23/通過Class類的forName方法加載指定的JDBC驅(qū)動(dòng)類4Class.forName(驅(qū)動(dòng)類全稱類名);56catch(java.lang.ClassNotFoundException e)78e.printSta

18、ckTrace();917.5.3 建立數(shù)據(jù)庫(kù)連接加載驅(qū)動(dòng)程序后,就可以進(jìn)行建立數(shù)據(jù)庫(kù)連接。建立數(shù)據(jù)連接是通過調(diào)用java.sql.DriverManager類的getConnection方法來建立的,下面對(duì)該方法進(jìn)行介紹。public static Connection getConnection(String url, String user, String password) throws SQLException參數(shù)url為指定數(shù)據(jù)庫(kù)的連接字符串,參數(shù)user為要連接數(shù)據(jù)庫(kù)的用戶名,參數(shù)password為用戶名對(duì)應(yīng)的密碼。如果沒有用戶名與密碼,可以用兩個(gè)空字符串來代替。此方法有可能拋出

19、捕獲異常java.sql.SQLException,因此在調(diào)用此方法時(shí)必須進(jìn)行異常處理。指定數(shù)據(jù)庫(kù)的連接字符串由三部分組成,各部分之間用“:”分隔,如下所列。jdbc:子協(xié)議指的是數(shù)據(jù)庫(kù)的類型,例如可以是odbc,mysql或oracle等。子名稱指的是數(shù)據(jù)源的名稱或數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)標(biāo)識(shí)字符串。例如,下面的代碼片段以連接前面創(chuàng)建的ODBC數(shù)據(jù)源student為例,說明了如何獲取與關(guān)閉數(shù)據(jù)庫(kù)連接。1/聲明連接引用2Connection con=null;3/創(chuàng)建數(shù)據(jù)庫(kù)連接字符串4String url=”jdbc:odbc:student”;5try67/創(chuàng)建數(shù)據(jù)庫(kù)連接8con=DriverManag

20、er.getConnection(url;,);9/連接以后操作數(shù)據(jù)庫(kù)的代碼1011catch(java.sql.SQLException e)1213e.printStackTrace();14上述代碼中第8行通過DriverManager類的getConnection方法獲取了數(shù)據(jù)庫(kù)連接,在該程序url中給出的子協(xié)議為odbc,數(shù)據(jù)源為前面所建立的student數(shù)據(jù)源。17.5.4 進(jìn)行數(shù)據(jù)庫(kù)操作在上一節(jié)中講解了如何建立數(shù)據(jù)庫(kù)連接,當(dāng)成功地創(chuàng)建了數(shù)據(jù)庫(kù)連接后,就可以使用連接對(duì)象提供的createStatement方法來進(jìn)行數(shù)據(jù)庫(kù)操作,這里的數(shù)據(jù)庫(kù)操作是通過SQL語(yǔ)句來完成的,下面給出了該方

21、法的簽名。public Statement createStatement() throws SQLException創(chuàng)建了語(yǔ)句對(duì)象后就可以調(diào)用語(yǔ)句對(duì)象的executeUpdate方法來執(zhí)行對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新的語(yǔ)句了,下面給出了該方法的簽名:public int executeUpdate(String sql) throws SQLException參數(shù)sql為要執(zhí)行的sql語(yǔ)句對(duì)應(yīng)的文本字符串,如“insert into student values(200801,Tom,23,123456789);”。該方法返回值表示成功地操作了多少條數(shù)據(jù)庫(kù)記錄。同樣該方法也是可以發(fā)生異常的,所以也需要進(jìn)

22、行異常處理。 例如,下面的代碼片段說明了如何創(chuàng)建語(yǔ)句對(duì)象與執(zhí)行更新數(shù)據(jù)庫(kù)的SQL語(yǔ)句。1try23/獲取Statement對(duì)象4Statement stat=con.createStatement();/con為一個(gè)指向Connection對(duì)象的引用7/插入一條記錄8stat.executeUpdate(insert into student values(200801,Tom, 23,123456789););9/關(guān)閉語(yǔ)句對(duì)象10stat.close();1112catch(java.sql.SQLException e)1314e.printStackTrace();15在該程序中首先是使

23、用createStatement方法創(chuàng)建了一個(gè)Statement對(duì)象,然后使用創(chuàng)建后的Statement對(duì)象調(diào)用executeUpdate方法來對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。executeUpdate方法的參數(shù)為一個(gè)SQL參數(shù),將按照該SQL進(jìn)行數(shù)據(jù)庫(kù)操作。17.5.5 獲取數(shù)據(jù)庫(kù)中信息在上一小節(jié)中學(xué)習(xí)了如何進(jìn)行數(shù)據(jù)庫(kù)操作,并進(jìn)行了如何向數(shù)據(jù)庫(kù)中插入記錄。有時(shí)候經(jīng)常需要來判斷是否插入成功,這時(shí)候就需要來獲取數(shù)據(jù)庫(kù)中的信息。獲取數(shù)據(jù)庫(kù)中的信息是通過調(diào)用Statement對(duì)象的executeQuery方法來執(zhí)行查詢數(shù)據(jù)庫(kù)的SQL語(yǔ)句。public ResultSet executeQuery(String s

24、ql) throws SQLException參數(shù)sql為要執(zhí)行的SQL查詢語(yǔ)句,例如“select * from student”,返回值為ResultSet類型的對(duì)象引用。ResultSet類型的對(duì)象中封裝了查詢的結(jié)果,可以調(diào)用其next方法移動(dòng)指向結(jié)果集中記錄的游標(biāo),下面給出了該方法的簽名:public boolean next() throws SQLException該方法是獲取數(shù)據(jù)庫(kù)信息的最重要的方法。同時(shí),ResultSet中還提供了很多獲取當(dāng)前記錄指定字段值的getXxx方法,如表17-2所列。在所有的getXxx方法中都有兩個(gè)重載的方法,其中一個(gè)接收int類型的參數(shù),參數(shù)值為

25、要獲取值的字段對(duì)應(yīng)的列索引,例如“getString(1)”將返回第一列的字符串內(nèi)容。另一個(gè)接收String類型的參數(shù),參數(shù)值為要獲取值的字段對(duì)應(yīng)的列名稱,例如“getString(sid)”將獲取sid列的字符串內(nèi)容,并且所有的getXxx方法都有可能拋出java.sql.SQLException捕獲異常,因此在調(diào)用時(shí)要進(jìn)行異常處理。17.6 事務(wù)處理對(duì)數(shù)據(jù)庫(kù)進(jìn)行并發(fā)操作時(shí),為了避免由于并發(fā)操作帶來的問題,一般要將同一個(gè)任務(wù)中對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查操作編寫到一個(gè)事務(wù)中,同一個(gè)事務(wù)中的所有操作要么全部執(zhí)行成功,要么都不執(zhí)行。因此JDBC也提供了對(duì)事務(wù)開發(fā)的支持,本節(jié)將向讀者介紹JDBC中有關(guān)

26、事務(wù)開發(fā)的知識(shí)。17.6.1 事務(wù)介紹事物是SQL中的單個(gè)邏輯工作單元,一個(gè)事務(wù)內(nèi)的所有語(yǔ)句被作為整體執(zhí)行,遇到錯(cuò)誤時(shí),可以回滾事務(wù),取消事務(wù)所作的所有改變,從而可以保證數(shù)據(jù)庫(kù)的一致性和可恢復(fù)性。一個(gè)事務(wù)邏輯工作單元必須具有以下四種屬性,包括原子性、一致性、隔離性和永久性。原子性是指一個(gè)事務(wù)必須作為一個(gè)原子單位,它所作的數(shù)據(jù)修改操作要不全部執(zhí)行,要不全部取消。一致性是指當(dāng)事務(wù)完成后,數(shù)據(jù)必須保證處于一致性的狀態(tài)。隔離是指一個(gè)事務(wù)所作的修改必須能夠跟其他事務(wù)所作的修改分離開來,以免在并發(fā)處理時(shí),發(fā)生數(shù)據(jù)錯(cuò)誤。永久性是指事務(wù)完成后,它對(duì)數(shù)據(jù)庫(kù)所作的修改應(yīng)該被永久保持。進(jìn)行事務(wù)操作主要使用Conne

溫馨提示

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