3.5k likes | 3.69k Views
Java 系列概論 資料庫入門程式 Java System Concepts and Database Programming 賈蓉生 胡大源 林金池 編著. 第一篇. Java 資料庫環境. 本書在眾多資料庫中,選定 Java/Access 資料庫系統,以實作方式表現資料庫之功能。 Access 應屬最方便且功能不輸其他者,凡有 Office 的電腦,開機即可使用,無需另添購軟體。 Java 是功能強大的物件導向語言,本身即擁有網路功能,是多數網路電玩採用的設計語言,也是多數大銀行建立網路銀行的設計語言,本書使用 Java 剖析資料庫之各項應用。. 第一章.
E N D
Java系列概論 資料庫入門程式 Java System Concepts and Database Programming 賈蓉生 胡大源 林金池 編著
第一篇 Java資料庫環境
本書在眾多資料庫中,選定Java/Access資料庫系統,以實作方式表現資料庫之功能。Access應屬最方便且功能不輸其他者,凡有Office的電腦,開機即可使用,無需另添購軟體。Java是功能強大的物件導向語言,本身即擁有網路功能,是多數網路電玩採用的設計語言,也是多數大銀行建立網路銀行的設計語言,本書使用Java剖析資料庫之各項應用。本書在眾多資料庫中,選定Java/Access資料庫系統,以實作方式表現資料庫之功能。Access應屬最方便且功能不輸其他者,凡有Office的電腦,開機即可使用,無需另添購軟體。Java是功能強大的物件導向語言,本身即擁有網路功能,是多數網路電玩採用的設計語言,也是多數大銀行建立網路銀行的設計語言,本書使用Java剖析資料庫之各項應用。
第一章 Java系統安裝
1-1 簡介 • 本系列書籍使用標準版J2SE,亦即標準版開發套件(J2SE Development Kit),簡稱為jdk。讀者可於網站(http://java.sun.com) 下載、或使用本書隨書光碟提供之Java系統安裝程式,如何安裝、如何設定?請參考本章執行步驟。 • 本章內容包括安裝Java 系統軟體(jdk-6.0)、設定Java環境、編輯第一個Java程式、編譯Java程式、執行類別檔案。
1-2 安裝Java 系統軟體(jdk-6.0) • jdk-6.0為Java程式之系統軟體,讀者可於 “http://java.sun.com” 免費下載昇陽(Sun) 之最新版、或使用本書光碟C:\BookJavaVol_4\System已備妥之執行檔 “jdk-6u4-windows-i586-p.exe”。
1-3 設定Java環境 • Java之執行式均備儲於C:\Program Files\Java\jdk1.6.0_04\bin目錄內(如下圖)。當要編譯Java程式、或執行Java程式碼時,必須先將該程式或程式碼移置於此目錄內,才可執行,甚為不便。
1-4 編輯第一個Java程式 • 可儲存Java程式之編輯工具非常多,筆者認為 “記事本” 最為樸實,負擔輕、效率高,因此建議讀者以 “記事本” 為Java程式之編輯器。
第二章 第一個Java資料庫應用
2-1 簡介 • 我們可以關聯代數(Relation Algebra) 輕易地解釋非常困難的查詢邏輯、並藉SQL資料庫語言實作執行,而Java却可流暢地驅動SQL執行各類查詢邏輯。 • 在尚未真正進入資料庫精髓之前,為了讓讀者先觸摸Java與Access之關係,本章將片段基礎介紹:建立資料庫、設定ODBC、建立資料表、輸入資料、讀取資料。
2-2 建立Access資料庫 • 本書使用Java/Access系統,以Access2007為範例資料庫(如要使用其他資料庫請自行按規定轉換),本節以手動於目錄C:\BookJavaVol_4\Program\ch02\02_2建立資料庫Book.accdb。
2-3 設定ODBC • 當資料庫建立完成後(如前節之Book.accdb),我們可立即以手動方式建立資料表(Data Tables)、輸入/讀取資料。但却無法藉由Win作業系統之應用程式來建立資料表、輸入/讀取資料。 • 如果要藉由Win作業系統之應用程式來建立資料表、輸入/讀取資料,必須先設定ODBC(Open Database Connectivity),用以連通Win作業系統與資料庫。
2-4 建立資料表 • 資料表(Data Relation Tabes) 為儲存資料的表格,包括欄位(Field) 與資料型態(Type)。本節將分別介紹:手動資料表(by hands)、Java資料表(by Java)。 • 在查詢操作上,因手動資料表操作複雜,有些查詢邏輯不易執行,但我們可以關聯代數(Relation Algebra) 輕易地解釋非常困難的查詢邏輯、並藉SQL資料庫語言實作執行,而Java却可流暢地驅動SQL執行各類查詢邏輯。
2-4-2 Java建立資料表(by Java) 1、設定ODBC,將資料庫與Win系統連接 2、載入驅動程式sun.jdbc.odbc.JdbcOdbcDriver,執行方法為: • Class.forName(sun.jdbc.odbc.JdbcOdbcDriver): 3、建立連接物件,連接資料庫,執行方法為: • Connection con = DriverManager.getConnection(jdbc:odbc:xxx); • 其中con為連接物件,xxx為資料庫邏輯名稱。 4、以連接物件之方法程序createStatement() 建立敘述物件,執行方法為: • Statement stmt = con.createStatement(); • 其中stmt為敘述物件。 5、依SQL語言建立字串 “create table …”,其中 “…” 為設定之資料表名稱及所屬各欄位。再以敘述物件之方法程序executeUpdate() 建立資料表,執行方法為: • stmt.executeUpdate(xxxxx); • 其中xxxxx為SQL字串。
範例01:設計檔案CreateTable02_4_2.java,其功能為解釋以Java建立資料表。範例01:設計檔案CreateTable02_4_2.java,其功能為解釋以Java建立資料表。 • 01 import java.sql.*; • 02 public class CreateTable02_4_2 { • 03 public static void main(String[] args) { • 04 String JDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; • 05 String connectDB="jdbc:odbc:Book02_4"; • 06 try { • 07 Class.forName(JDriver); • 08 } • 09 catch(java.lang.ClassNotFoundException e) { • 10 System.out.println("ForName :" + e.getMessage()); • 11 }
範例01:續 • 12 try { • 13 Connection con = DriverManager.getConnection(connectDB); • 14 Statement stmt = con.createStatement(); • 15 String query = "create table書目_by_Java ( " • + "編號Text(20)," • + "書名Text(20)," • + "作者Text(10)," • + "書價Number" • + ")"; • 16 stmt.executeUpdate(query); • 17 stmt.close(); • 18 con.close(); • 19 } • 20 catch(SQLException e) { • 21 System.out.println("SQLException: " +e.getMessage()); • 22 } • 23 } • 24 }
2-5-2 Java輸入資料表(by Java) • 當以Java對資料庫(Data Bases) 之資料表(Data Tables) 輸入資料時,其關鍵步驟與2-4-2節相同,唯一不同者是將項5之SQL字串 “create table …” 改成 “insert into …”。
範例02:設計檔案InsertTable02_5_2.java,其功能為解釋以Java將資料輸入資料表。範例02:設計檔案InsertTable02_5_2.java,其功能為解釋以Java將資料輸入資料表。 • 01 import java.sql.*; • 02 public class InsertTable02_5_2 { • 03 public static void main(String[] args) { • 04 String JDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; • 05 String connectDB=“jdbc:odbc:Book02_5”; • 06 try { • 07 Class.forName(JDriver); • 08 } • 09 catch(java.lang.ClassNotFoundException e) { • 10 System.out.println("ForName :" + e.getMessage()); • 11 }
範例02:續1 • 12 try { • 13 Connection con = DriverManager.getConnection(connectDB); • 14 Statement stmt = con.createStatement(); • 15 String query1 = "insert into書目_by_Java values (" • + "'001','資料庫系統概論','賈蓉生', 527)"; • 16 String query2 = "insert into 書目_by_Java values (" • + "'002','Java基礎入門程式','賈蓉生', 442)"; • 17 String query3 = "insert into 書目_by_Java values (" • + "'003','Java網路入門程式','賈蓉生', 476)"; • 18 String query4 = "insert into 書目_by_Java values (" • + "'004','Java動畫遊戲程式','賈蓉生', 500)"; • 19 String query5 = "insert into 書目_by_Java values (" • + "'005','Java資料庫入門程式','賈蓉生', 480)";
範例02:續2 • 20 String query6 = "insert into 書目_by_Java values (" • + "'006','Java網站資料庫程式','賈蓉生', 510)"; • 21 stmt.executeUpdate(query1); • 22 stmt.executeUpdate(query2); • 23 stmt.executeUpdate(query3); • 24 stmt.executeUpdate(query4); • 25 stmt.executeUpdate(query5); • 26 stmt.executeUpdate(query6); • 27 stmt.close(); • 28 con.close(); • 29 } • 30 catch(SQLException e) { • 31 System.out.println("SQLException: " +e.getMessage()); • 32 } • 33 } • 34 }
2-6 讀取資料表 • 當以Java對資料庫(Data Bases) 之資料表(Data Tables) 讀物資料時,其關鍵步驟與2-4-2節相同,不同者有: • (1) 將SQL字串改成"select * from xxx",其中xxx為資料表名稱; • (2) 以該SQL字串建立ResultSet物件; • (3) 以該ResultSet物件藉while迴圈讀取資料表內的每筆資料。
範例03:設計檔案PrintTable02_6.java,其功能為解釋以Java讀取資料表之內容。範例03:設計檔案PrintTable02_6.java,其功能為解釋以Java讀取資料表之內容。 • 01 import java.sql.*; • 02 public class PrintTable02_6 { • 03 public static void main(String[] args) { • 04 String JDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; • 05 String connectDB="jdbc:odbc:Book02_6"; • 06 try { • 07 Class.forName(JDriver); • 08 } • 09 catch(java.lang.ClassNotFoundException e) { • 10 System.out.println("ForName :" + e.getMessage()); • 11 }
範例03:續 • 12 try { • 13 Connection con = DriverManager.getConnection(connectDB); • 14 Statement stmt = con.createStatement(); • 15 ResultSet rs = stmt.executeQuery("select * from 書目_by_Java"); • 16 System.out.println("編號"+"\t"+"書名"+"\t"+"\t"+"\t"+"作者"+"\t"+"書價"); • 17 while(rs.next()) { • 18 System.out.println(rs.getString("編號")+"\t"+rs.getString("書名")+"\t"+ • rs.getString("作者")+"\t"+rs.getInt("書價")); • 19 } • 20 stmt.close(); • 21 con.close(); • 22 } • 23 catch(SQLException e) { • 24 System.out.println("SQLException: " +e.getMessage()); • 25 } • 26 } • 27 }
2-7 習題(Exercises) 01、我們可手動作資料庫應用,為何還要藉助Java來作資料庫應用? 02、設定ODBC(Open Database Connectivity) 有何意義? 03、當以Java建立資料庫(Data Bases) 之資料表(Data Tables) 時,其關鍵步驟為何? 04、當以Java對資料庫(Data Bases) 之資料表(Data Tables) 輸入資料時,其關鍵步驟為何? 05、當以Java對資料庫(Data Bases) 之資料表(Data Tables) 讀物資料時,其關鍵步驟為何?
第二篇 Java資料庫關聯查詢
資料庫(Database) 設計的重點考量為資料儲存(Data Store) 與資料查詢(Data Query),儲存資料要井然有序,查詢資料要迅速有效,前者將於爾後詳細討論,本篇將專業討論 “如何以Java程式使用SQL字串作迅速有效地資料查詢?”。
第三章 基礎操作(Basic Operations)
3-1 簡介 • 本章將針對現今資料庫使常用的資料錄關聯模型(Record Relational Model),在資料查詢上,作有系統地探討,以Access2007為範例資料庫、以Java為程式語言、以SQL為查詢語言,執行各類基礎查詢。
3-3 SQL查詢基礎架構(Basic Query Structure) • 關聯式資料庫(Relational Database) 是由多個資料表(Relations) 組合而成,每一資料表都有一個獨一無二的名稱,其查詢語言SQL是由三組子句(Clauses) 所組成:欄位選取子句(select Clause)、資料表選取子句(from Clause)、與條件子句(where Clause)。
3-5 欄位選取查詢(select Clause) • 關聯式資料庫(Relational Database) 是由數個資料表(Relational Table) 所組成,表格為資料錄(Record) 形態,由數個欄位(Columns) 組成。欄位與欄位間、表格與表格之間有其一定的數學關係,依照這些關係,我們可精準地執行指定之查詢。
範例04:設計Java程式Select_04.java,使用資料庫Bank03.accdb之資料表Deposit(如圖3-3-4),試請 “印出欄位branch_name之各資料內容”。 • 01 import java.sql.*; • 02 public class Select_04 { • 03 public static void main(String[] args) { • 04 String JDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; • 05 String connectDB="jdbc:odbc:Bank03"; • 06 try { • 07 Class.forName(JDriver); • 08 } • 09 catch(java.lang.ClassNotFoundException e) { • 10 System.out.println("ForName :" + e.getMessage()); • 11 }
範例04:續 • 12 try { • 13 Connection con = DriverManager.getConnection(connectDB); • 14 Statement stmt = con.createStatement(); • 15 ResultSet rs = stmt.executeQuery("SELECT branch_name " + • "FROM Deposit"); • 16 System.out.println(" branch_name"); • 17 System.out.println("-------------"); • 18 while(rs.next()) { • 19 System.out.println(rs.getString("branch_name")); • 20 } • 21 stmt.close(); • 22 con.close(); • 23 } • 24 catch(SQLException e) { • 25 System.out.println("SQLException: " +e.getMessage()); • 26 } • 27 } • 28 }
範例05:參考範例04,設計Java程式Select_05.java,使用資料庫Bank03.accdb之資料表Deposit(如圖3-3-4),試請 “印出欄位branch_name之各資料內容,使用distinct”。 • (1) SQL查詢句設計為: • SELECTdistinct branch_name • FROM Deposit • (2) 設計程式Select_05.java(參考本書CD檔案)。
範例06:參考範例05,設計Java程式Select_06.java,使用資料庫Bank03.accdb之資料表Deposit(如圖3-3-4),試請 “印出欄位branch_name之各資料內容,使用all”。 • (1) SQL查詢句設計為: • SELECTall branch_name • FROM Deposit • (2) 設計程式Select_06.java(參考本書CD檔案)。
範例07:設計Java程式Select_07.java,使用資料庫Bank03.accdb之資料表Deposit(如圖3-3-4),試請 “印出欄位branch_name、customer_name之各資料內容”。 • (1) SQL查詢句設計為: • SELECT branch_name, customer_name • FROM Deposit • (2) 設計程式Select_07.java(參考本書CD檔案)。
範例08:設計Java程式Select_08.java,使用資料庫Bank03.accdb之資料表Deposit(如圖3-3-4),試請 “於存款額(balance) 配發5%利息,印出欄位branch_name、customer_name、balance之各資料內容”。 (1) SQL查詢句設計為: • SELECT branch_name, customer_name, balance*1.05 as newbalance • FROM Deposit • 其中newbalance為配發5%利息後新得之存款欄位名稱。 (2) 設計程式Select_08.java(參考本書CD檔案)。
3-6 條件選取(where Clause) • 條件選取支援選擇性資料之查詢,設定特定條件,篩除不合條件的資料,只選取滿足條件的資料。常用之條件選取有:單一條件選取(如範例09)、多個條件選取(如範例10)、中間條件選取(如範例11)。
範例09:設計Java程式Where_09.java,使用資料庫Bank03.accdb之資料表Borrow(如圖3-3-1),試請 “印出分行(branch_name) Perryridge之各借款帳戶帳號(loan_number) 與借款額(amount)”。 • (1) SQL查詢句設計為: • SELECT loan_number, amount • FROM Borrow • WHERE branch_name=’ Perryridge’ • (2) 設計程式Where_09.java(如本書CD檔案)
範例10:設計Java程式Where_10.java,使用資料庫Bank03.accdb之資料表Borrow(如圖3-3-1),試請 “印出分行(branch_name) Perryridge、借款額大於2500之各借款帳戶帳號(loan_number) 與借款額(amount)”。 • (1) SQL查詢句設計為: • SELECT loan_number, amount • FROM Borrow • WHERE branch_name = ‘Perryridge’ and amount > 2500 • (2) 設計程式Where_10.java(參考本書CD檔案)。
範例11:設計Java程式Where_11.java,使用資料庫Bank03.accdb之資料表Borrow(如圖3-3-1),試請 “印出借款額大於等於2500、和小於等於3000之各借款帳戶帳號(loan_number) 與借款額(amount)”。 • (1) SQL查詢句設計1為: • SELECT loan_number, amount • FROM Borrow • WHERE amount between 2500 and 3000 • (2) SQL查詢句設計2為: • SELECT loan_number, amount • FROM Borrow • WHERE amount <= 2500 and amount>=2500 • (3) 設計程式Where_11.java(參考本書CD檔案)。
3-7 多個資料表關聯選取(from Clause) • 一個有效率的機構總是依賴一個分工的組織,資料庫也是一樣,以多個不同功能的資料表奠定分工的基礎。 • 如本章範例資料庫Bank03.accdb,存款部門建立資料表Deposit、借款部門建立資料表Borrow、公關部門建立資料表Customer、組織部門建立資料表Branch。各部門各依資料表分工作業,必要時亦可相互支援合作,即為本節之多個資料表關聯選取。 • 當將兩個資料表關聯操作時,兩個資料表必須至少有一個相同名稱的欄位,我們可以程式關聯、或以手動關聯執行之,筆者偏向手動關聯,因可降低系統的負擔。
範例12:設計Java程式Tables_12.java,使用資料庫Bank03.accdb之資料表Borrow(如圖3-3-1) 與Deposit(如圖3-3-4),試請 “印出所有持有借款帳戶的客戶(customer_name) 及其居住的城市(customer_city)”。 • (1) SQL查詢句設計為: • SELECT Borrow.customer_name, Customer.customer_city • FROM Borrow, Customer • WHERE Borrow.customer_name = Customer.customer_name • 因是同時使用兩個資料表,在欄位左端需加置所屬資料表名稱,否則系統將無所適從選擇正確的資料表。 • (2) 設計程式Tables_12.java(如本書CD檔案)
範例13:與範例12相同,設計Java程式Tables_13.java,使用資料庫Bank03.accdb之查詢表Borrow_Deposit,試請 “印出所有持有借款帳戶的客戶(customer_name) 及其居住的城市(customer_city)”。 • (1) SQL查詢句設計為: • SELECT Borrow.customer_name, Customer.customer_city • FROM Borrow_Customer • (2) 設計程式Tables_13.java(參考本書CD檔案)。
3-8 更名操作(Rename Operation) • 在操作過程中,更改名稱(Rename) 可將繁雜的名稱整理成精簡的名稱,增加可讀性與應用性,SQL提供更名機制 “as”,可更改資料表(Relations) 或欄位(Attributes) 的名稱。同時也可用於欄位計算後之新名稱(如範例08)。
範例14:設計Java程式Rename_14.java,使用資料庫Bank03.accdb之查詢表Borrow_Deposit,試請 “印出下列SQL查詢句之執行結果”。 • (1) SQL查詢句設計為: • SELECT customer_name as client_name, customer_city as city • FROM Borrow, Customer • WHERE Borrow.customer_name = Customer.customer_name and • branch_name = ‘Perryridge’ • 為了降低系統負擔,可以查詢表Borrow_Customer取代資料表Borrow, Customer,並將SQL字串改為下列字串。 • (2) SQL查詢句設計為: • SELECT customer_name as client_name, customer_city as city • FROM Borrow_Customer • WHERE branch_name = ‘Perryridge’ • (3) 設計程式Rename_14.java(參考本書CD檔案):
3-9 資料組變數(Tuple Variables) • 有些查詢問題牽涉到資料組間之關係,極不容易解答,但以資料組變數之輔助,則可輕易解決。
範例15:設計Java程式Variables_15.java,使用資料庫Bank03.accdb之資料表Deposit,試請 “印出其分行名稱(branch_name) 與客戶名稱(customer_name),如果有重複之分行名稱,則選取存款額(amount) 較大的資料組”。 • (1) SQL查詢句設計為: • SELECTdistinct T.branch_name, T.customer_name • FROM Deposit as T, Deposit as S • WHERE T.balance > S.balance • (2) 設計程式Variables_15.java(參考本書CD檔案):
3-10 字串操作(String Operations) • 在SQL字串中,有些符號具有特定意義,尤其是字串括號、暫離符號、與模糊取代(like) 之用法,常用格式有: 1、單引號(Single Quote):SQL字串以單引號括住字串之兩端,如 ‘It is my book ’。 2、雙引號(Double Quote):如果字串中已有單號成員,如It’s my book,則以雙引號取代之,如 ‘ It”s my book’。 3、百分號(Percent) %:用於次字串(Sub String) 之模糊取代(like),如 ‘downtown’ = ‘down%’,其中 ‘ %’ = ‘town’。 4、底線(Underscore) _:用於字元(Character) 之模糊取代(like),如 ‘down_own’ = ‘downtown’,其中 ‘_’ = ‘t’; ‘down_ _ _n’ = ‘downtown’,其中 ‘_ _ _’ = ‘tow’。 5、右斜線\:視為暫離符號(Escape),當字串中有特殊符號時,為了避免誤會,SQL提供右斜線\ 作暫離,如 ‘10% of people’ 應改為 ‘10\% of people’。
範例16:設計Java程式String_16.java,使用資料庫Bank03.accdb之查詢表Deposit_Customer,試請 “印出在分行(branch_name) ‘ %rryr%’ 所有持有借款帳戶的客戶(customer_name) 及其居住的城市(customer_city)”。 • (1) SQL查詢句設計為: • SELECT customer_name, customer_city • FROM Borrow_Customer • WHERE branch_name like ‘ %rryr%’ • (2) 設計程式Strein_16.java(參考本書CD檔案):
3-11 排序操作(Ordering the Display of Tuples) • SQL提供指令 “order by” 指定某欄位(Attribute) 為排序欄位,依其中的內容執行資料組(Tuples) 排序(Ordering)。