Java大學(xué)實(shí)用教程 第12章 Java數(shù)據(jù)庫(kù)操作_第1頁(yè)
Java大學(xué)實(shí)用教程 第12章 Java數(shù)據(jù)庫(kù)操作_第2頁(yè)
Java大學(xué)實(shí)用教程 第12章 Java數(shù)據(jù)庫(kù)操作_第3頁(yè)
Java大學(xué)實(shí)用教程 第12章 Java數(shù)據(jù)庫(kù)操作_第4頁(yè)
Java大學(xué)實(shí)用教程 第12章 Java數(shù)據(jù)庫(kù)操作_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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章章 Java 數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù)操作 本章導(dǎo)讀本章導(dǎo)讀nJDBC簡(jiǎn)介簡(jiǎn)介nMicrosoft Access 數(shù)據(jù)庫(kù)nJDBC-ODBC橋接器n查詢(xún)操作n更新、插入與刪除操作n用結(jié)果集更新表nCachedRowSetImpl類(lèi)n預(yù)處理語(yǔ)句與事務(wù)n批處理nSQL Server 2000數(shù)據(jù)庫(kù)n使用純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序112.1 JDBC簡(jiǎn)介 JDBC(Java DataBase Connectivity)是Java運(yùn)行平臺(tái)的核心類(lèi)庫(kù)中的一部分,提供了訪問(wèn)數(shù)據(jù)庫(kù)的API,它由一些Java類(lèi)和接口組成。 在Java中可以使用JDBC實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中表記錄的查詢(xún)、修改和刪除等操作。JDBC技術(shù)

2、在數(shù)據(jù)庫(kù)開(kāi)發(fā)中占有很重要的地位,JDBC操作不同的數(shù)據(jù)庫(kù)僅僅是連接方式上的差異而已,使用JDBC的應(yīng)用程序一旦和數(shù)據(jù)庫(kù)建立連接,就可以使用JDBC提供的API操作數(shù)據(jù)庫(kù),如圖12.1所示。 我們經(jīng)常使用JDBC進(jìn)行如下的操作: 與一個(gè)數(shù)據(jù)庫(kù)建立連接。 向已連接的數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。 處理SQL語(yǔ)句返回的結(jié)果。2圖12.1312.2 Microsoft Access數(shù)據(jù)庫(kù)_1建立數(shù)據(jù)庫(kù) Microsoft Access是常用的一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)之一,具有速度快、使用方便等特點(diǎn)。 表是關(guān)系型數(shù)據(jù)庫(kù)的基本單位,本節(jié)簡(jiǎn)單介紹怎樣使用Microsoft Access數(shù)據(jù)庫(kù)管理系統(tǒng)創(chuàng)建數(shù)據(jù)庫(kù)和在數(shù)據(jù)庫(kù)中

3、創(chuàng)建表。 1. 建立數(shù)據(jù)庫(kù) 單擊Window 2000/XP系統(tǒng)桌面上的“開(kāi)始” “所有程序” “Microsoft Access”啟動(dòng)數(shù)據(jù)庫(kù)管理系統(tǒng)。然后選擇新建數(shù)據(jù)庫(kù),如圖12.2所示。將新建的數(shù)據(jù)庫(kù)命名為student.mdb,并保存到D:ch12目錄中。 412.2 Microsoft Access數(shù)據(jù)庫(kù)_2 創(chuàng)建表 創(chuàng)建好數(shù)據(jù)庫(kù)后,就可以在該數(shù)據(jù)庫(kù)下建立若干個(gè)表。我們準(zhǔn)備在student.mdb數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)中創(chuàng)建名字為message的表的表。打開(kāi)student.mdb數(shù)據(jù)庫(kù),在選擇界面上選擇“使用設(shè)計(jì)器創(chuàng)建表”后,單擊“設(shè)計(jì)”,將出現(xiàn)創(chuàng)建表的界面,如圖12.3所示。 message表

4、的字段(屬性)為:number(文本),name(文本),birthday(日期/時(shí)間),height(數(shù)字,雙精度)。其中,number字段為主鍵(在該字段上單擊鼠標(biāo)右鍵,將number設(shè)置為主鍵)。打開(kāi)創(chuàng)建的message表,錄入記錄,如圖12.4所示。512.3 JDBC-ODBC橋接器 本節(jié)介紹JDBCODBCJDBCODBC橋接器連接方式橋接器連接方式。 使用JDBCODBC橋接器方式的機(jī)制是,應(yīng)用程序只需建立JDBC和ODBC之間的連接,而和數(shù)據(jù)庫(kù)的連接由ODBC去完成。 JDBCODBC橋接器的優(yōu)點(diǎn)是優(yōu)點(diǎn)是:JDBC有能力訪問(wèn)幾乎所有類(lèi)型的數(shù)據(jù)庫(kù)。缺點(diǎn)是缺點(diǎn)是移植性較差,應(yīng)用程序

5、所駐留的計(jì)算機(jī)必須提供ODBC。 應(yīng)用程序負(fù)責(zé)使用JDBC提供的API建立JDBCODBC橋接器,然后應(yīng)用程序就可以請(qǐng)求和數(shù)據(jù)庫(kù)建立連接,連接工作由ODBC完成。 需要強(qiáng)調(diào)是,ODBC使用“數(shù)據(jù)源”來(lái)管理數(shù)據(jù)庫(kù),所以必須事先將某個(gè)數(shù)據(jù)庫(kù)設(shè)置成ODBC所管理的一個(gè)數(shù)據(jù)源,應(yīng)用程序只能請(qǐng)求和ODBC管理的數(shù)據(jù)源建立連接。使用JDBCODBC橋接器方式和數(shù)據(jù)庫(kù)建立連接如圖圖12.512.5所示所示。 以下詳細(xì)講解Java應(yīng)用程序使用JDBCODBC橋接器訪問(wèn)數(shù)據(jù)庫(kù)的3個(gè)步驟: 建立JDBC-ODBC橋接器 創(chuàng)建ODBC數(shù)據(jù)源 和ODBC數(shù)據(jù)源建立連接 以下假設(shè)應(yīng)用程序所在的計(jì)算機(jī)要訪問(wèn)本地?cái)?shù)據(jù)庫(kù)st

6、udent.mdb,即我們?cè)?2.2中建立的數(shù)據(jù)庫(kù)。6圖12.57Java應(yīng)用程序使用應(yīng)用程序使用JDBCODBC橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟1 1 1 1建立建立JDBC-ODBCJDBC-ODBC橋接器橋接器 JDBC使用java.lang包中的ClassClass類(lèi)類(lèi)建立JDBC-ODBC橋接器。Class類(lèi)通過(guò)調(diào)用它的靜態(tài)方法forName加載sun.jdbc.odbc包中的JdbcOdbcDriver類(lèi)建立JDBC-ODBC橋接器。建立橋接器時(shí)可能發(fā)生異常,必須捕獲這個(gè)異常,建立橋接器的代碼是:try Class.forName(sun.jdbc.odbc.JdbcO

7、dbcDriver);try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e)catch(ClassNotFoundException e) System.out.println(e); System.out.println(e); 8Java應(yīng)用程序使用應(yīng)用程序使用JDBCODBC橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟2 2 2 2ODBCODBC數(shù)據(jù)源數(shù)據(jù)源 應(yīng)用程序所在的計(jì)算機(jī)負(fù)責(zé)創(chuàng)建數(shù)據(jù)源,即將本地或遠(yuǎn)程計(jì)算機(jī)上的數(shù)據(jù)庫(kù)設(shè)置成自己要訪問(wèn)的數(shù)據(jù)源。因此,必須保證應(yīng)用程序所在計(jì)算機(jī)

8、有ODBC系統(tǒng)(Widow2000和Window/XP都有ODBC系統(tǒng))。(1 1)創(chuàng)建、修改或刪除數(shù)據(jù)源)創(chuàng)建、修改或刪除數(shù)據(jù)源 選擇“控制面板”“管理工具”“ODBC數(shù)據(jù)源”,雙擊ODBC數(shù)據(jù)源圖標(biāo),出現(xiàn)如圖12.6所示界面。(2 2) 選擇驅(qū)動(dòng)程序選擇驅(qū)動(dòng)程序 在圖12.6所示的界面上選擇單擊“添加”按鈕,如圖12.7所示。選擇“Microsoft Access Driver(*.mdb)。(3 3)數(shù)據(jù)源名稱(chēng))數(shù)據(jù)源名稱(chēng) 在圖12.7界面單擊“完成”按鈕將出現(xiàn)設(shè)置數(shù)據(jù)源具體項(xiàng)目的對(duì)話(huà)框,如圖12.8所示。在名稱(chēng)欄里為數(shù)據(jù)源起一個(gè)你自己喜歡的名稱(chēng),這里我們起的名稱(chēng)是hello。在“數(shù)據(jù)庫(kù)

9、選擇”欄中選擇一個(gè)數(shù)據(jù)庫(kù)。9圖12.6,圖12.7,圖12.810Java應(yīng)用程序使用應(yīng)用程序使用JDBCODBC橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟3 3 3 3連接數(shù)據(jù)源連接數(shù)據(jù)源 現(xiàn)在我們有了一個(gè)數(shù)據(jù)源hello,這個(gè)數(shù)據(jù)源就是數(shù)據(jù)庫(kù)student.mdb。編寫(xiě)連接數(shù)據(jù)庫(kù)代碼不會(huì)出現(xiàn)數(shù)據(jù)庫(kù)的名稱(chēng),只能出現(xiàn)數(shù)據(jù)源的名字。首先首先使用java.sql包中的ConnectionConnection類(lèi)類(lèi)聲明一個(gè)對(duì)象,然后再使用類(lèi)類(lèi)DriverManagerDriverManager調(diào)用它的靜態(tài)方法靜態(tài)方法getConnectiongetConnection創(chuàng)建這個(gè)連接對(duì)象: Connec

10、tion Connection concon=DriverManager.getConnection(jdbc:odbc:=DriverManager.getConnection(jdbc:odbc:數(shù)據(jù)源名字?jǐn)?shù)據(jù)源名字, login name, password ); login name, password ); 對(duì)于Access數(shù)據(jù)庫(kù),不必為數(shù)據(jù)源設(shè)置login name 和password,那么連接形式是:Connection Connection concon=DriverManager. getConnection(jdbc:odbc:=DriverManager. getConn

11、ection(jdbc:odbc:數(shù)據(jù)源名字?jǐn)?shù)據(jù)源名字, ,);, ,); 為了能和數(shù)據(jù)源hello交換數(shù)據(jù),建立ConnectionConnection對(duì)象對(duì)象如下,建立連接時(shí)應(yīng)捕獲SQLException異常:try Connection try Connection concon=DriverManager.getConnection(jdbc:odbc:hello, ,);=DriverManager.getConnection(jdbc:odbc:hello, ,); catch(SQLException e)catch(SQLException e) 這樣就和數(shù)據(jù)源hello建立了

12、連接。應(yīng)用程序一旦和某個(gè)數(shù)據(jù)源建立連接,就可以通過(guò)SQL語(yǔ)句和該數(shù)據(jù)源所指定的數(shù)據(jù)庫(kù)中的表交互信息,比如查詢(xún)、修改、更新表中的記錄。1112.4 查詢(xún)操作_1查詢(xún)操作步驟1 1向數(shù)據(jù)庫(kù)發(fā)送向數(shù)據(jù)庫(kù)發(fā)送SQLSQL查詢(xún)語(yǔ)句查詢(xún)語(yǔ)句 首先使用Statement聲明一個(gè)SQL語(yǔ)句對(duì)象,然后讓已創(chuàng)建的連接對(duì)象con調(diào)用方法createStatment()創(chuàng)建這個(gè)SQL語(yǔ)句對(duì)象,代碼如下:try Statement sql=con.createStatement();try Statement sql=con.createStatement(); catch(SQLException e )catch(

13、SQLException e )2 2處理查詢(xún)結(jié)果處理查詢(xún)結(jié)果 有了SQL語(yǔ)句對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中表的查詢(xún)和修改,并將查詢(xún)結(jié)果存放在一個(gè)ResultSet類(lèi)聲明的對(duì)象中。也就是說(shuō)SQL查詢(xún)語(yǔ)句對(duì)數(shù)據(jù)庫(kù)的查詢(xún)操作將返回一個(gè)ResultSet對(duì)象,ResultSet對(duì)象是以 統(tǒng) 一 形 式 的 列 組 織 的 數(shù) 據(jù) 行 組 成 。 例 如 , 對(duì) 于R e s u l t S e t R e s u l t S e t rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message); F

14、ROM message);內(nèi)存的結(jié)果集對(duì)象rs的列數(shù)是4列,剛好和message的列數(shù)相同,第1列至第4列分別是“number”、“ n a m e ” “ b i r t h d y ” 和 “ h e i g h t ” 列 ; 而 對(duì) 于R e s u l t S e t R e s u l t S e t rs=sql.executeQuery(SELECT name,height FROM message);rs=sql.executeQuery(SELECT name,height FROM message);內(nèi)存的結(jié)果集對(duì)象rs列數(shù)只有兩列,第一列是“name”列、第2列是“he

15、ight”列。 ResultSet對(duì)象一次只能看到一個(gè)數(shù)據(jù)行,使用next()方法可以將游標(biāo)依次移動(dòng)到數(shù)據(jù)行,當(dāng)游標(biāo)移動(dòng)到某數(shù)據(jù)行后,ResultSet對(duì)象使用getXxx方法,并將位置索引(第一列使用1,第二列使用2等等)或列名傳遞給該方法的參數(shù),就可以獲得改數(shù)據(jù)行中相應(yīng)的列值。表表12.112.1給了出了ResultSet對(duì)象的若干方法。12表12.11312.4 查詢(xún)操作_2順序查詢(xún) 結(jié)果集ResultSet對(duì)象調(diào)用next()方法,可以順序查詢(xún)表中的記錄。結(jié)果集對(duì)象將游標(biāo)最初定位在第一行的前面,第一次調(diào)用next()方法使游標(biāo)移動(dòng)到第一行。next()方法返回一個(gè)boolean型數(shù)據(jù),

16、當(dāng)游標(biāo)移動(dòng)到最后一行之后返回false。 例例12-112-1中中,查詢(xún)數(shù)據(jù)庫(kù)student.mdb中message表里的全部記錄,每條記錄包含全部的字段值,效果如圖12.9所示。1412.4 查詢(xún)操作_3模糊查詢(xún) 可以用SQL語(yǔ)句操作符LIKE進(jìn)行模式般配,使用“%”表示零個(gè)或多個(gè)字符,用一個(gè)下劃線“_”表示任意一個(gè)字符,使用“若干字符”表示“若干字符”中的任意一個(gè)。比如,下述語(yǔ)句查詢(xún)字段name值以“張”為前綴的記錄: rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message WHERE name LIKE

17、 FROM message WHERE name LIKE 張張% );% );下述語(yǔ)句查詢(xún)字段name值以“張”或“李”為前綴的記錄: rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message WHERE name LIKE FROM message WHERE name LIKE 張李張李% );% );將例12-1中的 rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message); FROM message);修改為 sql

18、.executeQuery(SELECT sql.executeQuery(SELECT * * FROM message WHERE name Like FROM message WHERE name Like 張李張李%);%);后,程序的輸出結(jié)果如下:001,張三,1990-10-10,1.78002,李四,1989-09-09,1.671512.4 查詢(xún)操作_4排序查詢(xún) 可以在SQL語(yǔ)句中使用ORDER BY子語(yǔ)句,對(duì)記錄排序。例如,按height排序查詢(xún)的SQL語(yǔ)句:SELECT SELECT * * FROM message ORDER BY height FROM message

19、 ORDER BY height。 將例12-1中的 rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message); FROM message);修改為 sql.executeQuery(SELECT sql.executeQuery(SELECT * * FROM message ORDER BY height ); FROM message ORDER BY height );后,程序的輸出結(jié)果如下(按身高排序):003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.6500

20、2,002,李四李四,1989-09-09,1.67,1989-09-09,1.67001,001,張三張三,1990-10-10,1.78,1990-10-10,1.78004,004,孫小三孫小三,1989-12-12,1.86,1989-12-12,1.86 將例12-1中的rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message); FROM message);修改為sql.executeQuery(SELECT sql.executeQuery(SELECT * * FROM message ORDE

21、R BY birthday ); FROM message ORDER BY birthday );后,程序的輸出結(jié)果如下(按出生日期排序):002,002,李四李四,1989-09-09,1.67,1989-09-09,1.67004,004,孫小三孫小三,1989-12-12,1.86,1989-12-12,1.86001,001,張三張三,1990-10-10,1.78,1990-10-10,1.78003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.651612.4 查詢(xún)操作_5條件查詢(xún) 可以在SQL語(yǔ)句中使用WHERE子語(yǔ)句,進(jìn)行條件查詢(xún)。例如,S

22、QL語(yǔ)句:SELECT SELECT * * FROM message WHERE name = FROM message WHERE name = 張三張三查詢(xún)姓名是“張三”的記錄; SQL語(yǔ)句: SELECT SELECT * * FROM message WHERE DATEPART(yyyy,birthday)=1990 FROM message WHERE DATEPART(yyyy,birthday)=1990查詢(xún)1990年后出生的記錄。 將例12-1中的rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM m

23、essage); FROM message); 修改為rs=sql.executeQuery(SELECT rs=sql.executeQuery(SELECT * * FROM message WHERE FROM message WHERE DATEPART(yyyy,birthday)1990 DATEPART(yyyy,birthday)1990 ND height=1.65); ND height=1.65);后,程序的輸出結(jié)果如下:001,001,張三張三,1990-10-10,1.78,1990-10-10,1.78003,003,王小二王小二,1999-11-11,1.65,1

24、999-11-11,1.651712.4 查詢(xún)操作_6隨機(jī)查詢(xún) 有時(shí)候我們需要在結(jié)果集中前后移動(dòng)、或顯示結(jié)果集指定的一條記錄等等。這時(shí),我們必須要返回一個(gè)可滾動(dòng)的結(jié)果集。為了得到一個(gè)可滾動(dòng)的結(jié)果集,我們必須使用下述方法返回一個(gè)Statement對(duì)象:Statement stmt=con.createStatement(int type ,int concurrency);Statement stmt=con.createStatement(int type ,int concurrency);其中,參數(shù)type取值可確定stmt返回的rs是否為可滾動(dòng)的結(jié)果集:ResultSet re=stmt

25、.executeQuery(SQLResultSet re=stmt.executeQuery(SQL語(yǔ)句語(yǔ)句););參數(shù)參數(shù)typetype取值:取值:ResultSet.TYPE_FORWORD_ONLY ResultSet.TYPE_FORWORD_ONLY 結(jié)果集的游標(biāo)只能向下移動(dòng)。ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_INSENSITIVE 結(jié)果集的游標(biāo)可以上下移動(dòng),當(dāng)數(shù)據(jù)庫(kù)變化時(shí),當(dāng)前結(jié)果集不變。 ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.TYPE_SCROLL_SE

26、NSITIVE 返回可滾動(dòng)的結(jié)果集,當(dāng)數(shù)據(jù)庫(kù)變化時(shí),當(dāng)前結(jié)果集同步改變。參數(shù)參數(shù)ConcurrencyConcurrency取值取值 ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_READ_ONLY 不能用結(jié)果集更新數(shù)據(jù)庫(kù)中的表。 ResultSet.CONCUR_UPDATABLEResultSet.CONCUR_UPDATABLE 能用結(jié)果集更新數(shù)據(jù)庫(kù)中的表。滾動(dòng)查詢(xún)時(shí)經(jīng)常用到滾動(dòng)查詢(xún)時(shí)經(jīng)常用到ResultSetResultSet的方法見(jiàn)教材的方法見(jiàn)教材page 288page 288: 例12-2中,我們隨機(jī)從結(jié)果集中取出3條記錄,并計(jì)算3條記錄的

27、height的平均值,效果如圖12.10所示。18例12-2 運(yùn)行效果 圖12.101912.5 更新、插入與刪除操作更新記錄的SQL語(yǔ)法: UPDATE SET = 新值新值 WHERE 插入記錄的SQL語(yǔ)法: INSERT INTO 表表(字段列表字段列表) VALUES (對(duì)應(yīng)的具體的記錄)(對(duì)應(yīng)的具體的記錄)或 INSERT INTO 表表(VALUES (對(duì)應(yīng)的具體的記錄)(對(duì)應(yīng)的具體的記錄)刪除記錄的SQL語(yǔ)法: DELETE FROM WHERE 例例12-3對(duì)message表進(jìn)行了更新和插入操作 2012.6 用結(jié)果集更新數(shù)據(jù)庫(kù)中的表用結(jié)果集更新數(shù)據(jù)庫(kù)中的表 可以使用內(nèi)存中Re

28、sultSet對(duì)象對(duì)底層數(shù)據(jù)庫(kù)表進(jìn)行更新和插入操作(這些操作由系統(tǒng)自動(dòng)轉(zhuǎn)化為相應(yīng)的SQL語(yǔ)句),優(yōu)點(diǎn)是不必熟悉有關(guān)更新、插入的SQL語(yǔ)句,而且方便編寫(xiě)代碼,缺點(diǎn)是,必須要事先返回結(jié)果集。首先,必須得到一個(gè)可滾動(dòng)的ResultSet對(duì)象:rs,例如:Connnection con=DriverManager.getConnection(jdbc:odbc:hello,);Connnection con=DriverManager.getConnection(jdbc:odbc:hello,);Statement sql=con.createStatement(ResultSet.TYPE_SCR

29、OLL_SENSITIVE,Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet.CONCUR_UPDATABLE); ResultSet rs=sql.executeQuery(SELECT ResultSet rs=sql.executeQuery(SELECT * * FROM message); FROM message); 2112.6 用結(jié)果集更新數(shù)據(jù)庫(kù)中的表用結(jié)果集更新數(shù)據(jù)庫(kù)中的表_1更新記錄中的列值更新記錄中的列值 使用結(jié)

30、果集更新數(shù)據(jù)庫(kù)表中第n行記錄中某列的值的步驟是:(1 1)結(jié)果集)結(jié)果集rsrs的游標(biāo)移動(dòng)到第的游標(biāo)移動(dòng)到第n n行行 rs.absolute(n);(2 2)結(jié)果集將第)結(jié)果集將第n n行的行的p p列的列值更新列的列值更新 結(jié)果集可以使用下列方法更新列值updateInt(String columnName, int x)updateInt(String columnName, int x),updateInt(int columnIndex int x)updateInt(int columnIndex int x)updateLong(String columnName, long x

31、)updateLong(String columnName, long x),updateLong(int columnIndex, long x)updateLong(int columnIndex, long x) 更多方法見(jiàn)教材page 291.(3 3)更新數(shù)據(jù)庫(kù)中的表)更新數(shù)據(jù)庫(kù)中的表 最后,結(jié)果集調(diào)用updateRow()方法,用結(jié)果集中的第n行更新數(shù)據(jù)庫(kù)表中的第n行記錄。 以下代碼片段更新message表中的第3行記錄的name列(字段)的值。rs.absolute(3);rs.absolute(3);rs.updateString(2, rs.updateString(2, 王

32、曉二王曉二);/ );/ 也可以寫(xiě)成也可以寫(xiě)成rs.updateString(name, rs.updateString(name, 王曉二王曉二););rs.updateRow();rs.updateRow();2212.6 用結(jié)果集更新數(shù)據(jù)庫(kù)中的表用結(jié)果集更新數(shù)據(jù)庫(kù)中的表_2 插入記錄插入記錄 使用結(jié)果集向數(shù)據(jù)庫(kù)表中插入(添加)一行記錄步驟是:(1 1)結(jié)果集)結(jié)果集rsrs的游標(biāo)移動(dòng)到插入行的游標(biāo)移動(dòng)到插入行 結(jié)果集中有一個(gè)特殊區(qū)域,用作構(gòu)建要插入的行的暫存區(qū)域 (staging area),習(xí)慣上將該區(qū)域位置稱(chēng)做結(jié)果集的插入行。為了向數(shù)據(jù)庫(kù)表中插入一行新的記錄,必須首先將結(jié)果集的游標(biāo)移

33、動(dòng)到插入行,代碼如下:rs.moveToInsertRow();rs.moveToInsertRow();(2 2)更新插入行的列值)更新插入行的列值 結(jié)果集可以用updateXXX方法更新插入行的列值,例如rs.updateString(1, 006);rs.updateString(1, 006);rs.updateString(2, rs.updateString(2, 陳大林陳大林););rs.updateDate(3,Daters.updateDate(3,Date對(duì)象對(duì)象););rs.updateDouble(4, 1.79);rs.updateDouble(4, 1.79);(3

34、 3)插入記錄)插入記錄 最后,結(jié)果集調(diào)用insertRow()方法,用結(jié)果集中的插入行向數(shù)據(jù)庫(kù)表中插入一行新記錄。 例例12-412-4使用結(jié)果集對(duì)數(shù)據(jù)庫(kù)中的message表進(jìn)行了更新和插入操作(效果如圖12.11所示)。23例12-4 運(yùn)行效果 圖12.1124 CachedRowSetImpl對(duì)象可以保存ResultSet對(duì)象中的數(shù)據(jù),而且CachedRowSetImpl對(duì)象不依賴(lài)Connnection對(duì)象,這意味著一旦把ResultSet對(duì)象中的數(shù)據(jù)保存到CachedRowSetImpl對(duì)象中后,就可以關(guān)閉和數(shù)據(jù)庫(kù)的連接。 例12-5使用CachedRowSetImpl對(duì)象保存數(shù)據(jù)庫(kù)表

35、的記錄 12.7 CachedRowSetImpl類(lèi)2512.8 預(yù)處理語(yǔ)句_1預(yù)處理語(yǔ)句優(yōu)點(diǎn) Connection連接對(duì)象con調(diào)用prepareStatement(String sql)方法 PreparedStatement pre=con.prepareStatement(String sql);對(duì)參數(shù)sql指定的SQL語(yǔ)句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫(kù)地層的內(nèi)部命令,并將該命令封裝在PreparedStatement對(duì)象pre中,那么該對(duì)象調(diào)用下列方法都可以使得該地層內(nèi)部命令被數(shù)據(jù)庫(kù)執(zhí)行,ResultSet executeQuery()boolean execute()int exec

36、uteUpdate() 只要編譯好了PreparedStatement對(duì)象pre,那么pre可以隨時(shí)地執(zhí)行上述方法,顯然提高了訪問(wèn)數(shù)據(jù)庫(kù)的速度。 例12-6使用預(yù)處理語(yǔ)句來(lái)查詢(xún)數(shù)據(jù)庫(kù)中表的全部記錄。2612.8 預(yù)處理語(yǔ)句_2使用統(tǒng)配符 在對(duì)SQL進(jìn)行預(yù)處理時(shí)可以使用統(tǒng)配符“?”來(lái)代替字段的值,只要在預(yù)處理語(yǔ)句執(zhí)行之前再設(shè)置統(tǒng)配符所表示的具體值即可。例如:prepareStatement pre=con.prepareStatement(SELECT * FROM message WHERE height ? );那么在sql對(duì)象執(zhí)行之前,必須調(diào)用相應(yīng)的方法設(shè)置統(tǒng)配符“?”代表的具體值,比如:

37、pre.setDouble(1,1.72);指定上述預(yù)處理語(yǔ)句pre中統(tǒng)配符“?”代表的值是1.72。下列方法:void setDouble(int parameterIndex,int x)用來(lái)設(shè)置通配符的值,其中參數(shù)parameterIndex用來(lái)表示SQL語(yǔ)句中從左到右的第parameterIndex個(gè)統(tǒng)配符號(hào),x是該統(tǒng)配符所代表的具體值。 預(yù)處理語(yǔ)句設(shè)置統(tǒng)配符“?”的值的常用方法有(page 295):void setDate(int parameterIndex,Date x)void setDouble(int parameterIndex,double x) 例子例子12-712

38、-7使用預(yù)處理語(yǔ)句向student.mdb數(shù)據(jù)庫(kù)中的message表插入記錄。2712.9 事務(wù) 事務(wù)由一組SQL語(yǔ)句組成,所謂事務(wù)處理是指:應(yīng)用程序保證事務(wù)中的SQL語(yǔ)句要么全部都執(zhí)行,要么一個(gè)都不執(zhí)行。 JDBC事務(wù)處理步驟 (1)使用setAutoCommit(boolean autoCommit)方法 (2)使用commit()方法 (3)使用rollback()方法 例子12-8使用了事務(wù)處理,將user表中number字段是“0001”的userMoney的值減少n,并將減少的n增加到字段是“0002”的userMoney屬性值上。 2812.10 批處理 JDBC為Stateme

39、nt對(duì)象提供了批處理功能,即Statement對(duì)象調(diào)用executeBatch()方法可以一次執(zhí)行多條SQL語(yǔ)句,只要事先讓Statement對(duì)象調(diào)用addBatch(String sql)方法將要執(zhí)行的SQL語(yǔ)句添加到該對(duì)象中即可。 在對(duì)若干個(gè)SQL進(jìn)行批處理時(shí),如果不允許批處理中的任何SQL語(yǔ)句執(zhí)行失敗,那么和前面講解處理事務(wù)的情況相同,要事先關(guān)閉連接對(duì)象的自動(dòng)提交模式,即將批處理作為一個(gè)事務(wù)來(lái)對(duì)待,否則批處理中成功執(zhí)行的SQL語(yǔ)句將立刻生效。 例12-9中的Statement對(duì)象調(diào)用executeBatch()方法對(duì)多個(gè)SQL語(yǔ)句進(jìn)行了批處理,并將批處理作為一個(gè)事務(wù)。 2912.11 使

40、用JTable組件操作表 本節(jié)給出怎樣使用JTable組件操作數(shù)據(jù)庫(kù)中的表中。 下面的例12-10使用JTable組件顯示message表的記錄、更新message表的記錄、向message表插入記錄(效果如圖12.12(a)、(b)、(c)和(d)所示)。例12-10共有4個(gè)Java源文件,需分別保存編譯,其中Example12_10.java是主類(lèi)。 30例12-10 運(yùn)行效果3112.12 SQL Server 2000數(shù)據(jù)庫(kù) 1起動(dòng)SQL Server 2000 啟動(dòng)后的SQL Server 2000服務(wù)器效果如圖12.13所示。2建立數(shù)據(jù)庫(kù) 使用SQL Server 2000可以建立

41、多個(gè)不同的數(shù)據(jù)庫(kù)。本節(jié)我們將建立一個(gè)名字為factory的數(shù)據(jù)庫(kù)。打開(kāi)“企業(yè)管理器”后將出現(xiàn)如圖12.13所示界面,我們新建立的數(shù)據(jù)庫(kù)名稱(chēng)是“factory”,如圖12.14中右側(cè)所示。3創(chuàng)建表 打開(kāi)“企業(yè)管理器”,用鼠標(biāo)單擊 “數(shù)據(jù)庫(kù)”下的factory數(shù)據(jù)庫(kù),在factory管理的“表”的選項(xiàng)上單擊右鍵,選擇“新建表”,將出現(xiàn)相應(yīng)的建表界面,我們建立的表是employee,該表的字段(屬性)為:number(char) name(char) birthday(smalldatetime) salary(float)。其中,“number”字段為主鍵,如圖12.15所示。 32圖12.13,圖12.14,圖12.153312.13 使用純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 用Java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序稱(chēng)做純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。JDBC提供的API通過(guò) 將純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序轉(zhuǎn)換為DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))所使用的專(zhuān)用協(xié)議來(lái)實(shí)現(xiàn)和特定的DBMS交互信息,簡(jiǎn)單地說(shuō),JDBC可以調(diào)用本地的純Java驅(qū)動(dòng)程序和相應(yīng)的數(shù)據(jù)

溫馨提示

  • 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)論