600 likes | 805 Views
第 16 章 JDBC 資料庫處理. 16-1 JDBC的基礎 16-2 使用Access建立資料庫 16-3 資料庫的基本存取 16-4 資料庫查詢 16-5 插入、更新與刪除記錄 16-6 專案實例:圖書資料庫系統. 16-1 JDBC 的基礎 - 說明. 「 JDBC 」( Java Database Connectivity )是實作 JDBC 驅動程式介面( JDBC Driver Interface )的類別,可以讓 Java 程式執行 SQL 指令存取資料庫系統的記錄資料。
E N D
第16章 JDBC資料庫處理 • 16-1 JDBC的基礎 • 16-2 使用Access建立資料庫 • 16-3 資料庫的基本存取 • 16-4 資料庫查詢 • 16-5 插入、更新與刪除記錄 • 16-6 專案實例:圖書資料庫系統
16-1 JDBC的基礎-說明 • 「JDBC」(Java Database Connectivity)是實作JDBC驅動程式介面(JDBC Driver Interface)的類別,可以讓Java程式執行SQL指令存取資料庫系統的記錄資料。 • 例如:微軟SQL Server、Access、MySQL和Oracle等。
16-1 JDBC的基礎-種類 • JDBC-ODBC橋接驅動程式(JDBC-ODBC Bridge):Java程式可以存取微軟ODBC資料來源的資料庫系統,本章就是以JDBC驅動程式為例。 • 原生API的Java驅動程式(A Native-API Partly Java Driver):將Java程式的JDBC呼叫轉換成專屬資料庫系統的原生API呼叫。 • Java網路協定驅動程式(A Net-protocol All Java Driver):將Java程式的JDBC呼叫轉換成資料庫系統專屬的網路協定,再由伺服器轉換成資料庫系統的API呼叫。 • Java原生通訊協定驅動程式(A Native-protocol All Java Driver):將Java程式的JDBC呼叫直接轉換成資料庫系統原生通訊協定的API呼叫,以便客戶端可以直接連線資料庫伺服器。
16-1 JDBC的基礎-圖例 • 在本章的Java應用程式是使用JDBC的JDBC-ODBC橋接驅動程式,透過JDBC-ODBC驅動程式存取ODBC資料來源的關聯式資料庫系統Access,如右圖所示:
16-2 使用Access建立資料庫-說明 • Office家族的Access是一套桌上型資料庫系統,適合個人和中小企業使用,筆者準備使用Access建立本章Java應用程式使用JDBC連接的資料庫。
16-2 使用Access建立資料庫-欄位說明 • 在Books.mdb資料庫擁有資料表Book,各欄位的說明,如下表所示:
16-3 資料庫的基本存取 • 16-3-1 新增ODBC系統資料來源 • 16-3-2 建立JDBC資料連接 • 16-3-3 取得資料表的資訊 • 16-3-4 顯示資料表記錄
16-3-1 新增ODBC系統資料來源 • 在Windows作業系統建立ODBC系統資料來源,筆者準備在Windows XP作業系統的電腦新增Access資料庫「Books.mdb」名為【book_list】的ODBC系統資料來源,如下圖所示:
16-3-2 建立JDBC資料連接-步驟一 步驟一:載入驅動程式 • 在Java應用程式首先需要載入驅動程式,因為是透過ODBC存取資料庫,所以載入JDBC-ODBC驅動程式,如下所示: String sDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; Class.forName(sDriver); • 上述程式碼的字串sDriver是驅動程式名稱,接著載入JDBC-ODBC驅動程式。
16-3-2 建立JDBC資料連接-步驟二(說明) 步驟二:建立Connection連接物件 • 在載入JDBC-ODBC驅動程式後,就可以使用DriverManager類別的getConnection()類別方法建立Connection物件dbCon,如下所示: String sCon = "jdbc:odbc:book_list"; dbCon = DriverManager.getConnection(sCon);
16-3-2 建立JDBC資料連結-步驟二(通訊協定) • jdbc:通訊協定的URL字串,其格式如下所示: jdbc:<subprotocol>:<subname> • subprotocol以此例是odbc,subname是系統資料來源book_list。DriverManager類別的相關方法,如下表所示:
16-3-2 建立JDBC資料連接-步驟三 步驟三:建立JDBC的Statement物件 • Statement物件的目的是執行SQL指令,在建立好Connection物件後,就可以使用createStatement()方法建立Statement物件,如下所示: Statement stmt = dbCon.createStatement(); • Connection類別相關方法,如下表所示:
16-3-3 取得資料表的資訊-說明 • 在建立資料庫連接和Statement物件後,就可以進一步取得資料表資訊和資料表的記錄資料。 • 在這一節先說明如何取得資料表資訊,也就是資料表擁有多少欄位、各欄位名稱和資料類型,下一節將說明如何執行SQL指令取得資料表的記錄資料。取得資料表資訊的步驟是繼續第16-3-2節的步驟三。
16-3-3 取得資料表的資訊-步驟四(說明) 步驟四:使用Statement物件執行SQL指令 • 在前面已經說過,建立Statement物件的目的就是為了執行SQL指令,如下所示: boolean state = stmt.execute(sSQL); • 上述程式碼的execute()方法執行參數的SQL指令字串sSQL,這個SQL查詢指令字串可以取得資料表Book的所有記錄。
16-3-3 取得資料表的資訊-步驟四(方法) • Statement類別的相關方法,如下表所示:
16-3-3 取得資料表的資訊-步驟五(說明) 步驟五:取得ResultSet和ResultSetMetaData物件 • 在使用Statement物件執行SQL指令後,接著使用getResultSet()方法取得ResultSet物件,如下所示: ResultSet rs = stmt.getResultSet(); • 程式碼在取得ResultSet物件後,使用getMetaData()方法取得ResultSetMetaData物件,如下所示: ResultSetMetaData md = rs.getMetaData();
16-3-3 取得資料表的資訊-步驟五(方法) • ResultSetMetaData類別的相關方法,如下表所示:
16-3-4 顯示資料表記錄-說明 • 在這一節筆者準備執行SQL查詢指令取得資料表的記錄資料,步驟是繼續第16-3-2節的步驟三。
16-3-4 顯示資料表記錄-步驟四 步驟四:使用Statement物件執行SQL指令 • 在Java程式執行SQL查詢指令可以取得查詢結果的ResultSet物件,不同於第16-3-3節,在這一節是直接使用executeQuery()方法取得ResultSet物件,如下所示: ResultSet rs = stmt.executeQuery(sSQL); • 程式碼取得參數SQL指令sSQL查詢結果的ResultSet物件,參數的SQL查詢指令可以取得資料表Book的所有記錄。
16-3-4 顯示資料表記錄-步驟五 步驟五:使用迴圈取得ResultSet物件的記錄 • 在取得查詢結果的ResultSet物件後,可以使用while迴圈配合next()方法顯示記錄,如下所示: while ( rs.next() ) { int num; // 欄位編號 num = rs.findColumn("BookID"); System.out.print(num + ": "); System.out.print(rs.getString("BookID")); ……… }
16-3-4 顯示資料表記錄-步驟六 步驟六:關閉連接的Connection和Statement物件 • 在處理完資料庫的查詢或操作後,Java程式需要關閉Connection和Statement物件,使用的都是close()方法,如下所示: stmt.close(); dbCon.close();
16-4 SQL語言的資料庫查詢 • 16-4-1 SQL語言的基礎 • 16-4-2 SQL查詢的程式範例 • 16-4-3 GUI介面的SQL查詢程式
16-4 SQL語言的資料庫查詢-說明 • Java應用程式搭配資料庫的目的,主要是為了更有效率且快速的查詢記錄資料,SQL語言是一種資料庫查詢語言,在Java程式是使用Statement物件來執行SQL指令來進行資料庫的查詢。
16-4 SQL語言的資料庫查詢-類別方法 • 在JDBC類別提供3個類別方法,可以分別開啟資料庫連接、執行SQL查詢和關閉資料庫連接,其說明如下表所示:
16-4 SQL語言的資料庫查詢-類別變數 • 在JDBC類別提供2個類別變數參考Connection和Statement物件,其說明如下表所示:
16-4-1 SQL語言的基礎-SQL簡介 • 「SQL」(Structured Query Language)為「ANSI」(American National Standards Institute)標準的資料庫語言,SQL指令語法可以用來查詢、新增、刪除和更新資料庫的記錄,目前Access、SQL Server、DB2、MySQL、MySQL MaxDB、Oracle和Sybase等資料庫管理系統都以ANSI的SQL語言作為標準的資料庫語言。 • 早在1970年,E. F. Codd建立關聯性資料庫的觀念,同時提出構想的資料庫語言,這是一種完整和通用的資料存取方式,雖然在當時並沒有真正建立語法,但這就是SQL的源起。
16-4-1 SQL語言的基礎-分類 • SQL語言的指令可以分為三大部分,如下表所示: • 資料定義語言(Data Definition Language,DLL):建立資料表、索引和視界(Views)等,並且定義資料表的欄位。 • 資料操作語言(Data Manipulation Language,DML):屬於資料表記錄查詢、插入、刪除和更新指令。 • 資料控制語言(Data Control Language,DCL):屬於資料庫安全設定和權限管理的相關指令。
16-4-1 SQL語言的基礎-SELECT指令說明 SQL查詢指令 - SELECT • Java程式在使用JDBC連結資料庫後,可以使用SQL指令進行資料庫查詢,SQL的資料查詢指令只有一個SELECT指令,完整指令語法如下所示: SELECT 欄位1, 欄位2 FROM 資料表 WHERE conditions • 上述SELECT指令的欄位1~2為記錄的欄位,conditions是查詢條件,指令使用口語來說是「從資料表取回符合WHERE子句條件的記錄,顯示欄位1和2」。
16-4-1 SQL語言的基礎-指令1 “*”記錄欄位 • 在上述SQL語法的欄位1~2是取回的資料表欄位,我們可以使用”*”符號代表所有欄位,表示取回資料表記錄的所有欄位,如下所示: SELECT * FROM Book • 上述指令沒有WHERE子句,所以將資料表內所有的記錄和欄位取回。
16-4-1 SQL語言的基礎-指令2 單一查詢條件的WHERE子句 • SQL查詢指令的單一條件,WHERE子句的基本規則和範例,如下所示: • 文字欄位要加上單引號,例如:書號S752,如下所示: SELECT * FROM Book WHERE BookID=’ S752’ • 數值欄位並不需要額外的字元括起,例如:書價大於550元,如下所示: SELECT * FROM Book WHERE BookPrice > 550
16-4-1 SQL語言的基礎-指令3 • 文字的欄位可以使用【LIKE】包含運算子配合”%”萬用字元,此時查詢的條件子句只需包含的子字串就符合條件,例如:書號內包含有“7”的子字串,如下所示: SELECT * FROM Book WHERE BookID LIKE ‘%7%’ • 數值或日期欄位可以使用<>、>、<、>=和<=不等於、大於、小於、大於等於和小於等於等運算子建立多樣化的查詢條件。
16-4-1 SQL語言的基礎-指令4 多重查詢條件的WHERE子句 • WHERE子句的查詢條件可以使用AND和OR邏輯運算子連接,其基本語法,如下所示: • AND且運算子:連接的前後條件都必須成立,整個條件才成立,例如:書號包含「7」且書名有「資料庫」的子字串,如下所示: SELECT * FROM Book WHERE BookID LIKE ‘%7%’ AND BookTitle LIKE ‘%資料庫%’ • OR或運算子:連接的前後條件只需任何一個成立即可,例如:書號包含「5」或書名有「設計」的子字串,如下所示: SELECT * FROM Book WHERE BookID LIKE ‘%5%’ OR BookTitle LIKE ‘%設計%’
16-4-1 SQL語言的基礎-指令5 排序輸出 • SQL的查詢結果可以指定欄位進行由小到大,或由大到小排序,只需在SELECT指令的最後加上ORDER BY子句即可,如下所示: SELECT * FROM Book WHERE BookPrice>=550 ORDER BY BookPrice • 上述查詢結果使用BookPrice欄位排序,預設是由小到大的ASC,如果想倒過來由大到小,只需加上DESC,如下所示: SELECT * FROM Book WHERE BookPrice>=550 ORDER BY BookPrice DESC
16-4-2 SQL查詢的程式範例 • 為了方便讀者測試第16-4-1節的SQL查詢指令,筆者準備建立命令列和第16-4-3節GUI介面的2種資料庫查詢程式,只需輸入SQL指令敘述,就可以查詢資料庫的記錄資料。
16-4-3 GUI介面的SQL查詢程式 • GUI介面查詢程式,只需在文字方塊欄位輸入SQL指令,按【查詢】鈕,可以在下方的文字區域顯示查詢到的每一筆記錄資料。
16-5 SQL語言的資料庫操作 • 16-5-1 插入記錄 • 16-5-2 更新記錄 • 16-5-3 刪除記錄
16-5 SQL語言的資料庫操作 • Java程式一樣可以使用JDBC執行SQL資料表操作指令來維護或更新資料表的記錄資料,這就是資料表插入、刪除和更新記錄的SQL指令:INSERT、DELETE和UPDATE。 • 在這一節的程式範例也是使用JDBC類別的方法和變數,以便減少Java程式碼的長度。
16-5-1 插入記錄-說明 • SQL語言插入記錄指令INSERT可以新增一筆記錄到資料表,INSERT指令的語法格式,如下所示: INSERT INTO table (column1,column2,…..) VALUES ('value1', 'value2 ', …) • table為準備插入記錄的資料表名稱,column1~n為資料表的欄位名稱清單,只需列出使用到的欄位,value1~n是對應的欄位值。
16-5-1 插入記錄-注意事項 • 不論欄位或值的清單,都需要使用逗號分隔。 • INSERT指令VALUES的值,數值不用單引號包圍,字元需要單引號包圍,日期時間需要”#”符號。 • INSERT指令的欄位名稱清單,並不需要和資料表定義的欄位數目或順序相同,只需選擇需要新增資料的欄位,但是括號內的欄位名稱順序需和VALUES值的順序相同。
16-5-1 插入記錄-範例 • 例如:在Book資料表插入一筆圖書記錄的SQL指令,如下所示: INSERT INTO Book (BookID,BookTitle,BookAuthor, BookPrice,BookPubDate) VALUES ('P716','PHP 5網頁設計範例教本', '陳會安',600.0,#04/01/2005#) • 上述SQL指令的欄位值是字串時,請使用單引號括起,如為數值就不需要,日期/時間值是使用「#」符號括起。在Java程式是使用Statement物件的executeUpdate()方法來執行SQL指令,可以插入一筆圖書記錄,如下所示: JDBC.stmt.executeUpdate(strSQL);
16-5-2 更新記錄-說明 • SQL語言更新記錄指令UPDATE是將資料表內符合條件的記錄,都更新成指定的欄位值,UPDAT E指令的語法格式,如下所示: UPDATE table SET column1 = ‘value1’ WHERE conditions • table是資料表,SET子句column1是資料表的欄位名稱,這是需要更新的欄位,value1是更新的欄位值,如果更新欄位不只一個,請使用逗號分隔,其語法格式,如下所示: UPDATE table SET column1 = 'value1' , column2 = 'value2' WHERE conditions
16-5-2 更新記錄-注意事項 • WHERE子句是必要元素,如果沒有WHERE子句,資料表內所有記錄欄位都會被更新。 • 更新欄位值是數值不用單引號包圍,字元需要使用單引號包圍,日期時間為”#”符號。
16-5-2 更新記錄-範例 • 例如:在Book資料表更改記錄圖書資料的SQL指令,如下所示: UPDATE Book SET BookPrice=580.0, BookPubDate=#4/1/2006# WHERE BookID='P716' • 上述SQL指令的WHERE條件為圖書書號BookID欄位,使用SET子句更新欄位資料。
16-5-3 刪除記錄-說明 • SQL語言刪除記錄指令DELETE是將資料表內符合條件的記錄通通刪除掉。DELETE指令的語法格式,如下所示: DELETE FROM table WHERE conditions • table是資料表,WHERE子句conditions為刪除記錄的條件,口語來說是「將符合conditions條件的記錄刪除掉」。
16-5-3 刪除記錄-注意事項與範例 • DELETE指令的注意事項,如下所示: • WHERE子句是DELETE指令的必要元素,如果沒有WHERE子句,資料表內的所有記錄都會被刪除。 • 例如:在Book資料表刪除一筆圖書記錄的SQL指令,如下所示: DELETE FROM Book WHERE BookID='P716' • 上述SQL指令的WHERE條件為圖書書號BookID欄位,這個指令可以將符合書號條件的圖書記錄都刪除掉。
16-6 專案實例:圖書資料管理系統 • 16-6-1 圖書資料管理系統的架構 • 16-6-2 圖書資料管理系統的編譯與執行 • 16-6-3 Java程式說明
16-6-1 圖書資料管理系統的架構-說明 • 圖書資料管理系統使用本章Access資料庫Books.mdb,其使用介面是第14章JInternalFrame類別的多重視窗和第11章JOptionPane類別的訊息對話方塊。 • 在圖書資料管理系統使用功能表列的指令執行資料庫操作和搜尋,使用者並不需要下達完整SQL指令,就可以新增、更新、刪除和以書號查詢圖書記錄。搜尋記錄功能可以讓使用者輸入完整的SQL查詢指令,其中每一種功能都擁有獨立的內層視窗,使用者可以同時開啟多個視窗執行不同的圖書資料查詢。
16-6-3 Java程式說明-Books.java Books.java • Books.java程式是修改自Ch14_4.java的多重視窗應用程式,直接擴充createMenuBar()方法的功能表列,新增功能表指令來開啟不同JInternalFrame類別的內層視窗。 • 在其中的createInternalFrame()方法可以建立內層視窗,資料庫操作的addFrame和deleteFrame視窗物件都只能建立一次。