Java程序設計方案修改ch_第1頁
Java程序設計方案修改ch_第2頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第8章Java數據庫連接數據庫是收集、存儲和組織數據的常用方法。在當今的管理信息系統(tǒng)中,數據庫系統(tǒng) 是整個系統(tǒng)的核心。因此,如何讓應用程序能夠簡易、快速和正確地存取數據庫就成為一 個很重要的課題。 Java語言通過 JDBC ( Java Data DataBase Connectivity Java 數據庫連 接) API 提供了一個標準 SQL( Structured Query Language 結構化查詢語言)數據庫訪問 接口。由于目前幾乎所有的關系數據庫產品都支持 SQL 語言,開發(fā)人員能夠用相同的方法將 SQL 語句發(fā)送到不同的數據庫系統(tǒng),從而使用Java 程序能夠通過一致的方式,

2、存取各式各樣的數據庫。本章要點JDBC 的基本概念JDBC 連接數據庫的基本方法JDBC 操作數據庫的基本方法本章難點JDBC 操作數據庫的具體實現(xiàn)學習目標掌握 JDBC 的基本概念掌握 JDBC 連接與操作數據庫的基本方法8.1 JDBC 概述JDBC 可實現(xiàn)應用程序和數據庫的連接,它主要能完成下列三個任務:1 同一個數據庫建立連接。2 向數據庫發(fā)送 SQL 語句。3 處理數據庫返回的結果。8.1.1JDBC 框架結構JDBC 是用來提供 Java 程序連結與存取數據庫的套件,包含了一組類和接口,使得程 序員可以通過一致的方式存取各個不同的關連式數據庫系統(tǒng),而不必再為每一種關連式數 據庫系統(tǒng)

3、(如 Mysql 、Access、 Oracle 等)編寫不同的程序代碼。應用程序通過 JDBC API 與數據庫聯(lián)系,而實際的動作則是由 JDBCDriver Manager 通 過 JDBC驅動程序與數據庫管理系統(tǒng)溝通。真正提供存取數據庫功能的,其實是 JDBC 驅 動程序,也就是說,如果要想存取某一種數據庫系統(tǒng),就必須要擁有對應于該數據庫系統(tǒng) 的驅動程序。以連接 Access 數據庫為例,需要有 JDBC-ODBC 鏈接驅動程序,這個驅動程序在安裝Java SDK 時就會自動安裝在系統(tǒng)上,若要連接其它類型的數據庫,就必須要先取得適當的 驅動程序。如圖 8-1 所示為 JDBC 的框架結構

4、圖。圖 8-1 JDBC 框架圖它們是 Java 開發(fā)工具包的組成部分,即JDBC 驅動程JDBC-ODBC 橋。從功能上看,JDBC 包含兩部分與數據庫獨立的API,即面向程序開發(fā)人員的JDBCAPI 和面向底層的 JDBC Driver API。JDBC 整個模型的基礎是:遵循JDBC API 協(xié)議的程序和 JDBC 驅動程序管理器來通信,然后管理器用嵌入的驅動程序來訪問數據庫。我們編寫訪問數據庫的Java 程序,既可以使用 JDBC/ODBC 橋來利用 ODBC 的接口訪問數據席,也可以通過直接的JDBC 驅動程序來實現(xiàn)數據庫的訪問。JDBC 驅動程序包括如下四類:(1)JDBC-ODB

5、C 橋將 JDBC 轉化為 ODBC 驅動,利用 JDBC/ODBC 橋和 ODBC 驅動來訪問數據庫程序。 該程序最適合于商業(yè)網絡或三層體系結構中當應用服務器層的代碼是由Java 寫成時的情況,并要求 ODBC 必須在每個客戶機上安裝。(2)部分 Java 技術的本地 API 驅動程序驅動程序直接將用戶的調用轉化為對數據庫客戶端相應API 的調用。這類驅動程序需要數據庫在本地安裝一個客戶端。(3)全部基于 Java 技術的本地 API 驅動程序驅動程序是獨立于數掂庫服務器的,它只和一個中間層通信,由這個中間層來實現(xiàn)數 據庫的訪問。這類網絡服務器中間件能夠連接其所有的Java 客戶端到許多不同

6、的數據庫上,是最靈活的 JDBC 驅動程序。(4)全部基于 Java 技術的本地協(xié)議驅動程序JDBC APIJava 提供 3 種JDBC產品組件,序管理器、JDBC驅動程序測試工具包和JDBCDriver API驅動程序直接將用戶的請求轉換為對數據庫的協(xié)議請求,直接和數據庫服務器通信。 因為大多數這樣的協(xié)議都是數據庫專有的,一些數據庫廠家在開發(fā)這類驅動程序。第 3 類和第 4 類驅動程序是從 JDBC 訪問數據庫的首選方案,因為它們提供了 所有優(yōu)點,包括自動安裝。Java 程序通過 JDBC API 訪問 JDBC Driver Manager, JDBC Driver Manager 再通

7、過 JDBCDriver API 訪問不同的 JDBC 驅動程序,從而實現(xiàn)不同數據庫的訪問。JDBC 提供了一個通用的JDBC Driver Manager,用來管理各數據庫軟件商提供的JDBC 驅動程序,從而訪問其數據庫。此外,對沒有提供相應JDBC 驅動程序的數據庫系統(tǒng),開發(fā)了特殊的驅動程序,即JDBC-ODBC 橋?,F(xiàn)在越來越多的數據庫廠商都提供其數據庫的 JDBC 驅動程序。8.1.2JDBC 應用模型在實際應用中,可以采用兩種開發(fā)模型,一種是兩層開發(fā)模型,另一種是三層(或更 多層)開發(fā)模型。圖 8-2 兩層結構模型在兩層模型中,用戶的SQL 語句被傳送給數據庫,而這些語句執(zhí)行的結果將

8、被傳回給用戶。數據庫可以在同一機器上,也可以在另一機器上通過網絡進行連接。這被稱為“Client/Server ”結構,用戶的計算機作為Client,運行數據庫的計算機作為Server。這個網絡可以是 Intranet,比如連接全體雇員的企業(yè)內部網,當然也可以是In ternet。但是兩層結構存在很多問題,比如由于應用程序與數據庫直接相連,更換數據庫時要在應用程序中修改很多代碼。圖 8-3 三層結構模型在三層模型中,命令將被發(fā)送到服務的“中間層”,而“中間層”將 數據庫。數據庫處理語句并將結果返回“中間層”,然后“中間層”將它們返回用戶??蛻舳伺c中間層之間的連接可以有很多途徑。如果客戶機為網絡

9、瀏覽器時,可通過HTTP 協(xié)議將操作命令送到中間層。如果客戶機為一般Java 應用程序,中間層在另外一臺網絡計算機上,可以通過 RMI ( Remote Method In vocation )遠程方法調用聯(lián)系。也可以在 同一臺計算機上建立客戶端和中間服務層,只需將程序所需要的各數據庫功能模塊封裝在 獨立的 Java 類里就可以了。三層模型很有優(yōu)勢,因為“中間層”可以進行對訪問的控制并協(xié)同數據庫的更新,另一個優(yōu)勢就是如果有一個“中間層”,用戶就可以使用一個易用的高層API,這個 API 可以由“中間層”進行轉換,轉換成底層的調用。而且,在許多種情況下,三層模型可以提 供更好的性Java 的客戶

10、端JDBC 或JDBC-ODBCSQL 語句發(fā)送到 數據庫服務器能。8.2 JDBC 連接數據庫8.2.1 JDBC 連接數據庫的方法1JDBC URLJDBC URL 提供了一種標識數據庫的方法, 可以使相應的驅動程序能識別數據庫并與 之建立連接。由編程人員來決定用什么 JDBC URL 來標識特定的驅動程序,用戶不必關心 如何形成 JDBC URL 。JDBC URL 的標準語法如下所示,由三部分組成,各部份之間用冒號分隔。jdbc: 子協(xié)議 : 子名稱(1) jdbc: JDBC URL 中的協(xié)議是 jdbc(2) 子協(xié)議 :驅動程序名或數據庫連接機制的名稱。例如: jdbc:odbc:

11、mystu本例中,子協(xié)議是odbc”,子名稱mystu ”是本地 ODBC 數據源。若要用網絡命名服務,則命名服務可以作為子協(xié)議。例如: jdbc:dbpro:student子協(xié)議是dbpro ,名稱為student”(3) 子名稱 :是一種標識數據庫的方法。子名稱可以依不同的子協(xié)議而變化。它 可以有子名稱的子名稱。如果數據庫位于網絡的其它計算機上,則在 JDBC URL 中可將網絡地址作為子名稱的一部分包括進去。如要訪問位于,端口號為 8080,名稱為 student 的數據庫, URL 如下:Jdbc:odbc/:8080/student2 JDBC-ODBC 橋開放式數據庫互連 ODBC

12、(Open DataBase Connectivity) 是微軟公司開發(fā)的一套開發(fā)數據 庫系統(tǒng)應用程序接口的規(guī)范,它支持應用程序以標準的ODBC 函數和 SQL 語句操作各種不同的數據庫。 ODBC 驅動程序相當于一個轉換開關,它負責將應用程序發(fā)送來的標準 SQL 語句傳遞給各種數據庫驅動程序處理,再將處理結構送回應用程序。目前幾乎所有的 數據庫系統(tǒng)都提供 ODBC 驅動程序。Sun 公司對沒有提供相應 JDBC 驅動程序的數據庫系統(tǒng),開發(fā)了特殊的驅動程序: JDBC-ODBC 橋,該驅動程序支持 JDBC 通過現(xiàn)有的 ODBC 驅動程序訪問相應的數據庫系 統(tǒng)。JDBC-ODBC 橋子協(xié)議名為

13、 odbc,允許在子名稱(數據源名稱)后面指定任意多個屬 性值。Odbc子協(xié)議的完整語法為:jdbc:odbc:數據資源名稱 。屬性名 = 屬性值*表示允許有多個屬性。例如: jdbc:odbc:mystu 。 UID=zy 。 PWD=happy該連接的數據源名為 mystu,用戶名為 zy,密碼為 happy。8.2.2 JDBC 中的常用接口與類JDBC 是一個面向對象的 API ,因此連接的建立也是通過對象實現(xiàn)的。 Connection 對象 完成同數據庫連接的功能。一個連接會話由兩部分組成:一部分是SQL 語句被遠端執(zhí)行,另一部分是結果集的返回。一個應用程序可以同某一數據庫同時存在一

14、個或多個連接,也 可以同幾個不同的數據庫同時存在連接。Java.sql 包中包括了所有 JDBC 的類和接口,最常用的有如下介紹的五個接口和一個 類,還有一個對象。1 Driver 接口:將 API 的調用映射到數據庫的操作。 常用方法:boolean acceptsURL(String url) 檢索驅動程序是否認為它可以打開到給定 URL 的連接。Connection connect(String url, Properties info) 試圖創(chuàng)建一個到給定 URL 的數據庫連接。int getMajorVersion() 檢索此驅動程序的主版本號。int getMinorVersion

15、()獲得此驅動程序的次版本號。DriverPropertyInfo getPropertyInfo(String url, Properties info) 獲得此驅動程序的可能屬性信息。boolean jdbcCompliant()報告此驅動程序是否是一個真正的 JDBC CompliantTM 驅動程序。 2 DriverManager 類:用來加載驅動程序,管理應用程序和驅動程序的連接。 常用方法:static Connection getConnection(String url) 試圖建立到給定數據庫 URL 的連接。static void setLoginTimeout(int s

16、econds) 設置驅動程序試圖連接到某一數據庫時將等待的最長時間,以秒為單位。3 Connection 接口:應用程序與數據庫之間的連接。 常用方法: void close()立即釋放此 Connection 對象的數據庫和 JDBC 資源,而不是等待它們被自動釋放。 StatementcreateStatement()創(chuàng)建一個 Statement 對象來將 SQL 語句發(fā)送到數據庫。Statement createStatement(int resultSetType, int resultSetConcurrency) 創(chuàng)建一個 Statement 對象,該對象將生成具有給定類型和并發(fā)性

17、的 ResultSet 對象。 boolean isClosed()檢索此 Connection 對象是否已經被關閉。PreparedStatement prepareStatement(String sql)創(chuàng)建一個 PreparedStatement 對象來將參數化的 SQL 語句發(fā)送到數據庫。4.Statement 接口:用來執(zhí)行查詢和更新操作。常用方法:void close()立即釋放此 Statement 對象的數據庫和 JDBC 資源,而不是等待該對象自動關閉時 發(fā)生此操作。boolean execute(String sql)執(zhí)行給定的 SQL 語句,該語句可能返回多個結果。 R

18、esultSet executeQuery(String sql)執(zhí)行給定的 SQL 語句,該語句返回單個 ResultSet 對象。int executeUpdate(String sql)執(zhí)行給定 SQL 語句,該語句可能為 INSERT 、 UPDATE 或 DELETE 語句,或者不 返回任何內容的 SQL 語句(如 SQL DDL 語句)。Connection getConnection()檢索生成此 Statement 對象的 Connection 對象。int getMaxRows()檢索由此 Statement 對象生成的 ResultSet 對象可以包含的最大行數。Resul

19、tSet getResultSet()以 ResultSet 對象的形式檢索當前結果。5.PreparedStatement 接口:表示預編譯的 SQL 語句的對象。本接口的超級接口是 Stateme nt,常用方法如下:boolean execute()在此 PreparedStatement 對象中執(zhí)行 SQL 語句,該語句可以是任何種類的SQL 語句。ResultSet executeQuery()在此 PreparedStatement 對象中執(zhí)行 SQL 查詢,并返回該查詢生成的ResultSet 對象。int executeUpdate()在此 PreparedStatement

20、對象中執(zhí)行 SQL 語句,該語句必須是一個 SQL INSERT 、 UPDATE 或DELETE 語句;或者是一個什么都不返回的 SQL 語句,比如 DDL 語句。使用此語句時,可使用“占位符”來表示 SQL 命令中的可變部分,大量節(jié)省過濾 SQL 關鍵字的繁瑣工作。例如:String str= ”update stu set name=? where id=?”。PerparedStatement ps=conn.prepareStatement(str)。Ps.setString(1,李美麗)。Ps.setString(2,”20050703013”)。此處在寫 SQL 語句時,每個“?

21、”代表一個占位符,寫完 SQL 語句后,再設置占位 符的內容。6.ResultSet:表示數據庫結果集的數據表,通常通過執(zhí)行查詢數據庫的語句生成。ResultSet 對象具有指向其當前數據行的指針。最初,指針被置于第一行之前。next 方法將指針移動到下一行;因為該方法在ResultSet 對象中沒有下一行時返回 false,所以可以在 while 循環(huán)中使用它來顯示結果集。常用方法:int getRow() 檢索當前行編號。Statement getStatement() 檢索生成此 ResultSet 對象的 Statement 對象。String getString(int column

22、Index)以 Java 編程語言中 String 的形式檢索此 ResultSet 對象的當前行中指定列的值。String getString(String columnName)以 Java 編程語言中 String 的形式檢索此 ResultSet 對象的當前行中指定列的值。boolean first()將指針移動到此 ResultSet 對象的第一行。void afterLast()將指針移動到此 ResultSet 對象的末尾,正好位于最后一行之后。void beforeFirst()將指針移動到此 ResultSet 對象的開頭,正好位于第一行之前。 boolean last()將

23、指針移動到此 ResultSet 對象的最后一行。 void moveToCurrentRow()將指針移動到記住的指針位置,通常為當前行。void moveToInsertRow() 將指針移動到插入行。boolean next() 將指針從當前位置下移一行。boolean previous() 將指針移動到此 ResultSet 對象的上一行。void insertRow() 將插入行的內容插入到此 ResultSet 對象和數據庫中。void deleteRow()從此 ResultSet 對象和底層數據庫中刪除當前行。void updateString(int columnIndex,

24、 String x)用 String 值更新指定列。void updateString(String columnName, String x)用 String 值更新指定列。void close()立即釋放此 ResultSet 對象的數據庫和 JDBC 資源,而不是等待該對象自動關閉時 發(fā)生此操作。7. RowSetMetaData 接口RowSetMetaData 對象可用于獲取 ResultSet 對象字段的類型和屬性等信息。 常用的方法有:String getCatalogName(int column) 獲取指定列的表目錄名稱。String getColumnClassName(i

25、nt column) 如果調用方法 ResultSet.getObject 從列中檢索值,則返回構造其實例的 Java 類 的完全限定名稱。int getColumnCount() 返回此 ResultSet 對象中的列數,即字段的個數。int getColumnDisplaySize(int column) 指示指定列的最大標準寬度,以字符為單位,即字段的長度。String getColumnName(int column) 獲取指定列的名稱,即字段名。String getColumnTypeName(int column) 檢索指定列的數據庫特定的類型名稱,即字段的類型名稱。String

26、getTableName(int column)獲取字段所屬的表的名稱。boolean isCaseSensitive(int column) 指示字段是否區(qū)分大小寫。int isNullable(int column) 指示指定列中的值是否可以為 null 。8.3 案例-數據庫連接與操作實例本例以建立一個商品管理系統(tǒng)為例,說明在Java 中對數據庫操作的基本方法。示例中的數據庫以 Access 數據庫為例。8.3.1 建立 ODBC 數據源1.建立 Access 數據庫Access 是微軟的 Ofice 辦公軟件中的一個組件,是一個比較常用的小型數據庫管理系 統(tǒng)。打開Access,建立數據

27、庫 student.mdb,保存在 E 盤 Myjava 文件夾下。在數據庫中建 立如下圖所示兩個數據表,學生表stu 和班級表 bj。 stu: :表表也錄:回斗Ir GEJSDIE3共育述錄數:T圖 8-5 學生表 hj二表匚I1曰反cnameteachercroflimbw計篡機應計篡機應用用1班班 劉老仲劉老仲205D5計算機應用計算機應用2班班 李老師李老師310底計算機應用底計算機應用3班班孫老師孫老師207l|記錄:回|1 12回回1闔闔共有記錄數:共有記錄數:3圖 8-6 班級表2建立 ODBC 數據源nameLLJ. 1 .1 A1M李力評20050701002張華20060

28、702003孫曉月2005002004王明明20tE0702C(K劉玉2005003006周麗琵20050703007李軍sen:1997-05-0419S6-12-031997-09-0519S6-11-231986-12-31987-03-121937-05-14score530470513469bj05 計理機應用 105 計算機應用 1班OSit機應用 2班05 計宜467 OSit機應用孑班532 05計宜機應用 3班圖 8-4 顯示了上述接口與類之間的關系。(1) 打開“開始”菜單一“控制面板”“管理工具”“數據源(ODBC)”(2) 在打開的“ ODBC 數據源管理器”窗口中選擇

29、“系統(tǒng) DSN”,如圖 8-7 所示。圖 8-7 ODBC 數據源系統(tǒng) DSN(3) 單擊“添加”按鈕,在彈出的對話框中選擇“ Microsoft Access Driver(*.mdb) ”,如圖 8-8 所示。圖 8-8 創(chuàng)建新數據源(4)單擊“完成”按鈕,在彈出的對話框中輸入“數據源名”,mysource,然后單擊選擇”按鈕,選定 F 盤 myjava 文件夾下的 student.mdb 文件,如圖 8-9 所示。ODBC讓rosot Access安裝圖 8-9 設置數據源(5)單擊“確定”按鈕, ODBC 數據源設置完成。8.3.2 建立連接數據類建立數據連接主要使用Driver 接口

30、,Connection 接口和 DriverManager 類。類 Conn.java 代碼如下:import java.sql.*。/力幟 sql 包public class ConnConnection con=null。public Connection getC onn()tryString driverName=sun.jdbc.odbc.JdbcOdbcDriver。指定驅動程序Class.forName(driverName)。String constr=jdbc:odbc:mysource。/指定 URLcon=DriverManager.getConnection(const

31、r)。catch(Excepti on e)e.printStackTrace()。retur n con。public void closeConn(Connection cc)/ 該方法判斷數據庫是否關閉,if(cc!=null)/若未關閉,關閉數據庫tryif(!cc.isClosed()cc.close()。catch(SQLException e)e.printStackTrace()。public String testConn() / 測試數據庫是否連接成功 if(con=null)return error 。elsereturn success 。 說明:( 1)本類主要有三個

32、方法。方法 getConn() 是一個有返回值的方法, 當連接成功時, 返回連接變量, 連接不成功 時, 返回 null 。方法 closeConn() 用于關閉連接。方法 testConn() 也是一個有返回值的方法,用于測試連接是否成功。 (2)本類沒有主方法,可由其它類調用本類實現(xiàn)與數據庫的連接。測試類 Test.java。 本類主要用于測試連接數據庫是否成功。public class Testpublic static void main(String args)Conn cc=new Conn() 。cc.getConn() 。System.out.println(cc.testCo

33、nn() 。 8.3.3 數據操作常用的數據操作包括數據庫數據的添加,修改,刪除,利用SQL 語句實現(xiàn)。Statement 接口可以將 SQL 命令傳遞給數據庫,并返回數據庫執(zhí)行 SQL 命令的結果。 使用PreparedStatement 語句時,可使用“占位符”來表示 SQL 命令中的可變部分,提高效 率。類 StuM.java 包括了三個方法,分別用來實現(xiàn)對學生表( stu)的添加,刪除,修改操 作。代碼如下:import java.sql.* 。import java.util.* 。public class StuM/添加記錄public void addStu(String id,

34、String name,String sex,String birthday,String score,Stringbj) Connection con=null 。Conn cc=new Conn() 。trycon=cc.getConn() 。PreparedStatement ps=con.prepareStatement(insert into stu values(?,?,?,?,?,?)。ps.setString(1,id) 。ps.setString(2,name) 。ps.setString(3,sex) 。ps.setString(4,birthday) 。int cj=In

35、teger.parseInt(score) 。ps.setInt(5,cj) 。ps.setString(6,bj) 。ps.executeUpdate() 。ps.close() 。catch(Exception e) System.out.println( 添加錯誤! ) 。finally cc.closeConn(con) 。/ 刪除記錄public void delStu(String id)Conn cc=new Conn() 。Connection con=null 。try con=cc.getConn() 。 PreparedStatement ps=con.prepareSt

36、atement(delete from stuwhere id=?) 。 ps.setString(1,id) 。ps.executeUpdate() 。ps.close() 。catch(Exception e) System.out.print( 錯誤 ) 。finally cc.closeConn(con) 。/ 修改記錄public void updateStu(String id,String name,String sex,String birthday,String score,String bj)Connection con=null 。Conn cc=new Conn() 。

37、try con=cc.getConn() 。PreparedStatement ps=con.prepareStatement(update stu setname=?,sex=?,birthday=?,score=?,bj=? where id=?) 。ps.setString(1,name)。ps.setString(2,sex) 。ps.setString(3,birthday) 。int cj=Integer.parseInt(score) 。ps.setInt(4,cj) 。ps.setString(5,bj) 。ps.setString(6,id) 。ps.executeUpdat

38、e() 。ps.close() 。catch(Exception e)System.out.println( 錯誤! ) 。finally cc.closeConn(con) 。 類 TestAdd.java , TestDel.java , TestUpdate.java 分別用來測試類 StuM.java 的三個方法 是否正確。TestAdd.javapublic class TestAddpublic static void main(String args)StuM ss=new StuM() 。 ss.addStu(args0,args1,args2,args3,args4,args

39、5) 。 TestDel.javapublic class TestDelpublic static void main(String args)StuM ss=new StuM() 。ss.delStu(args0) 。 TestUpdate.javapublic class TestUpdatepublic static void main(String args)StuM ss=new StuM() 。 ss.updateStu(args0,args1,args2,args3,args4,args5) 。 這三個測試類,都是通過命令行參數輸入內容,主要是用于測試 StuM 類中的方法是

40、否正確。其中入學成績(score)是整型,所以在添加方法和修改方法中都要注意類型轉換。8.3.4 數據查詢ResultSet 接口用來處理執(zhí)行SQL 語句產生的查詢結果表,ResultSetMetaData 接口用來獲取表中字段的信息。類 DispStu,可顯示表 stu 中的所有記錄。DispStu.javaimport java.sql.* 。import java.util.* 。public class DispStu/ 查詢全部記錄public static void main(String args)Connection con=null 。Conn cc=new Conn() 。

41、Statement stm=null 。try con=cc.getConn() 。stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONL Y) 。ResultSet rst=stm.executeQuery(select * from stu) 。 while(rst.next()System.out.println(rst.getString(1)+ +rst.getString(2)+ +rst.getString(3)+rst.getString(4)+ +rst.getInt(

42、5)+ +rst.getString(6) 。catch(Exception e) System.out.println( 錯誤! ) 。finally cc.closeConn(con) 。 ResultSet 接口的 getString() , getInt() 等方法可以獲取記錄信息,注意字段索引從1 開始。類 DispField 利用 ResultSetMetaData 接口顯示表 stu 中的所有字段信息。import java.sql.* 。import java.util.* 。public class DispField/ 查詢字段信息public static void ma

43、in(String args)Connection con=null 。Conn cc=new Conn() 。Statement stm=null 。try con=cc.getConn() 。 stm=con.createStatement()。 ResultSetrst=stm.executeQuery(select * from stu) 。 ResultSetMetaDatarsmd=rst.getMetaData() 。 System.out.println( 表名稱: +rsmd.getTableName(1) 。System.out.println( 表字段個數: +rsmd.

44、getColumnCount() 。 for(int i=1 。istast數-d:(J:d:(J: 1 1戒個:1:1董5名名:birthday爲DATETIMEE EC CeITReITR r r N N 1 1 A A0 0oiloil u u 5 5 c c : : : : JJBaBa :s:s型度:h:h型度名類長名類長圖 8-10類 DispStu 和類 DispField 都是通過主方法顯示記錄及字段,這樣不利于類的重用,下 面我們編寫一個類,將表中取出的記錄存放在向量類Vector 中。類 StuM find 只有一個方法,該方法可將要查詢的表中的所有記錄存于向量類Vecto

45、r。import java.sql.* 。import java.util.* 。 public class StuM_find/ 查詢全部記錄public Vector findAll()Connection con=null 。Conn cc=new Conn() 。Statement stm=null 。Vector vv=new Vector() 。try con=cc.getConn() 。stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ ONLY) 。ResultSet rs

46、t=stm.executeQuery(select * from stu) 。 while(rst.next()vv.add(newStu(rst.getString(1),rst.getString(2),rst.getString(3),rst.getString(4),rst.getInt(5),rst.getString(6)。rst.close() 。 stm.close() 。catch(Exception e) System.out.println( 錯誤! ) 。finally cc.closeConn(con) 。return vv 。 類 Stu 是對學生類的描述。Stu.

47、javaimport java.util.* 。import java.sql.* 。public class TestFindpublic static void main(String args)StuM_find sf=new StuM_find() 。for(Iterator it=sf.findAll() 。 it.hasNext() 。 )Stu st=(Stu)it.next() 。System.out.println(st.getId()+ +st.getName()+ +st.getSex()+ +st.getBirthday()+st.getScore()+ +st.get

48、Bj() 。 類 TestFind 調用類 StuM_Find 的方法顯示出 stu 表中的全部記錄,本類中用到了學生類Stu。TestFind.javaimport java.util.* 。import java.sql.* 。public class TestFindpublic static void main(String args)StuM_find sf=new StuM_find() 。Vector vstu=sf.findAll() 。int vn=vstu.size() 。Stu st=new Stu() 。System.out.println(st.getId() 。fo

49、r(int i=0 。 ivn 。 i+)st=(Stu)vstu.get(i) 。System.out.println(st.getId()+ +st.getName()+ +st.getSex()+ +st.getBirthday()+st.getScore()+ +st.getBj() 。 類 StuM_Find 也可以與前面的類 StuM 合并,將方法加入類 StuM 中。本類查詢的是 stu 表中的全部記錄,也可以查詢滿足條件的指定記錄,可通過修改Result 接 口 的 初 始 化 語 句 的 SQL 語 句 實 現(xiàn) , 如 本 例 中 的 初 始 化 語 句 為 ResultSe

50、trst=stm.executeQuery(select * from stu) ,將 SQL 語句改為 select * from stu where id= & idstr &“。”本句中 id 為字段名, idstr 為指定條件的變量。這樣查詢出來的記錄為編號為變 量 idstr 的內容。8.3.5 數據庫應用的 GUI 界面實現(xiàn)前幾節(jié)介紹了數據庫的添加,刪除,修改等簡單操作,這些操作是通過命令行參數實現(xiàn)的,本節(jié)以刪除和查詢?yōu)槔唵谓榻B一下,利用 GUI 界面實現(xiàn)數據庫的操作。界面如圖 8-11 所示。命輸心星BHIK的學土的id號:刖1際騙號性別出生日期300507010.男1907-

51、06-0 .490ooitsm.200507010. 匪華男1986-12-0.5301町十苜機應200507020.女1987-09-0.470II乩+負機應200507020. 王奧明玄1906-11-2.513忙計算呃.200507020.立199E-12-D .4盟2Q0507Q30,. 周麗萍1907-03-1487站計首機應200507030. 李軍黒1997-05-1 .532KL+機應圖 8-11 刪除界面類 DispGui 代碼如下:DispGui.javaimport java.awt.event.*。import javax.swing.*。import java.uti

52、l.*。public class DataGui exte nds JFrame impleme nts Actio nListe nerStuM_find sf。Vector vn。JTable jt。JTextField jtf= new JTextField(20)。設置界面public DataGui()sf=new StuM_find()。this.setSize(600,500)。this.setLocation(200,200)。this.setDefaultCloseOperatio n( JFrame.EXIT_ON_CLOSE)。JPa nel jp=ne

53、w JPa nel()。JButton jbtndel=new JButton(刪除)。jbtndel.addActionListener(this)。jp.add(new JLabel(請輸入您要刪除的學生的id 號:)。jp.add(jtf)。jp.add(jbtndel)。dispcoIname()。dispall()。JScrollPane js = new JScrollPane(jt)。jp.add(js) 。 this.add(jp) 。 this.setVisible(true) 。 / 顯示表頭 void dispcolname() vstu=sf.findAll() 。 v

54、n=vstu.size() 。String tcol= 編號,姓名,性別,出生日期 ,入學成績 ,所在班級 。String trow=newStringvn6 。jt=new JTable(trow,tcol) 。/ 顯示表內容 void dispall()for(int i=0 。 ivn 。 i+) for(int j=0 。 j6 。 j+) jt.setValueAt(,i,j) 。 vstu=sf.findAll() 。 vn=vstu.size() 。 Stu st=new Stu() 。 for(int i=0 。 ivn 。i+) st=(Stu)vstu.get(i) 。 j

55、t.setValueAt(st.getId(),i,0) 。 jt.setValueAt(st.getName(),i,1) 。jt.setValueAt(st.getSex(),i,2) 。 jt.setValueAt(st.getBirthday(),i,3) 。jt.setValueAt(st.getScore()+,i,4) 。 jt.setValueAt(st.getBj(),i,5) 。 public void actionPerformed(ActionEvent e)StuM ss=new StuM() 。 ss.delStu(jtf.getText().trim() 。 di

56、spall() 。public static void main(String args)new DataGui() 。 本例調用類 StuM_Find 的 findAll() 方法,利用 JTable 顯示數據表內容,調用類的 delStu() 方法刪除表中的記錄。JDBC 是用來提供 Java 程序連結與存取數據庫的套件,包含了一組類和接口,使得程 序員可以通過一致的方式存取各個不同的關連式數據庫系統(tǒng)。JDBC 驅動程序包括四類:JDBC-ODBC 橋、部分 Java 技術的本地 API 驅動程序、全 部基于 Java技術的本地 API 驅動程序、全部基于Java 技術的本地協(xié)議驅動程序。JDBC URL 提供了一種標識數據庫的方法,可以使相應的驅動程序能識別數據庫并與 之建立連接。JDBC URL 的標準

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論