Java數(shù)據(jù)庫操作課件_第1頁
Java數(shù)據(jù)庫操作課件_第2頁
Java數(shù)據(jù)庫操作課件_第3頁
Java數(shù)據(jù)庫操作課件_第4頁
Java數(shù)據(jù)庫操作課件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、java數(shù)據(jù)庫操作1第第12章章 java 數(shù)據(jù)庫操作數(shù)據(jù)庫操作 本章導(dǎo)讀本章導(dǎo)讀njdbc簡介簡介nmicrosoft access 數(shù)據(jù)庫njdbc-odbc橋接器n查詢操作n更新、插入與刪除操作n用結(jié)果集更新表ncachedrowsetimpl類n預(yù)處理語句與事務(wù)n批處理nsql server 2000數(shù)據(jù)庫n使用純java數(shù)據(jù)庫驅(qū)動(dòng)程序java數(shù)據(jù)庫操作212.1 jdbc簡介 jdbc(java database connectivity)是java運(yùn)行平臺(tái)的核心類庫中的一部分,提供了訪問數(shù)據(jù)庫的api,它由一些java類和接口組成。 在java中可以使用jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中表記錄

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

3、樣使用microsoft access數(shù)據(jù)庫管理系統(tǒng)創(chuàng)建數(shù)據(jù)庫和在數(shù)據(jù)庫中創(chuàng)建表。 1. 建立數(shù)據(jù)庫 單擊window 2000/xp系統(tǒng)桌面上的“開始” “所有程序” “microsoft access”啟動(dòng)數(shù)據(jù)庫管理系統(tǒng)。然后選擇新建數(shù)據(jù)庫,如圖12.2所示。將新建的數(shù)據(jù)庫命名為student.mdb,并保存到d:ch12目錄中。 java數(shù)據(jù)庫操作512.2 microsoft access數(shù)據(jù)庫_2 創(chuàng)建表 創(chuàng)建好數(shù)據(jù)庫后,就可以在該數(shù)據(jù)庫下建立若干個(gè)表。我們準(zhǔn)備在student.mdb數(shù)據(jù)庫數(shù)據(jù)庫中創(chuàng)建名字為message的表的表。打開student.mdb數(shù)據(jù)庫,在選擇界面上選擇“

4、使用設(shè)計(jì)器創(chuàng)建表”后,單擊“設(shè)計(jì)”,將出現(xiàn)創(chuàng)建表的界面,如圖12.3所示。 message表的字段(屬性)為:number(文本),name(文本),birthday(日期/時(shí)間),height(數(shù)字,雙精度)。其中,number字段為主鍵(在該字段上單擊鼠標(biāo)右鍵,將number設(shè)置為主鍵)。打開創(chuàng)建的message表,錄入記錄,如圖12.4所示。java數(shù)據(jù)庫操作612.3 jdbc-odbc橋接器 本節(jié)介紹jdbcodbcjdbcodbc橋接器連接方式橋接器連接方式。 使用jdbcodbc橋接器方式的機(jī)制是,應(yīng)用程序只需建立jdbc和odbc之間的連接,而和數(shù)據(jù)庫的連接由odbc去完成。

5、jdbcodbc橋接器的優(yōu)點(diǎn)是優(yōu)點(diǎn)是:jdbc有能力訪問幾乎所有類型的數(shù)據(jù)庫。缺點(diǎn)是缺點(diǎn)是移植性較差,應(yīng)用程序所駐留的計(jì)算機(jī)必須提供odbc。 應(yīng)用程序負(fù)責(zé)使用jdbc提供的api建立jdbcodbc橋接器,然后應(yīng)用程序就可以請(qǐng)求和數(shù)據(jù)庫建立連接,連接工作由odbc完成。 需要強(qiáng)調(diào)是,odbc使用“數(shù)據(jù)源”來管理數(shù)據(jù)庫,所以必須事先將某個(gè)數(shù)據(jù)庫設(shè)置成odbc所管理的一個(gè)數(shù)據(jù)源,應(yīng)用程序只能請(qǐng)求和odbc管理的數(shù)據(jù)源建立連接。使用jdbcodbc橋接器方式和數(shù)據(jù)庫建立連接如圖圖12.512.5所示所示。 以下詳細(xì)講解java應(yīng)用程序使用jdbcodbc橋接器訪問數(shù)據(jù)庫的3個(gè)步驟: 建立jdbc-

6、odbc橋接器 創(chuàng)建odbc數(shù)據(jù)源 和odbc數(shù)據(jù)源建立連接 以下假設(shè)應(yīng)用程序所在的計(jì)算機(jī)要訪問本地?cái)?shù)據(jù)庫student.mdb,即我們?cè)?2.2中建立的數(shù)據(jù)庫。java數(shù)據(jù)庫操作7圖12.5java數(shù)據(jù)庫操作8java應(yīng)用程序使用應(yīng)用程序使用jdbcodbc橋接器訪問數(shù)據(jù)庫的步驟橋接器訪問數(shù)據(jù)庫的步驟1 1 1 1建立建立jdbc-odbcjdbc-odbc橋接器橋接器 jdbc使用java.lang包中的classclass類類建立jdbc-odbc橋接器。class類通過調(diào)用它的靜態(tài)方法forname加載sun.jdbc.odbc包中的jdbcodbcdriver類建立jdbc-odbc

7、橋接器。建立橋接器時(shí)可能發(fā)生異常,必須捕獲這個(gè)異常,建立橋接器的代碼是:try class.forname(sun.jdbc.odbc.jdbcodbcdriver);try class.forname(sun.jdbc.odbc.jdbcodbcdriver); catch(classnotfoundexception e)catch(classnotfoundexception e) system.out.println(e); system.out.println(e); java數(shù)據(jù)庫操作9java應(yīng)用程序使用應(yīng)用程序使用jdbcodbc橋接器訪問數(shù)據(jù)庫的步驟橋接器訪問數(shù)據(jù)庫的步驟2

8、2 2 2odbcodbc數(shù)據(jù)源數(shù)據(jù)源 應(yīng)用程序所在的計(jì)算機(jī)負(fù)責(zé)創(chuàng)建數(shù)據(jù)源,即將本地或遠(yuǎn)程計(jì)算機(jī)上的數(shù)據(jù)庫設(shè)置成自己要訪問的數(shù)據(jù)源。因此,必須保證應(yīng)用程序所在計(jì)算機(jī)有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ù)源名稱)數(shù)據(jù)源名稱 在

9、圖12.7界面單擊“完成”按鈕將出現(xiàn)設(shè)置數(shù)據(jù)源具體項(xiàng)目的對(duì)話框,如圖12.8所示。在名稱欄里為數(shù)據(jù)源起一個(gè)你自己喜歡的名稱,這里我們起的名稱是hello。在“數(shù)據(jù)庫選擇”欄中選擇一個(gè)數(shù)據(jù)庫。java數(shù)據(jù)庫操作10圖12.6,圖12.7,圖12.8java數(shù)據(jù)庫操作11java應(yīng)用程序使用應(yīng)用程序使用jdbcodbc橋接器訪問數(shù)據(jù)庫的步驟橋接器訪問數(shù)據(jù)庫的步驟3 3 3 3連接數(shù)據(jù)源連接數(shù)據(jù)源 現(xiàn)在我們有了一個(gè)數(shù)據(jù)源hello,這個(gè)數(shù)據(jù)源就是數(shù)據(jù)庫student.mdb。編寫連接數(shù)據(jù)庫代碼不會(huì)出現(xiàn)數(shù)據(jù)庫的名稱,只能出現(xiàn)數(shù)據(jù)源的名字。首先首先使用java.sql包中的connectionconne

10、ction類類聲明一個(gè)對(duì)象,然后再使用類類drivermanagerdrivermanager調(diào)用它的靜態(tài)方法靜態(tài)方法getconnectiongetconnection創(chuàng)建這個(gè)連接對(duì)象: connection 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ù)庫,不必為數(shù)據(jù)源設(shè)置login name 和passwor

11、d,那么連接形式是:connection connection concon=drivermanager. getconnection(jdbc:odbc:=drivermanager. getconnection(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, ,);=driver

12、manager.getconnection(jdbc:odbc:hello, ,); catch(sqlexception e)catch(sqlexception e) 這樣就和數(shù)據(jù)源hello建立了連接。應(yīng)用程序一旦和某個(gè)數(shù)據(jù)源建立連接,就可以通過sql語句和該數(shù)據(jù)源所指定的數(shù)據(jù)庫中的表交互信息,比如查詢、修改、更新表中的記錄。java數(shù)據(jù)庫操作1212.4 查詢操作_1查詢操作步驟1 1向數(shù)據(jù)庫發(fā)送向數(shù)據(jù)庫發(fā)送sqlsql查詢語句查詢語句 首先使用statement聲明一個(gè)sql語句對(duì)象,然后讓已創(chuàng)建的連接對(duì)象con調(diào)用方法createstatment()創(chuàng)建這個(gè)sql語句對(duì)象,代碼如下

13、:try statement sql=con.createstatement();try statement sql=con.createstatement(); catch(sqlexception e )catch(sqlexception e )2 2處理查詢結(jié)果處理查詢結(jié)果 有了sql語句對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中表的查詢和修改,并將查詢結(jié)果存放在一個(gè)resultset類聲明的對(duì)象中。也就是說sql查詢語句對(duì)數(shù)據(jù)庫的查詢操作將返回一個(gè)resultset對(duì)象,resultset對(duì)象是以 統(tǒng) 一 形 式 的 列 組 織 的 數(shù) 據(jù) 行 組 成 。 例 如 , 對(duì) 于

14、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); from 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,

15、height from message);rs=sql.executequery(select name,height from message);內(nèi)存的結(jié)果集對(duì)象rs列數(shù)只有兩列,第一列是“name”列、第2列是“height”列。 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ì)象的若干方法。java數(shù)據(jù)庫操作13表12.1ja

16、va數(shù)據(jù)庫操作1412.4 查詢操作_2順序查詢 結(jié)果集resultset對(duì)象調(diào)用next()方法,可以順序查詢表中的記錄。結(jié)果集對(duì)象將游標(biāo)最初定位在第一行的前面,第一次調(diào)用next()方法使游標(biāo)移動(dòng)到第一行。next()方法返回一個(gè)boolean型數(shù)據(jù),當(dāng)游標(biāo)移動(dòng)到最后一行之后返回false。 例例12-112-1中中,查詢數(shù)據(jù)庫student.mdb中message表里的全部記錄,每條記錄包含全部的字段值,效果如圖12.9所示。java數(shù)據(jù)庫操作1512.4 查詢操作_3模糊查詢 可以用sql語句操作符like進(jìn)行模式般配,使用“%”表示零個(gè)或多個(gè)字符,用一個(gè)下劃線“_”表示任意一個(gè)字符,

17、使用“若干字符”表示“若干字符”中的任意一個(gè)。比如,下述語句查詢字段name值以“張”為前綴的記錄: rs=sql.executequery(select rs=sql.executequery(select * * from message where name like from message where name like 張張% );% );下述語句查詢字段name值以“張”或“李”為前綴的記錄: rs=sql.executequery(select rs=sql.executequery(select * * from message where name like from me

18、ssage where name like 張李張李% );% );將例12-1中的 rs=sql.executequery(select rs=sql.executequery(select * * from message); from message);修改為 sql.executequery(select sql.executequery(select * * from message where name like from message where name like 張李張李%);%);后,程序的輸出結(jié)果如下:001,張三,1990-10-10,1.78002,李四,1989-

19、09-09,1.67java數(shù)據(jù)庫操作1612.4 查詢操作_4排序查詢 可以在sql語句中使用order by子語句,對(duì)記錄排序。例如,按height排序查詢的sql語句:select select * * from message order by height from message order by height。 將例12-1中的 rs=sql.executequery(select rs=sql.executequery(select * * from message); from message);修改為 sql.executequery(select sql.executeq

20、uery(select * * from message order by height ); from message order by height );后,程序的輸出結(jié)果如下(按身高排序):003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.65002,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.execut

21、equery(select rs=sql.executequery(select * * from message); from message);修改為sql.executequery(select sql.executequery(select * * from message order 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-

22、12,1.86001,001,張三張三,1990-10-10,1.78,1990-10-10,1.78003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.65java數(shù)據(jù)庫操作1712.4 查詢操作_5條件查詢 可以在sql語句中使用where子語句,進(jìn)行條件查詢。例如,sql語句:select select * * from message where name = from message where name = 張三張三查詢姓名是“張三”的記錄; sql語句: select select * * from message where datepart

23、(yyyy,birthday)=1990 from message where datepart(yyyy,birthday)=1990查詢1990年后出生的記錄。 將例12-1中的rs=sql.executequery(select rs=sql.executequery(select * * from message); from message); 修改為rs=sql.executequery(select rs=sql.executequery(select * * from message where from message where datepart(yyyy,birthday

24、)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,1999-11-11,1.65java數(shù)據(jù)庫操作1812.4 查詢操作_6隨機(jī)查詢 有時(shí)候我們需要在結(jié)果集中前后移動(dòng)、或顯示結(jié)果集指定的一條記錄等等。這時(shí),我們必須要返回一個(gè)可滾動(dòng)的結(jié)果集。為了得到一個(gè)可滾動(dòng)的結(jié)果集,我們必須使用下述方法返回一個(gè)statement對(duì)象:statement s

25、tmt=con.createstatement(int type ,int concurrency);statement stmt=con.createstatement(int type ,int concurrency);其中,參數(shù)type取值可確定stmt返回的rs是否為可滾動(dòng)的結(jié)果集:resultset re=stmt.executequery(sqlresultset re=stmt.executequery(sql語句語句););參數(shù)參數(shù)typetype取值:取值:resultset.type_forword_only resultset.type_forword_only 結(jié)果集

26、的游標(biāo)只能向下移動(dòng)。resultset.type_scroll_insensitive resultset.type_scroll_insensitive 結(jié)果集的游標(biāo)可以上下移動(dòng),當(dāng)數(shù)據(jù)庫變化時(shí),當(dāng)前結(jié)果集不變。 resultset.type_scroll_sensitive resultset.type_scroll_sensitive 返回可滾動(dòng)的結(jié)果集,當(dāng)數(shù)據(jù)庫變化時(shí),當(dāng)前結(jié)果集同步改變。參數(shù)參數(shù)concurrencyconcurrency取值取值 resultset.concur_read_onlyresultset.concur_read_only 不能用結(jié)果集更新數(shù)據(jù)庫中的表。

27、resultset.concur_updatableresultset.concur_updatable 能用結(jié)果集更新數(shù)據(jù)庫中的表。滾動(dòng)查詢時(shí)經(jīng)常用到滾動(dòng)查詢時(shí)經(jīng)常用到resultsetresultset的方法見教材的方法見教材page 288page 288: 例12-2中,我們隨機(jī)從結(jié)果集中取出3條記錄,并計(jì)算3條記錄的height的平均值,效果如圖12.10所示。java數(shù)據(jù)庫操作19例12-2 運(yùn)行效果 圖12.10java數(shù)據(jù)庫操作2012.5 更新、插入與刪除操作更新記錄的sql語法: update set = 新值新值 where 插入記錄的sql語法: insert into

28、 表表(字段列表字段列表) values (對(duì)應(yīng)的具體的記錄)(對(duì)應(yīng)的具體的記錄)或 insert into 表表(values (對(duì)應(yīng)的具體的記錄)(對(duì)應(yīng)的具體的記錄)刪除記錄的sql語法: delete from where 例例12-3對(duì)message表進(jìn)行了更新和插入操作 java數(shù)據(jù)庫操作2112.6 用結(jié)果集更新數(shù)據(jù)庫中的表用結(jié)果集更新數(shù)據(jù)庫中的表 可以使用內(nèi)存中resultset對(duì)象對(duì)底層數(shù)據(jù)庫表進(jìn)行更新和插入操作(這些操作由系統(tǒng)自動(dòng)轉(zhuǎn)化為相應(yīng)的sql語句),優(yōu)點(diǎn)是不必熟悉有關(guān)更新、插入的sql語句,而且方便編寫代碼,缺點(diǎn)是,必須要事先返回結(jié)果集。首先,必須得到一個(gè)可滾動(dòng)的res

29、ultset對(duì)象:rs,例如:connnection con=drivermanager.getconnection(jdbc:odbc:hello,);connnection con=drivermanager.getconnection(jdbc:odbc:hello,);statement sql=con.createstatement(resultset.type_scroll_sensitive,statement sql=con.createstatement(resultset.type_scroll_sensitive, resultset.concur_updatable);

30、 resultset.concur_updatable); resultset rs=sql.executequery(select resultset rs=sql.executequery(select * * from message); from message); java數(shù)據(jù)庫操作2212.6 用結(jié)果集更新數(shù)據(jù)庫中的表用結(jié)果集更新數(shù)據(jù)庫中的表_1更新記錄中的列值更新記錄中的列值 使用結(jié)果集更新數(shù)據(jù)庫表中第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

31、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)updatelong(string columnname, long x),updatelong(int columnindex, long x)updatelong(int columnindex

32、, long x) 更多方法見教材page 291.(3 3)更新數(shù)據(jù)庫中的表)更新數(shù)據(jù)庫中的表 最后,結(jié)果集調(diào)用updaterow()方法,用結(jié)果集中的第n行更新數(shù)據(jù)庫表中的第n行記錄。 以下代碼片段更新message表中的第3行記錄的name列(字段)的值。rs.absolute(3);rs.absolute(3);rs.updatestring(2, rs.updatestring(2, 王曉二王曉二);/ );/ 也可以寫成也可以寫成rs.updatestring(name, rs.updatestring(name, 王曉二王曉二););rs.updaterow();rs.updat

33、erow();java數(shù)據(jù)庫操作2312.6 用結(jié)果集更新數(shù)據(jù)庫中的表用結(jié)果集更新數(shù)據(jù)庫中的表_2 插入記錄插入記錄 使用結(jié)果集向數(shù)據(jù)庫表中插入(添加)一行記錄步驟是:(1 1)結(jié)果集)結(jié)果集rsrs的游標(biāo)移動(dòng)到插入行的游標(biāo)移動(dòng)到插入行 結(jié)果集中有一個(gè)特殊區(qū)域,用作構(gòu)建要插入的行的暫存區(qū)域 (staging area),習(xí)慣上將該區(qū)域位置稱做結(jié)果集的插入行。為了向數(shù)據(jù)庫表中插入一行新的記錄,必須首先將結(jié)果集的游標(biāo)移動(dòng)到插入行,代碼如下:rs.movetoinsertrow();rs.movetoinsertrow();(2 2)更新插入行的列值)更新插入行的列值 結(jié)果集可以用updatexxx

34、方法更新插入行的列值,例如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 3)插入記錄)插入記錄 最后,結(jié)果集調(diào)用insertrow()方法,用結(jié)果集中的插入行向數(shù)據(jù)庫表中插入一行新記錄。 例例12-412-4使用結(jié)果集對(duì)數(shù)據(jù)庫中的message表進(jìn)行了

35、更新和插入操作(效果如圖12.11所示)。java數(shù)據(jù)庫操作24例12-4 運(yùn)行效果 圖12.11java數(shù)據(jù)庫操作25 cachedrowsetimpl對(duì)象可以保存resultset對(duì)象中的數(shù)據(jù),而且cachedrowsetimpl對(duì)象不依賴connnection對(duì)象,這意味著一旦把resultset對(duì)象中的數(shù)據(jù)保存到cachedrowsetimpl對(duì)象中后,就可以關(guān)閉和數(shù)據(jù)庫的連接。 例12-5使用cachedrowsetimpl對(duì)象保存數(shù)據(jù)庫表的記錄 12.7 cachedrowsetimpl類java數(shù)據(jù)庫操作2612.8 預(yù)處理語句_1預(yù)處理語句優(yōu)點(diǎn) connection連接對(duì)象co

36、n調(diào)用preparestatement(string sql)方法 preparedstatement pre=con.preparestatement(string sql);對(duì)參數(shù)sql指定的sql語句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫地層的內(nèi)部命令,并將該命令封裝在preparedstatement對(duì)象pre中,那么該對(duì)象調(diào)用下列方法都可以使得該地層內(nèi)部命令被數(shù)據(jù)庫執(zhí)行,resultset executequery()boolean execute()int executeupdate() 只要編譯好了preparedstatement對(duì)象pre,那么pre可以隨時(shí)地執(zhí)行上述方法,顯然提高了訪

37、問數(shù)據(jù)庫的速度。 例12-6使用預(yù)處理語句來查詢數(shù)據(jù)庫中表的全部記錄。java數(shù)據(jù)庫操作2712.8 預(yù)處理語句_2使用統(tǒng)配符 在對(duì)sql進(jìn)行預(yù)處理時(shí)可以使用統(tǒng)配符“?”來代替字段的值,只要在預(yù)處理語句執(zhí)行之前再設(shè)置統(tǒng)配符所表示的具體值即可。例如:preparestatement pre=con.preparestatement(select * from message where height ? );那么在sql對(duì)象執(zhí)行之前,必須調(diào)用相應(yīng)的方法設(shè)置統(tǒng)配符“?”代表的具體值,比如:pre.setdouble(1,1.72);指定上述預(yù)處理語句pre中統(tǒng)配符“?”代表的值是1.72。下列方法

38、:void setdouble(int parameterindex,int x)用來設(shè)置通配符的值,其中參數(shù)parameterindex用來表示sql語句中從左到右的第parameterindex個(gè)統(tǒng)配符號(hào),x是該統(tǒng)配符所代表的具體值。 預(yù)處理語句設(shè)置統(tǒng)配符“?”的值的常用方法有(page 295):void setdate(int parameterindex,date x)void setdouble(int parameterindex,double x) 例子例子12-712-7使用預(yù)處理語句向student.mdb數(shù)據(jù)庫中的message表插入記錄。java數(shù)據(jù)庫操作2812.9

39、事務(wù) 事務(wù)由一組sql語句組成,所謂事務(wù)處理是指:應(yīng)用程序保證事務(wù)中的sql語句要么全部都執(zhí)行,要么一個(gè)都不執(zhí)行。 jdbc事務(wù)處理步驟 (1)使用setautocommit(boolean autocommit)方法 (2)使用commit()方法 (3)使用rollback()方法 例子12-8使用了事務(wù)處理,將user表中number字段是“0001”的usermoney的值減少n,并將減少的n增加到字段是“0002”的usermoney屬性值上。 java數(shù)據(jù)庫操作2912.10 批處理 jdbc為statement對(duì)象提供了批處理功能,即statement對(duì)象調(diào)用executebat

40、ch()方法可以一次執(zhí)行多條sql語句,只要事先讓statement對(duì)象調(diào)用addbatch(string sql)方法將要執(zhí)行的sql語句添加到該對(duì)象中即可。 在對(duì)若干個(gè)sql進(jìn)行批處理時(shí),如果不允許批處理中的任何sql語句執(zhí)行失敗,那么和前面講解處理事務(wù)的情況相同,要事先關(guān)閉連接對(duì)象的自動(dòng)提交模式,即將批處理作為一個(gè)事務(wù)來對(duì)待,否則批處理中成功執(zhí)行的sql語句將立刻生效。 例12-9中的statement對(duì)象調(diào)用executebatch()方法對(duì)多個(gè)sql語句進(jìn)行了批處理,并將批處理作為一個(gè)事務(wù)。 java數(shù)據(jù)庫操作3012.11 使用jtable組件操作表 本節(jié)給出怎樣使用jtable組

41、件操作數(shù)據(jù)庫中的表中。 下面的例12-10使用jtable組件顯示message表的記錄、更新message表的記錄、向message表插入記錄(效果如圖12.12(a)、(b)、(c)和(d)所示)。例12-10共有4個(gè)java源文件,需分別保存編譯,其中example12_10.java是主類。 java數(shù)據(jù)庫操作31例12-10 運(yùn)行效果java數(shù)據(jù)庫操作3212.12 sql server 2000數(shù)據(jù)庫 1起動(dòng)sql server 2000 啟動(dòng)后的sql server 2000服務(wù)器效果如圖12.13所示。2建立數(shù)據(jù)庫 使用sql server 2000可以建立多個(gè)不同的數(shù)據(jù)庫。本

42、節(jié)我們將建立一個(gè)名字為factory的數(shù)據(jù)庫。打開“企業(yè)管理器”后將出現(xiàn)如圖12.13所示界面,我們新建立的數(shù)據(jù)庫名稱是“factory”,如圖12.14中右側(cè)所示。3創(chuàng)建表 打開“企業(yè)管理器”,用鼠標(biāo)單擊 “數(shù)據(jù)庫”下的factory數(shù)據(jù)庫,在factory管理的“表”的選項(xiàng)上單擊右鍵,選擇“新建表”,將出現(xiàn)相應(yīng)的建表界面,我們建立的表是employee,該表的字段(屬性)為:number(char) name(char) birthday(smalldatetime) salary(float)。其中,“number”字段為主鍵,如圖12.15所示。 java數(shù)據(jù)庫操作33圖12.13,圖12.14,圖12.15java數(shù)據(jù)庫操作3412.13 使用純java數(shù)據(jù)庫驅(qū)動(dòng)程序 用java語言編寫的數(shù)據(jù)庫驅(qū)動(dòng)程序稱做純java數(shù)據(jù)庫驅(qū)動(dòng)程序。jdbc提供的api通過 將純java數(shù)據(jù)庫驅(qū)動(dòng)程序轉(zhuǎn)換為dbms(數(shù)據(jù)庫管理系統(tǒng))所使用的專用協(xié)議來實(shí)現(xiàn)和特定的dbms交互信息,簡單

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論