第9章數(shù)據(jù)庫程序相關(guān)設(shè)計_第1頁
第9章數(shù)據(jù)庫程序相關(guān)設(shè)計_第2頁
第9章數(shù)據(jù)庫程序相關(guān)設(shè)計_第3頁
第9章數(shù)據(jù)庫程序相關(guān)設(shè)計_第4頁
第9章數(shù)據(jù)庫程序相關(guān)設(shè)計_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第9章數(shù)據(jù)庫程序相關(guān)設(shè)計v教學(xué)目標(biāo):v通過本章的學(xué)習(xí),理解JDBC的功能及體系結(jié)構(gòu),掌握利用JDBC實現(xiàn)數(shù)據(jù)庫的查詢更新等操作的方法,能夠?qū)崿F(xiàn)基本的Java數(shù)據(jù)庫程序設(shè)計。 v案例 成績查詢系統(tǒng)分析v程序可以實現(xiàn)各種單科考試、競賽等成績的各種查詢。程序主界面如圖9.2所示。當(dāng)輸入考號后單擊“按考生查詢”按鈕,則顯示該生成績,如圖9.3所示。v單擊“成績名次”按鈕可以查看考試排名,如圖9.4所示。單擊“未通過名單”按鈕可以查看學(xué)生不及格的情況,如圖9.5所示。 v案例框架利用JDBC連接數(shù)據(jù)庫并進行了訪問。下面將詳細(xì)介紹相關(guān)知識。 9.1 JDBC驅(qū)動程序v為了與某個數(shù)據(jù)庫連接,必須要有適合該數(shù)

2、據(jù)庫的驅(qū)動程序。JDBC驅(qū)動程序主要有以下4種。v(1) JDBC-ODBC橋加ODBC驅(qū)動程序。v這種驅(qū)動程序經(jīng)由ODBC驅(qū)動程序供JDBC訪問數(shù)據(jù)庫,即在JDBC的幫助下以JDBC-ODBC 橋的形式使用ODBC。 v(2) 本地API和部分Java編寫的驅(qū)動程序。v這種驅(qū)動程序把客戶機API上的JDBC調(diào)用轉(zhuǎn)換為對數(shù)據(jù)庫的調(diào)用,也就是說這種類型的驅(qū)動程序是通過調(diào)用本地API來實現(xiàn)與數(shù)據(jù)庫的通信。v(3) JDBC網(wǎng)絡(luò)純Java驅(qū)動程序。v這種驅(qū)動程序?qū)DBC轉(zhuǎn)換為與DBMS無關(guān)的網(wǎng)絡(luò)協(xié)議,然后這種協(xié)議又被某個服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺腏ava客戶機連接

3、到多種不同的數(shù)據(jù)庫上,所用的具體協(xié)議取決于提供者。通常這是最為靈活的JDBC驅(qū)動程序。v(4) 本地協(xié)議純Java驅(qū)動程序。v這種驅(qū)動程序直接將JDBC調(diào)用轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許從客戶機上直接調(diào)用DBMS服務(wù)器,它是Intranet訪問的一個很實用的解決方法。 9.2 ODBC數(shù)據(jù)源的設(shè)置vODBC數(shù)據(jù)源設(shè)置步驟如下:v選擇“開始”“控制面板”“管理工具”“數(shù)據(jù)源”命令,打開ODBC數(shù)據(jù)源管理器,如圖9.7所示,窗口中列出了目前已有的數(shù)據(jù)源??梢赃x擇已有的數(shù)據(jù)源后,單擊“配置”按鈕,對已有的數(shù)據(jù)源進行修改。單擊“添加”按鈕創(chuàng)建一個新的數(shù)據(jù)源,進入創(chuàng)建新數(shù)據(jù)源向?qū)?,拖動滑動條,

4、選擇數(shù)據(jù)源的驅(qū)動程序為SQL Server,單擊“完成”按鈕,進入創(chuàng)建SQL Server新數(shù)據(jù)源向?qū)?,輸入?shù)據(jù)源名稱為:Student,服務(wù)器名為需要連接的服務(wù)器的名字,然后單擊“下一步”按鈕 ,設(shè)置登錄SQL Server的驗證方式后單擊“下一步”按鈕,更改默認(rèn)的數(shù)據(jù)庫為Student。則使用Student數(shù)據(jù)庫中的表時,只需指定表名即可。單擊“下一步”按鈕,保持默認(rèn)即可,單擊“完成”按鈕。 9.3 JDBC API的使用vJDBC 可做3件事:建立與數(shù)據(jù)庫的連接;向數(shù)據(jù)庫發(fā)送 SQL 語句;處理數(shù)據(jù)庫的返回結(jié)果。vJDBC常用的的幾個核心類如下。v(1) java.sql.DriverM

5、anager 裝載JDBC驅(qū)動程序,還負(fù)責(zé)返回適當(dāng)驅(qū)動程序的連接。當(dāng)getConnection( )方法被調(diào)用時,DriverManager會試圖從已經(jīng)注冊的驅(qū)動程序中為URL尋找一個合適的驅(qū)動程序。v(2) java.sql.Connection 提供JDBC API和URL指定的數(shù)據(jù)庫管理系統(tǒng)之間的連接。Connection表示與特定數(shù)據(jù)庫的會話。v(3) java.sql.Statement 作為在給定的Connection上執(zhí)行SQL語句的容器。v(4) java.sql.ResultSet 控制通過游標(biāo)移動對變化的結(jié)構(gòu)中給定Statement的結(jié)果進行訪問,它使用一系列g(shù)etXXX(

6、 )方法訪問數(shù)據(jù)。 v9.3.1 JDBC基礎(chǔ)v下面通過對Student數(shù)據(jù)庫進行簡單的順序查詢來掌握通過JDBC訪問數(shù)據(jù)庫的一般步驟。v1. 加載JDBC驅(qū)動程序v首先需要使用JDBC數(shù)據(jù)庫驅(qū)動名字調(diào)用Class.forName( )方法,把相應(yīng)的驅(qū)動程序類加載到Java虛擬機JVM中。v如果采用JDBC-ODBC橋連接數(shù)據(jù)庫,則執(zhí)行語句:vClass.forName(sun.jdbc.odbc.JdbcOdbcDriver);v如果直接采用微軟提供的SQL Server 2000驅(qū)動程序連接SQL Server 2000,則需要下載驅(qū)動程序進行安裝,然后執(zhí)行語句:vClass.forNam

7、e(com.microsoft.jdbc.sqlserver.SQLServerDriver); v2. 創(chuàng)建跟數(shù)據(jù)庫的連接v(1) JDBC URL。Java應(yīng)用程序需要使用一個URL形式的字符串來獲取一個數(shù)據(jù)庫連接。這個字符串的形式隨數(shù)據(jù)庫的不同而不同,但通??偸且浴癹dbc:”開始的。例如有以下幾種情況。v 通過JDBC-ODBC橋連接ODBC數(shù)據(jù)源JDBCEX_Northwind,則vString URL=”jdbc:odbc:JdbcOdbcDriver”;v 采用微軟提供的SQL Server 2000驅(qū)動程序連接SQL Server 2000,則vString URL=”jdbc

8、:Microsoft:sqlsserver:/localhost:1433;DatabaseName=Northwind”; v(2) 創(chuàng)建連接。v代碼如下。vConnection con=DriverManager.getConnection(jdbc:odbc:JDBCEX_Northwind,);v3. 創(chuàng)建SQL語句對象StatementvStatement st=con.createStatement( );v4. 向數(shù)據(jù)庫執(zhí)行SQL語句vResultSet rs=st.executeQuery(select * from employees);v則返回Northwind數(shù)據(jù)庫emp

9、loyees表中的所有數(shù)據(jù)并保存在ResultSet中。 vStatement( )執(zhí)行SQL語句的方法 類 型方法及功能說明booleanexecute(String sql);執(zhí)行給定的SQL語句,該語句可能返回多個結(jié)果booleanexec ute(String sql, int autoGeneratedKeys);執(zhí)行給定的SQL語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序所有自動生成的鍵都可用于檢索booleanexecute(String sql, int columnIndexes);執(zhí)行給定的SQL語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵

10、可用于檢索booleanexecu te(String sql, String columnNames);執(zhí)行給定的SQL語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵可用于檢索int executeBatch( );將一批命令提交給數(shù)據(jù)庫來執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計數(shù)組成的數(shù)組ResultSetexecuteQuery(String sql);執(zhí)行給定的SQL語句,該語句返回單個ResultSet對象intexec uteUp date(String sql);執(zhí)行給定SQL語句,該語句可能為INSERT、UPDATE或DELETE語句,或者不返回

11、任何內(nèi)容的SQL語句(如SQL DDL語句)intexecuteUpdate (String sql, int autoGeneratedKeys)執(zhí)行給定的SQL語句,并用給定標(biāo)志通知驅(qū)動程序由此Statement生成的自動生成鍵是否可用于檢索intexecuteUpdate(String sql, int columnIndexes)執(zhí)行給定的SQL語句,并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵可用于檢索intexecuteUpdate(String sq l, String columnNames)執(zhí)行給定的SQL語句,并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵可用于檢索v5. 處

12、理返回的結(jié)果集v可以把ResultSet想象為一個二維矩陣,存儲數(shù)據(jù)庫表中對應(yīng)的行和列。v剛創(chuàng)建的ResultSet的游標(biāo)指向所有記錄之前,利用next( )方法可以在不同記錄間移動。getXXX(String columnName)方法可以依次讀取一行中的不同字段。ResultSet的方法如下:返回返回類型類型方法及功能描述方法及功能描述booleanabsolute(int row)方法將指針移動到此方法將指針移動到此 ResultSet 對象的給定行編號對象的給定行編號 voidafterLast( )方法將指針移動到此方法將指針移動到此 ResultSet 對象的末尾,正好位于最后一行

13、之后對象的末尾,正好位于最后一行之后 voidbeforeFirst( )方法將指針移動到此方法將指針移動到此 ResultSet 對象的開頭,正好位于第一行之前對象的開頭,正好位于第一行之前voidcancelRowUpdates( )方法取消對方法取消對 ResultSet 對象中的當(dāng)前行所做的更新對象中的當(dāng)前行所做的更新 voidclose( )方法立即釋放此方法立即釋放此 ResultSet 對象的數(shù)據(jù)庫和對象的數(shù)據(jù)庫和 JDBC 資源,而不是等待該資源,而不是等待該對象自動關(guān)閉時發(fā)生此操作對象自動關(guān)閉時發(fā)生此操作 voiddeleteRow( )方法從此方法從此 ResultSet

14、對象和底層數(shù)據(jù)庫中刪除當(dāng)前行對象和底層數(shù)據(jù)庫中刪除當(dāng)前行booleanfirst( )方法將指針移動到此方法將指針移動到此 ResultSet 對象的第一行對象的第一行XXXgetXXX(String columnName)方法返回當(dāng)前行列名為方法返回當(dāng)前行列名為ColumnName的字段值的字段值XXXgetXXX(int columnIndex)方法返回當(dāng)前行列序號為方法返回當(dāng)前行列序號為columnIndex的字段值的字段值voidinsertRow( )方法將插入行的內(nèi)容插入到此方法將插入行的內(nèi)容插入到此 ResultSet 對象和數(shù)據(jù)庫中對象和數(shù)據(jù)庫中booleanisAfterLa

15、st( )方法檢索指針是否位于此方法檢索指針是否位于此 ResultSet 對象的最后一行之后對象的最后一行之后booleanisBeforeFirst( )方法檢索指針是否位于此方法檢索指針是否位于此 ResultSet 對象的第一行之前對象的第一行之前booleanisFirst( )方法檢索指針是否位于此方法檢索指針是否位于此 ResultSet 對象的第一行對象的第一行 booleanisLast( )方法檢索指針是否位于此方法檢索指針是否位于此 ResultSet 對象的最后一行對象的最后一行booleanlast( )方法將指針移動到此方法將指針移動到此 ResultSet 對象的

16、最后一行對象的最后一行booleannext( )方法將指針從當(dāng)前位置下移一行方法將指針從當(dāng)前位置下移一行booleanprevious( )方法將指針移動到此方法將指針移動到此 ResultSet 對象的上一行對象的上一行voidrefreshRow( )方法用數(shù)據(jù)庫中的最近值刷新當(dāng)前行方法用數(shù)據(jù)庫中的最近值刷新當(dāng)前行booleanrelative(int rows)方法按相對行數(shù)方法按相對行數(shù)(或正或負(fù)或正或負(fù))移動指針移動指針booleanrowDeleted( )方法檢索是否已刪除某行方法檢索是否已刪除某行 booleanrowInserted( )方法檢索當(dāng)前行是否已有插入方法檢索當(dāng)

17、前行是否已有插入 booleanrowUpdated( )方法檢索是否已更新當(dāng)前行方法檢索是否已更新當(dāng)前行 voidsetFetchDirection(int direction)方法設(shè)置此方法設(shè)置此 ResultSet 對象中行的處理方對象中行的處理方向向 voidupdateXXX(int columnIndex, XXX x)方法用方法用x值更新指定列值更新指定列v例:查詢Student數(shù)據(jù)庫中成績表中學(xué)號、姓名、成績字段,并按照成績由高到低的次序逐行顯示出來。v代碼如下:vimport java.sql.*;vpublic class OrderSelectvv public stat

18、ic void main(String args) throws Exceptionvv Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);v Connection con=DriverManager.getConnection(jdbc:odbc:Student,);v Statement st=con.createStatement( );v ResultSet rs=st.executeQuery(select 學(xué)號,姓名,成績 from 成績表 order by 成績 desc);v vwhile(rs.next( )vv String xueha

19、o=rs.getString(學(xué)號);v String xingming=rs.getString(姓名);v float chengji=rs.getFloat(成績);v System.out.println(xuehao+ +xingming+ +chengji);v v rs.close( );v st.close( );v con.close( );v vv9.3.3 可滾動的結(jié)果集v前面的例子中,在獲取結(jié)果集之后都是利用ResultSet的next( )方法順序查詢結(jié)果集中的數(shù)據(jù)。實際中有時需要在結(jié)果集中前后移動,或者顯示結(jié)果集中指定的一條記錄。這時就必須使用可滾動的結(jié)果集。v為了

20、得到可滾動的結(jié)果集,必須使用與前面不同的方法得到Statement對象。vStatement st=con.createStatement(int resultSetType , int resultSetConcurrency);v根據(jù)參數(shù)resultSetType、resultSetConcurrency的取值來獲得不同類型的結(jié)果集,其中resultSetType參數(shù)的取值決定結(jié)果集的滾動方式,取值如下。v(1) ResultSet.TYPE_FORWORD_ONLY:獲取的結(jié)果集的指針只能向下滾動。v(2) ResultSet.TYPE_SCROLL_INSENSITIVE:獲取的結(jié)果集

21、的指針可以上下滾動;當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)變化時,當(dāng)前結(jié)果集不變化。v(3) ResultSet.TYPE_SCROLL_SENSITIVE:獲取的結(jié)果集的指針可以上下滾動;當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)變化時,當(dāng)前結(jié)果集同步改變。vresultSetConcurrency參數(shù)的取值決定是否可以用結(jié)果集更新數(shù)據(jù)庫,取值如下。v ResultSet.CONCUR_READ_ONLY:結(jié)果集不能更新數(shù)據(jù)庫中的表。v ResultSet.CONCUR_UPDATABLE:結(jié)果集中的數(shù)據(jù)可以更新數(shù)據(jù)庫中的表。v【例9-5】 統(tǒng)計Student數(shù)據(jù)庫中的成績表考試成績的及格率,并依次輸出獲得最高分及第5名、倒數(shù)第5名的同學(xué)的學(xué)號、姓名、成績。代碼如下:vimport java.sql.*;vpublic class ScrollSelect vv public static void main(String args) throws Exceptionvv Class.forName(sun.jdbc.odbc.Jdb

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論