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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

19、tSet getResultSet()以 ResultSet 對象的形式檢索當前結(jié)果。5.PreparedStatement 接口:表示預(yù)編譯的 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 關(guān)鍵字的繁瑣工作。例如:String str= ”update stu set name=? where id=?”。PerparedStatement ps=conn.prepareStatement(str)。Ps.setString(1,李美麗)。Ps.setString(2,”20050703013”)。此處在寫 SQL 語句時,每個“?

21、”代表一個占位符,寫完 SQL 語句后,再設(shè)置占位 符的內(nèi)容。6.ResultSet:表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet 對象具有指向其當前數(shù)據(jù)行的指針。最初,指針被置于第一行之前。next 方法將指針移動到下一行;因為該方法在ResultSet 對象中沒有下一行時返回 false,所以可以在 while 循環(huán)中使用它來顯示結(jié)果集。常用方法: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() 將插入行的內(nèi)容插入到此 ResultSet 對象和數(shù)據(jù)庫中。void deleteRow()從此 ResultSet 對象和底層數(shù)據(jù)庫中刪除當前行。void updateString(int columnIndex,

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

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

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

27、庫 student.mdb,保存在 E 盤 Myjava 文件夾下。在數(shù)據(jù)庫中建 立如下圖所示兩個數(shù)據(jù)表,學生表stu 和班級表 bj。 stu: :表表也錄:回斗Ir GEJSDIE3共育述錄數(shù):T圖 8-5 學生表 hj二表匚I1曰反cnameteachercroflimbw計篡機應(yīng)計篡機應(yīng)用用1班班 劉老仲劉老仲205D5計算機應(yīng)用計算機應(yīng)用2班班 李老師李老師310底計算機應(yīng)用底計算機應(yīng)用3班班孫老師孫老師207l|記錄:回|1 12回回1闔闔共有記錄數(shù):共有記錄數(shù):3圖 8-6 班級表2建立 ODBC 數(shù)據(jù)源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 計理機應(yīng)用 105 計算機應(yīng)用 1班OSit機應(yīng)用 2班05 計宜467 OSit機應(yīng)用孑班532 05計宜機應(yīng)用 3班圖 8-4 顯示了上述接口與類之間的關(guān)系。(1) 打開“開始”菜單一“控制面板”“管理工具”“數(shù)據(jù)源(ODBC)”(2) 在打開的“ ODBC 數(shù)據(jù)源管理器”窗口中選擇

29、“系統(tǒng) DSN”,如圖 8-7 所示。圖 8-7 ODBC 數(shù)據(jù)源系統(tǒng) DSN(3) 單擊“添加”按鈕,在彈出的對話框中選擇“ Microsoft Access Driver(*.mdb) ”,如圖 8-8 所示。圖 8-8 創(chuàng)建新數(shù)據(jù)源(4)單擊“完成”按鈕,在彈出的對話框中輸入“數(shù)據(jù)源名”,mysource,然后單擊選擇”按鈕,選定 F 盤 myjava 文件夾下的 student.mdb 文件,如圖 8-9 所示。ODBC讓rosot Access安裝圖 8-9 設(shè)置數(shù)據(jù)源(5)單擊“確定”按鈕, ODBC 數(shù)據(jù)源設(shè)置完成。8.3.2 建立連接數(shù)據(jù)類建立數(shù)據(jù)連接主要使用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。指定驅(qū)動程序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)/ 該方法判斷數(shù)據(jù)庫是否關(guān)閉,if(cc!=null)/若未關(guān)閉,關(guān)閉數(shù)據(jù)庫tryif(!cc.isClosed()cc.close()。catch(SQLException e)e.printStackTrace()。public String testConn() / 測試數(shù)據(jù)庫是否連接成功 if(con=null)return error 。elsereturn success 。 說明:( 1)本類主要有三個

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

33、nn() 。 8.3.3 數(shù)據(jù)操作常用的數(shù)據(jù)操作包括數(shù)據(jù)庫數(shù)據(jù)的添加,修改,刪除,利用SQL 語句實現(xiàn)。Statement 接口可以將 SQL 命令傳遞給數(shù)據(jù)庫,并返回數(shù)據(jù)庫執(zhí)行 SQL 命令的結(jié)果。 使用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) 。 這三個測試類,都是通過命令行參數(shù)輸入內(nèi)容,主要是用于測試 StuM 類中的方法是

40、否正確。其中入學成績(score)是整型,所以在添加方法和修改方法中都要注意類型轉(zhuǎn)換。8.3.4 數(shù)據(jù)查詢ResultSet 接口用來處理執(zhí)行SQL 語句產(chǎn)生的查詢結(jié)果表,ResultSetMetaData 接口用來獲取表中字段的信息。類 DispStu,可顯示表 stu 中的所有記錄。DispStu.javaimport java.sql.* 。import java.util.* 。public class DispStu/ 查詢?nèi)坑涗沺ublic 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( 表字段個數(shù): +rsmd.

44、getColumnCount() 。 for(int i=1 。istast數(shù)-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/ 查詢?nèi)坑涗沺ublic 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 調(diào)用類 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 的內(nèi)容。8.3.5 數(shù)據(jù)庫應(yīng)用的 GUI 界面實現(xiàn)前幾節(jié)介紹了數(shù)據(jù)庫的添加,刪除,修改等簡單操作,這些操作是通過命令行參數(shù)實現(xiàn)的,本節(jié)以刪除和查詢?yōu)槔唵谓榻B一下,利用 GUI 界面實現(xiàn)數(shù)據(jù)庫的操作。界面如圖 8-11 所示。命輸心星BHIK的學土的id號:刖1際騙號性別出生日期300507010.男1907-

51、06-0 .490ooitsm.200507010. 匪華男1986-12-0.5301町十苜機應(yīng)200507020.女1987-09-0.470II乩+負機應(yīng)200507020. 王奧明玄1906-11-2.513忙計算呃.200507020.立199E-12-D .4盟2Q0507Q30,. 周麗萍1907-03-1487站計首機應(yīng)200507030. 李軍黒1997-05-1 .532KL+機應(yīng)圖 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)。設(shè)置界面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) 。/ 顯示表內(nèi)容 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() 。 本例調(diào)用類 StuM_Find 的 findAll() 方法,利用 JTable 顯示數(shù)據(jù)表內(nèi)容,調(diào)用類的 delStu() 方法刪除表中的記錄。JDBC 是用來提供 Java 程序連結(jié)與存取數(shù)據(jù)庫的套件,包含了一組類和接口,使得程 序員可以通過一致的方式存取各個不同的關(guān)連式數(shù)據(jù)庫系統(tǒng)。JDBC 驅(qū)動程序包括四類:JDBC-ODBC 橋、部分 Java 技術(shù)的本地 API 驅(qū)動程序、全 部基于 Java技術(shù)的本地 API 驅(qū)動程序、全部基于Java 技術(shù)的本地協(xié)議驅(qū)動程序。JDBC URL 提供了一種標識數(shù)據(jù)庫的方法,可以使相應(yīng)的驅(qū)動程序能識別數(shù)據(jù)庫并與 之建立連接。JDBC URL 的標準

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論