• 沒有找到結果。

整合不同形式資料庫之線上實作

N/A
N/A
Protected

Academic year: 2021

Share "整合不同形式資料庫之線上實作"

Copied!
63
0
0

加載中.... (立即查看全文)

全文

(1)

逢 甲 大 學

資 訊 工 程 學 系 專 題 報 告

整合不同型態資料庫之線上實作

學 生 :

徐 憶 茹

蔡 曉 君

金 芳 瑋

許 乃 璇

(四甲)

(四乙)

(四乙)

(四丁)

指 導 教 授 : 李 維 斌

中華民國九十一年十二月

(2)

目 錄

圖表目錄........................ III 摘要.......................... IV 第一章 專題導論................... 1 1.1 動機 ................... 1 1.2 系統核心簡介 ............... 1 1.3 成果簡介 ................. 1 第二章 工具介紹................... 2 2.1 Java 程式語言簡介 ............. 2 2.1.1 Java 的特性 .............. 2 2.1.2 發展 ................. 6 2.2 JSP 簡介 ................. 7 2.2.1 JSP 的技術:開放的技術 ........ 8 2.2.2 Java 的優越性 ............. 10 2.2.3 JSP 系統性能 ............. 11 2.3 JDBC 簡介 ................. 12 2.3.1 什麼是 JDBC .............. 14 2.3.2 JDBC API ............... 14 2.3.3 JDBC 驅動程式的型態 .......... 15 2.3.4 JDBC URL ............... 16 2.3.5 JDBC 物件類別 .............17 2.4 簡介 SQL 語法 ............... 20 2.4.1 SQL 查詢語言 ............. 21 2.4.2 加速查詢的一些技巧 .......... 25 第三章 系統環境................... 26 3.1 系統環境介紹 ............... 26 3.2 系統環境安裝及設定方法 .......... 27 3.2.1 JDK 安裝設定 ............. 27 3.2.2 Tomcat 安裝設定 ............ 29 3.2.3 MySQL 安裝設定 ............ 31

(3)

3.3 在 Windows2000 底下連接 JSP 和 MySQL .... 33 3.3.1 MySQL 的前期準備 ........... 33 3.3.2 查詢資料表和進入 MySQL ........ 34 3.3.3 JSP 連接 MySQL ............ 36 第四章 系統核心架構................. 42 4.1 系統發展架構圖與特色簡介 ......... 42 4.1.1 系統架構圖 .............. 42 4.1.2 系統特色簡介 ............. 43 4.2 系統核心架構 ............... 45 4.2.1 管理者端 ............... 45 4.2.1.1 讀取資料庫中的資料表 ....... 45 4.2.1.2 秀出資料欄位 ........... 46 4.2.1.3 選擇來源欄位資料 ......... 46 4.2.2 使用者端 .............. 47 4.2.2.1 使用者資料的查詢 ......... 47 4.2.3 程式中使用到的類別 .......... 48 4.2.3.1 DriverManaget 類別 ........ 48 4.2.3.2 Connection 類別 .......... 48 4.3 系統的資料流程圖 ............. 50 4.3.1 管理者端 ............... 50 4.3.2 使用者端 ............... 51 第五章 心得與未來期許................ 52 5.1 心得 ................... 52 5.2 未來期許 ................. 55

(4)

圖 表 目 錄

圖 2.1 將物件以圖形表現................. 4 圖 2.2 繼承-子物件以及上層物件............. 5 圖 2.3 請求 JSP 網頁的過程................ 7 圖 2.4 JDBC 驅動程式存取架構 .............. 13 圖 2.5 JDBC API 元素 .................. 14 圖 3.1 新增編輯系統變數(JDK) .............. 28 圖 3.2 設定

Tomcat

路徑 ................29 圖 3.3 新增編輯系統變數(Tomcat) ............. 30 圖 3.4 啟動 Tomcat ................... 30 圖 3.5 Tomcat 啟動成功畫面 ............... 31 圖 3.6 啟動 MySQL 服務畫面 ............... 32 圖 3.7 MySQL 的 Windows 介面管理程 ...........32 圖 3.8 在DOS下顯示資料庫................ 33 圖 3.9 建立新資料表的簡單例子.............. 35 圖 3.10 新增和查詢資料表內的紀錄 ............ 36 圖 3.11 JSP 和 MYSQL 連接成功 .............. 41 圖 4.1 系統架構..................... 42 圖 4.2 解釋資料庫型態不同、欄位數不同、欄位名稱不同、對應位置 不同 ...................... 44 圖 4.3 管理者端的資料流程圖............... 50 圖 4.4 使用者端的資料流程圖............... 51 表 4.1 DriverManage 提供的函式 ............. 48 表 4.2 Statement 類別提供的函式 ............. 49 表 4.3 PreparedStatement 類別提供的函式 ......... 49

(5)

摘 要

資料庫已成為電腦中不可缺少的元件之一了, 隨著社會的進步, 大家對東西是否便利的要求越來越高,因此許多問題也就慢慢浮現, 問題的出現然後到想盡辦法的解決,為的是讓科技可以帶領大家進入 一個更便利的世界,而我們這個專題針對兩個資料庫型態不同、資料 表欄位名稱不同、欄位數目不同、欄位資料對應位置不同要怎麼讀取 彼此資料的這個問題,想了一個解決的方法,細節將在稍後的章節做 一詳細的說明。 第一章將簡略的說明我們的動機。 第二章中對使用的工具做了基本的介紹。 第三章說明此系統的環境設定。 第四章則對系統的做法加以說明。 第五章則是大家的心得及對系統未來的期許。

(6)

第一章 專題導論

1.1 動機 在 594 期八月份『資訊傳真』一雜誌中曾經報導著這樣的一篇文 章,標題是這麼說的【連鎖旅館系統整合隱憂多】。內容大意描述如下: 也許你曾在世界各地的同一家連鎖飯店住過好幾十次,你總是要求一 個高層樓的非吸煙區,難道他們還不知道你的喜好嗎?然而不幸的 是,這些旅館雖有服務的熱忱,但還沒有體會客戶關係管理的重要, 因此沒有一個集中的資料庫,可以追蹤到個人資料,給予你想有的待 遇。Carlson Hotels Worldwide 的資訊長 Scott Heintzeman 說:「在 旅館業這行,單一旅館方面,我們有很好的客戶資訊,但是對於整個 連鎖的層面來說,資訊的收集卻不足,直到最近這幾年才有公司覺醒, 將 IT 這個系統套用在整個企業。」 但是,各地的旅館因為使用的系統不相容,造成客戶資料無法與 其他分店共享。若是要這些不同地區的管理者丟棄舊有的系統,投資 在使整個企業有共同的相容系統,是很難令每個管理者接受的。除此 之外,近幾年來隨著社會的變遷,許多的公司團體以聯盟的方式加以 合併擴大原來的規模,這其中也有許多資料是需要共同擁有的,或許 這些資料庫的型態並不相同,A 公司可能以 DB2 為資料庫,B 公司或許 以 MySQL 為資料庫,因此使這些不同型態的資料及資料表的欄位格式 格式可以彼此互相讀取,是必須的而且是實際的、有效不浪費成本的。 所以我們想針對兩個欄位名稱、欄位數目、欄位資料對應位置不同及 不同型態的資料庫這個問題,欲使這兩者可以彼此讀取。 1.2 系統核心簡介

此系統的開發是利用 Java Server Page 及 SQL 並結合 JDBC 利用 資料庫原有的性質來做應用。

1.3 成果簡介

此專題解決了不同資料庫格式的隱憂,使得不同型態之資料 庫及具有不同欄位名稱、欄位數目、對應位置不同之資料表,皆能透 過 mapping 的方式讀取彼此的資料。

(7)

第二章 工具介紹

本系統是採用 Java、JSP、SQL、JDBC 等工具完成的,這章主要是 要將我們所使用的工具做簡單的介紹。

2.1 Java 程式語言簡介

Java 是 Sun Microsystems 研發小組於 1995 年發展出來的一程國 際網路語言,它替國際網路(Internet)注入了互動性,這是資訊高 速公路藍圖最需要的。Java 在 1995 年的下半年起即受到世人高度的注 意與興趣,特別是在 Internet 及 Multimedia(多媒體)的應用上, 也因 Java 能跨平台(在不同工作平台上執行,跨越了電腦間使用的限 制),因而引起了電腦網路革命性的變革。

Java 語言威力非常強大,Java 是一種可攜式(portable)的語言, 可撰寫程式一次就在不同的平台上執行,事實上可攜式對程式語言來 講,是很難達到的一個目標.但 Java 做到了,這也是 Java 一直在標 榜的一個特性。 2.1.1 Java 的特性 1.簡單(simple) 可說是與 C 及 C++大同小異,且省略了一些複雜的語言結 構如 struct、union、pointer、#define、operator overloading 等等。還提供了強大的類別庫。 使用單純的單一遺傳(single inheritance),本身並有自 動處理記憶體系統(automatic memory management)代替 C 和 C++的分配記憶容量方法(memory allocation)。

2.穩固(robust)

Java 除去了使用容易造成系統當機的 pointer 以及一些危 險和難以使用的語言元件,這可確保此語言的程式碼,在執行

(8)

環境下能順利執行。而且 Java 堅持嚴格的編譯時間及執行時間 的核對工作,以確保所有程式都能遵守正確的程式語句結構 (syntax)和程序(procedure)。

3.安全(safe)

Java 的 source code 經過 compiled 後會附帶驗明的資料。 在程式碼取得執行權進入直譯器(Interpreter)時,它會檢查 是否符合此語言型態;而且在限制的環境裡,除非獲得允許, Java 不會去執行本身以外的特定功能,這是為了確保系統的安 全。 Java 提供的安全性有下列途徑: .移除了 C 及 C++中的指標在編譯時間作記憶體配置的 方法,使得程式設計師無法跳出他們自己的區域,避 免進入系統的限制區去任意破壞。 .直譯器的第一階段是一個位元碼的驗證器,它的功用 是測試,以確保進來的程式碼是適當的 Java 程式。 .直譯器為每個被引入的類別提供單獨的名稱空間,為 確保沒有臨時的名稱 reference 發生。 4.分散式(distributed) Java 是特地為了網際網路而設的,當然支援網路上的應用 程式,它有一個龐大的網路類別庫 java.net 支援各種網路階層 的聯繫。Java 會將程式編譯成一個中間檔,並且將原始碼轉換 成 bytecode,而 bytecode 就很容易轉換成不同特定機器的機器 碼。使用 Java 要取得遠端主機上的檔案資料是很容易的。 5.高效率(high) Java 克服傳統直譯器效率問題的其中一種方法是納入內建 的 multithreading 能力。程式很少有能夠固定的消耗 CPU 週期 的,相反的,程式必須等待使用者輸入,檔案或網路的存取。 在單線(single-threaded)的應用程式裡,這些動作會導致處

(9)

理器的閒滯。相對的,Java 會利用這段閒滯時間來處理必須的 資源回收(garbage cleanup)和一般系統維護。 理器的閒滯。相對的,Java 會利用這段閒滯時間來處理必須的 資源回收(garbage cleanup)和一般系統維護。 程式設計者可用兩種方法來解決效率問題: 程式設計者可用兩種方法來解決效率問題: .在執行時期將程式碼編譯成原生碼(native code) .在執行時期將程式碼編譯成原生碼(native code) .聯結入 native C 程式碼。 .聯結入 native C 程式碼。 聯 結 入 native C 程 式 碼 是 比 較 快 的 , 但 會 減 少 其 distributed。 聯 結 入 native C 程 式 碼 是 比 較 快 的 , 但 會 減 少 其 distributed。 6.物件導向(Object-Oriented) 6.物件導向(Object-Oriented) 此語言的基本特性是物件導向的模式,它允許以靜態和動 態的形式繼承和程式碼的再使用。在物件導向設計,其基本單 位為 object,Java 則以另一類別 class 取代,其義相同。一個 類別是一群程式碼,它製作軟體裡物件的行為。 此語言的基本特性是物件導向的模式,它允許以靜態和動 態的形式繼承和程式碼的再使用。在物件導向設計,其基本單 位為 object,Java 則以另一類別 class 取代,其義相同。一個 類別是一群程式碼,它製作軟體裡物件的行為。 MESSAGE MESSAGE MESSAGE MESSAGE PUBLIC METHOD 1 PUBLIC METHOD 1 PRIVATE INSTANCE VARIABLE 1 PRIVATE INSTANCE VARIABLE 1 PRIVATE INSTANCE VARIABLE 1 圖 2.1 將物件以圖形表現

(10)

METHOD 1 METHOD 2 NEW METHOD NEW INSTANCE VARIABLE INSTANCE VARIABLE INSTANCE VARIABLE INSTANCE VARIABLE 7.複線性執行控制(multi-threaded) 在電腦上執行的程式,或多或少都要使用者的輸入,人為 動作總是會比電腦運算慢。當電腦某一執行工作正在等待人為 輸入時,其它的執行工作亦可同時進行。Java 俱備複線性執行 功能,其自動處理記憶體功能的垃圾清除也是複線性執行功能 的發揮。 8.動態(dynamic) 動態也就是可執行中輸入(dynamic loading),可在執行 狀態下輸入並使用到特定功能的物件(class)。可透過電腦硬 體的驅動來結合檔案,不論電腦是在區域網路上,或是在網際 網路上。 Java 解 決 記 憶 體 配 置 的 問 題 , 編 譯 器 送 symbolic SUPERCLASS SUBCLASS 圖 2.2 繼承-子物件以及上層物件

(11)

reference 給直譯器,而不是 numeric reference;同時,Java 還將類別的記憶體配置留到執行時間決定。當直譯器接到一個 程式,它會為程式中所用到的類別決定 symbolic reference 和 記憶體的配置。而 Java 只需執行一次這樣的查閱工作,直譯器 就會將 symbolic reference 轉換成 numeric reference,使得 系統接近 native code。 Dynamic 的好處是,它允許修改所使用的類別而不用考慮 到修改後會不會影響程式,例如:要鏈結不同系統的類別,這 些類別的擁有者能自由的修改舊的類別,不須擔心這樣的舉動 使得每一個使用它的 Java 程式當掉。Java 的設計者知道,如果 一個程式語言想要在分散的環境下生存,這是最基本的需求。 9.三度空間設計(3D)及聰明(Intelligent) Java 可以做出 3D 立體畫面──3D-VRML(虛擬真實模式語 言)並能設計出聰明軟體(Intelligent Agent);遨遊於網路 上不同系統的電腦,收集或更改資料,不會引影響系統本身。 10.完全支援後端資料庫(JDBC & ODBC)

JDBC API 是由 Sun 的子公司 JavasSift 所提出的一套標準 SQL 資料庫存取介面,這在後面的小節會再加以說明。而 ODBC API 則是由 C 語言所撰寫的介面。 2.1.2 發展 除了允許在 Internet 上發展許多具挑戰性的技術外,Java 有可能 使程式發展中最具挑戰性的部份變得容易多了──自動撰寫程式。現 今市場上有許多提供“視覺”設計環境,讓程式設計者可以抓取物件 並巧妙的操作它們。例如:JBuilder 這個開發工具就有上述的這些優點。 還有一個例子是 Borland 公司,它正用快速應用程式發展工具(RAD tool)發展開發環境,稱作 Latte,它將提供視覺發展環境來開發 Java 程式。

(12)

2.2 JSP 簡介

JSP(Java Server Pages)是由 Sun Microsystems 公司於 1999/6 推出的新技術,是基於 Java Servlet 以及整個 java 體系的 Web 開發 技術,是 Servlet2.1 API 的擴展。利用這一技術可以建立先進、安全 和跨平台的動態網站。這個技術還在不斷的更新,有關 Java 和 JSP 的

進一步資訊可到 http://java.sun.com/查閱。

JSP 的結構與 ASP 非常相似。不過 ASP 一般只應用於 Windows NT/2000 平台,而 JSP 則可以不加修改地在 85%以上的 Web Server 上 執行,其中包括了 NT 的系統,符合"write once, run anywhere"的 java 標準。

J2EE(Java2 platform Enterprise Edition)是 Sun 為企業級應用 建立的高水準的結構,獲得了各大開發平台提供商的積極支援,並已 成為企業應用開發的主流產品。JSP 技術在 J2EE 平台上是一個關鍵性 的元件。 Response 回應 Request 請求 1. JSP 網頁 2. 轉換成 Java Servlet 3. 編譯 Java Servlet 4. 執行 Java Servlet Web Browser 用戶端瀏覽器 圖 2.3 請求 JSP 網頁的過程 因此可以說 JSP 已經並不僅僅是一種新的 WEB 技術了。總括來講, Java Sever Pages(JSP)和 微軟的 Active Sever Pages(ASP)在技 術方面有許多相似之處。兩者都是為基於 WEB 應用實現動態互動網頁

(13)

製作提供的技術環境支援。同等程度上來講,兩者都能夠為程式開發 人員提供實現應用程式的編制,網頁從邏輯上分離的技術。而且兩者 都能夠替代 CGI 使網站建設與發展變的較為簡單與快捷。

儘管 Java Sever Pages 技術和微軟的 Active Sever Pages 在許 多方面都有相似的,但仍然存在很多不同之處,其中最本質上的區別 在於:兩者是來源於不同的技術規範群組織,其實現的基礎:WEB 伺服 器平台要求不相同。

請勿將 JSP 與伺服端的 JavaScript 混在一起。網站伺服器會自動 將 JSP 寫成的 Java 程式碼片段轉換成 Java Servlets。而許多先前必 須以 Perl 手寫程式或伺服器特定的 API(如 ASP)控制的功能也都可 透過 JSP 來自動化處理。 2.2.1 JSP 的技術:開放的技術 JSP 和 ASP 技術明顯的不同點:開發人員在對兩者各自軟體體系設 計的深入了解的方式不同。JSP 技術基於平台和伺服器的互相獨立,支 援來自不同的伺服器元件。相比之下,ASP 技術主要依賴微軟的技術支 援。 1、平台和伺服器的獨立性 JSP 技術依附於一次寫入,之後,可以執行在任何具有符合 Java TM 語法結構的環境,取代過去依附於單一平台的限制,這 種做法使得 JSP 技術能夠執行在任何 WEB 伺服器上並且支援來 自多家開發商提供的各種各樣工具包。 由於 ASP 是基於 Activex 控件技術(具有平台特性)提供 用戶端和伺服器端的開發元件,因此 ASP 技術基本上是局限於 微軟的作業系統平台之上。 2、開放的開發過程,開放的原代碼 Sun 應用 Java 社團性過程開發 JSP 技術(與許許多多主要

(14)

的 WEB 服務器、應用服務器、交易系統、以及開發工具供應商

以及各種各樣富有經驗的開發團體進行合作)。1995 年,Sun 在

開放的過程下和國際 Java 群組織合作開發和修改了 Java 技術 與 規 範 。 且 將 Java 技 術 與 規 範 授 權 給 工 具 提 供 商 ( 如 Macromedia)、結盟公司(如 Apache, Netscape)、最終用戶及 協作商。

最近,Sun 將最新版本的 JSP 和 Java TM Servlet(JSP 1.1,Java Servelet2.2)的原代碼發放給 Apache,以求 JSP 與 Apache 緊密的相互發展。Apache,Sun 和許多其他的公司及個 人公開成立一個健壯的咨詢機構以便任何公司和個人都能免費 取得資訊。(詳見:http://jakarta.apache.org)而由於 Apache 對源代碼採用了 open to public 的技術戰略, 如果你對研究 JSP 平台的系統源代碼感興趣, 你甚至可以在 Internet 上下載 它們,其網址為: http://jakarta.apache.org/downloads/sourceindex.html JSP 應用程式介面(API)已經取得成功,並將隨 Java 組織 不斷擴大且完善。相反,ASP 技術僅依靠微軟本身的推動,其發 展是建立在獨佔的,封閉的開發過程基礎之上。因此我們在研 究上,選擇了較有發展性且易於取得資訊的 JSP 而非 ASP,未來 在系統擴充上,也較不會有限制。 3、從開發人員的角度來看: ASP 和 JSP 技術都能讓開發者,利用網頁中的元件製作互 動、動態的內容和 WEB 應用程式。ASP 僅支援元件物件模型 COM, 而 JSP 技術提供的元件都是基於 JavaBeans 技術或 JSP 標籤庫。 由此可以看出兩者雖有相同之處,但其區別是很明顯的。 1) JSP 標籤可擴充性 儘管 ASP 和 JSP 都使用標籤與腳本技術來製作動態 WEB 網頁,JSP 技術能夠使開發者擴展 JSP 標籤得以應用,JSP 開發者能制定標籤庫,所以網頁製作者充分利用與 XML 相 容的標籤技術強大的功能,大大減少對腳本語言的依賴。

(15)

由於制定標籤技術,使網頁製作者降低了製作網頁和擴充 網頁功能的複雜程度。 2) JSP 跨平台的可重用性 JSP 的開發人員在開發過程中一直關注可重用性。JSP 元件(Enterprise JavaBeans,JavaBeans,或定制的 JSP 標籤)都是跨平台可重用的。Enterprise JavaBeans 元件 可以存取傳統的資料庫,並能以分散式系統模式工作於 UNIX 和 WINDOWS 平台。 這種基於元件的模式很有效提高應用程式的開發效 率,因為這種模式能夠使開發人員利用快捷的子元件快速 建立模板應用程式,然後再整合一些附加功能以後便可使 用。像這樣有效的方法在 JSP 中無處不在,並可將其包成 一個 JavaBeans 或一個工業標準化的 JavaBeans 元件。 2.2.2 Java 的優越性 JSP 技術是用 Java 語言作為腳本語言的,而 ASP 網頁使用微軟的 VBScrip 或 Jscrip。Java 是成熟的,強大的,易擴充的程式設計語言, 遠優於基於 BASIC 的腳本語言。如:Java 的可執行性優於 VBScript 或 Jscript 語言。因為它們利用 Java 技術並且都被編譯為 Java Servlets。

Java 使開發人員的工作在其他方面也變的一樣容易,簡單。例如, 當 ASP 應用程式在 Windows NT 系統被懷疑可能會崩潰時,Java 能有效 的防止系統的崩潰。

1.易於維護性

基於 JSP 技術的應用程式比基於 ASP 的應用程式易於維護 和管理。JSP 突出的元件技術使修改內容而不影響邏輯或修改邏 輯而不影響內容變得很容易實現。企業級的 JavaBeans 結構整

(16)

合了企業邏輯,例如資料庫的存取,安全,事務完整性,及獨 立性即獨立於應用程式。因為 JSP 技術是一種開放的,跨平台 的結構,因此,WEB 伺服器,平台,及其他的元件能很容易升級 或切換,且不會影響 JSP 基本的應用程式。這一特點使 JSP 能 夠適用現實世界的各種 WEB 應用程式不斷的變化和發展。 2.企業產品的多樣性 Java2 平台即企業版(J2EE)是適用於多企業應用程式的 Java 結構,作為 J2EE 的部分,JSP 網頁可存取所有 J2EE 的元 件,包括 JavaBeans,企業級 JavaBeans 及 Java Servlets。JSP 網頁都能完全編譯成為 Servlets,所以它們都享有靈活性的特 點。J2EE 平台內容不僅包括管理複雜的企業應用程式,而且包 括事務管理技術和 Pooling 資源管理技術。 JSP 網頁可以存取標準的 J2EE 服務,包括: * Java 標簽和目錄介面 API * JDBC API(與關聯的資料庫通訊)

* Java Mail(支援基於 Java 郵件和訊息應用程式的類) * Java 訊息服務 透過 J2EE,JSP 網頁能夠用許多方式同企業系統互動存取。J2EE 支援兩種 CORBA(物件導向分散式工作環境規格)規範的技術:JAVA IDL 和 RMI-IIOP。在企業級 JavaBean 技術支援下,JSP 網頁運用進階的, 物件映射的方式存取資料庫。 *映射(mapping)資料型態,大家亦稱它為關聯性陣列。就是一 個陣列讓你不用像陣列般使用數字索引一個值,映射讓你使用 實際上對你有意義的值當作其值的索引,比較像一個相關的資 料庫 (relational database)。 最終,因為 JSP 技術是基於 JAVA 的開放性過程的產品,因此它能 夠廣泛支援不同供應商所提供的工具,這樣能夠使用戶選擇最佳的開 發方法,選擇最適合他們的應用程式開發工具,同時,有效地保護用 戶在代碼和人員培訓上的投資。

(17)

2.2.3 JSP 系統性能

根據在 Netscape Enterprise Server 4.0 for Linux 上做了靜態 連接和 JSP 的對比測試:

1.在大負荷的情況下(共發送 5000 個請求,每秒發送為 500 個請 求),比較 Requests per second:

靜態連接為:348.31 JSP 為:253.32

對 比 在 重 負 荷 情 況 下 靜 態 HTML 和 JSP 的 差 距 348.31/253.32=1.37:1

2.在小負荷的情況下(共發送 5000 個請求,每秒發送為 50 個請 求),比較 Requests per second:

靜態連接為:823.18 JSP 為:361.93 對 比 在 小 負 荷 情 況 下 靜 態 HTML 和 JSP 的 差 距 823.18/361.93=2.27:1 3.測試結果表明:JavaServlet 在重負荷下的有優勢,負荷越重, JSP 性能越接近靜態連接。 2.3 JDBC 簡介 2.3.1 什麼是 JDBC

有人認為 JDBC 是”Java Database Connectivity 的縮寫,實則不 然,根據 Sun 公司指出,”JDBC ”就是”JDBC”他本身就是一個 字,純粹就是用來代表這個機制。JDBC 在設計上是採取物件導向的方 式,由純 Java 為基礎撰寫而成的類別與介面,是用來連接資料庫與應 用程式,這種介面稱之為 JDBC 驅動程式(Dirver)。此驅動程式可以 由資料庫伺服器製造廠商或協力廠商提供,他只是用來作一些資料轉

(18)

換的工作而已,是一種與遠端資料庫連接的函式庫;JDBC 函式庫提供方 法執行 SQL 敘述,在 java.sql 封包中被實做。(目前 JDK 內含有 JDBC-ODBC 的 driver)

JDBC 和任何想要成為 JDBC 相容的驅動程式必須支援 ANSI 1992 SQL 標準 ( ANSI SQL-2 Entry Level ),但是 JDBC 允許發展者直接傳 送查詢字串給該連接的驅動程式。這些字串可能不是標準的 ANSI SQL,或是 SQL.這些字串的使用是由潛在的驅動程式所決定,這些功 能的使用會限制應用程式程式設計者改變資料庫末端的自由度。 基本上,JDBC 提供了三項服務: 1.建立起與資料庫連結。 2.將 SQL 敘述傳遞給資料庫。 3.從資料庫取得 SQL 執行結果。 既然如此我們也可以知道,寫 JDBC 程式的步驟可以分為三個步驟 : 1. 先 拿 到 driver , 然 後 利 用 driver 與 database 建 立 連 結

(Establish a connection with a database)。

2.將 SQL 指令送到 database server 上(send SQL statements )。 3.得到結果(results),然後處理(process the results )。

(19)

2.3.2 JDBC API

一般而言,在 JDBC API 中的介面有兩個層次:第一是 Application 層次,第二是 Driver 層次。還有一個當作 Application 層次和 Driver 層次之間的橋樑類別。

Driver 是透過 Driver Manager 類別來存取,Driver Manager 類 別為開發者多提供了一個抽象的層次。Driver Manager 類別負責驅動 程式的載入和反載入,並且負責透過驅動程式搞定連線。 只要確保有依從 JDBC 的規格,應用程式設計者只需要使用標準的 API 介面即可,而驅動程式發展者只要負責開發驅動程式和資料庫間的 介面程式,以及支援 JDBC Application 層次呼叫的程式碼。 每一個 Driver 層次必須要實現四個主要介面,這四個介面分別 為:Driver,Connection,Statement,和 ResultSet. 圖 2.5 JDBC API 元素 Driver 介面中實現了到資料庫的連線,Connection 介面代表一個 真實連接到一個特定資料庫的物件。Statement 介面 是你的 SQL 敘述 容器.ResulSet 介面 是用來容納最後結果的物件。在大部分的應用程

(20)

式中, 其中 Connection,Statement,和 ResultSet 介面是由驅動程 式設計者所實現,這些介面代表一些方法,應用程式開發者將會把這 些方法當作是真正的次類別來對待,而這些方法會讓開發者產生敘述 和取得結果。 在當 JDBC 要與資料庫建立連結之前,必須先取得聯結此資料庫的 JDBC 驅動程式;然而不同的資料庫系統,通常使用的驅動程式也不相 同,因此採用何種驅動程式,就必須要看所使用的資料庫系統而定。 2.3.3 JDBC 驅動程式的型態 再此將驅動程式分為四種型態,分類方式是以連結方式和撰寫該 驅動程式的語言所區分 1. JDBC-ODBC Bridge

這個 driver 是 JDK 內建的 package,讓我們透過這個 driver 可以去跟 ODBC 做連結, 而 ODBC 本身可以跟任何的 database server 作溝通。這樣就可以達到用 Java 連結 database server 的目的,利用類似橋接器的技術來連接資料庫。

但 此 法 因 必 須 在 客 戶 端 安 裝 類 似 有 ODBC 的 軟 體 平 台 (Windows)上才可以執行,由於這些軟體通常非 Java 程式碼所 撰寫,因而使得程式不具有跨平台的特性。

2. Native-API partly-Java Driver

這類驅動程式會透過類似 JNI ( Java Native Interface ) 的技術,呼叫執行資料庫賣商(如: Oracle、Sybase、Informix… 等 )所提供的 API 來存取資料庫,與第 1 類相類似,只不過不 須透過 ODBC 即可連結 Database Server。

但由於這些 API 通常是由 C 或 C++…等寫成,所以這也同樣 不具跨平台的功能。

(21)

3. Net-Protocol all-Java Driver

此 level 3 的 driver 使用一種特殊的協定(Protocol),經 由與網路上的某台 server 連結。再透過此 Server 將此特殊的 協定(Protocol),轉成連結到 Database Server(any Database Server),不需要在客戶端在加裝任何特殊程式,是在客戶端與 資料庫之間安裝一種中介軟體(Middleware ),讓客戶端的請 求透過此中介軟體轉換成資料庫能夠接收處理的訊息。

此法使得 Java 程式只要連結到一個中繼 Server,其它的 事就只要交給這 Middle Server 就好了。

具跨平台的功能(pure Java)。且使得 Java 程式可以連結 到任何的 Database。

4. Native-Protocol all-Java Driver

使用與 Database Server 相同的協定(Protocol),連結 Database,直接透過網路協定,將客戶端的請求送至資料庫端 處理,其執行結果也直接從資料庫端取回。

此法使的 Java 程式具跨平台的功能(pure Java),但 Java 程式只可以連結到一個 Database。 2.3.4 JDBC URL 驅動程式使用一個字串來找出資料庫和存取資料庫,這個字串的 語法非常類似於一個 URL 字串。一個 JDBC URL 字串的目的就是要分開 應用者程式設計者和驅動程式設計者。JavaSoft 為驅動程式 URL 定義 了以下的目標: 1.這個驅動程式存取 URL 的名稱應該定義出被使用資料庫型態 2.使用者(應用程式設計者)應該和產生資料庫連線的任何管理 沒有任何關聯。因此,所有的資料庫連線資訊,〔主機(host),

(22)

埠(port),資料庫名稱,使用者名稱,和密碼〕應該在 URL 中被編碼 3.一個網路命名系統可能要被用來避免使用者需要詳細地編碼出 精確的主機號碼的需要名稱和資料庫的埠。 而連接到資料庫的格式如下: jdbc: <sub-protocol>:<sub-name> 第 一 部 分 是 不 變 的 , 第 二 部 分 是 你 所 要 使 用 的 Driver 的 protocol,第三部分則是 date source 的名稱。

也可以在要連接的資料庫的 sub-name 中指定特定的埠.以下是一 些例子: jdbc:dbprot//test:1234/datasrc jdbc:dbport//corp20/datasrc jdbc:dbport//www.myserver.com/test/datasrc 這三個範例列出了一些其他用來指定資料庫的方式。 1.代表一個特定的網路連接在一個特定的埠上。 2.第二種就沒有指定特別的埠而只是連接到一個特定的網路 位置。 3.第三種則是展示出如何在網路上連接到一個資料來源。 2.3.5 JDBC 物件類別 1. Connection Connection 類別是一個骨幹,這個骨幹能夠將 Statement 物件送至資料庫,或是取得包含查詢結果的 ResultSet 物件. 更 進 一 步 地 , Connection 支 援 SQL 資 料 庫 的 交 易 處 理 (transaction processing)

(23)

利 用 SQL 查 詢 或 是 儲 存 程 序 (stored procedure) 的 Connection 可以被用在很多不同的程式技巧上.下面範例展示 利用 DriverManager 中的 getConnection()方法去建構一個 Connection 實體的一個簡單的過程: Connection myCon=DriverManagergetConnection (“jdbc:odbc:data”,”johid”,”password”) 就是建立一個連接到特定資料庫所要做的全部事情,而且 還要在其 JDBC 程式的最後用 close()方法去切斷和資料庫的連 接:myCon.close(); 2.Statement Java.sql.Statement 是用來容納並且執行 SQL 敘述的類 別,一但一個敘述執行了,就會回傳一個 Resultset 物件.再 進一步的說,通常對於每一個 Statement 只會有一個 ResultSet 會打開。 Statement 類別只有在已經連接到一個資料庫之後才會生 效,其使用步驟方法例子如下:

Statement myStmt = myCon.createStatement();

ResultSet myResults = myStmt.executeQuery (“SELECT * FORM Test”) 此例中,第一行是將一個叫做 myCon 的連接到資料庫,然 後利用 createStatement()這個方法建立 myStmt 敘述;第二行 中,是使用 executeQuery()方法將結果送到 ResultSet 物件 myResults 中。 3. PreparedStatement Java.sql.PrepareStatement 主要是延伸了 Statement 類 別 , 其 功 能 是 用 在 可 以 執 行 一 次 以 上 的 查 詢 , 所 以 藉 由 PrepareStatement 便可以重新編譯帶有參數的查詢.當它每執 行一次的時候,將能提高查詢動作的效率

(24)

4. CallableStatement

Java.sql.CallableStatement 從 Prepared Statement 再延 伸過來。

CallableStatement 是和儲存程序(stored procedure)連 在一起使用的,也可以利用 CallableStatement 來指定 OUT 參 數,並且將結果傳回這個類別而不用傳回 ResultSet 物件。 5. ResultSet Java.sql.ResultSet 物件是 JDBC 用來容納 SQL 查詢結果的 物件,一但執行了一個會傳回一個或一個以上的 ResultSet 的 SQL 敘述,就可以使用它的 getDataType()方法去結取資訊。 一旦查詢被執行了並且傳回 ResultSet,ResultSet 就會儲 存 它 的 結 果 在 循 序 的 列 與 行 中 . 就 可 以 使 用 各 種 形 式 的 getDataType()方法病依照名稱或位置索引法去指定列或行,然 而要真正地再列與列之間移動的話,就需要使用到 next()方法:

ResultSet myResult = myStmt.executeQuery(“SELECT * FORM Test”); While (myResults.next()){ For (i=1;i<numofCols;i++){ System.outprint(myResults.getString(i)); } system.outprint(“”); myResult.close();

(25)

2.4 簡介 SQL 語法 2.4.1 什麼是 SQL

SQL 語言是目前公認的關聯式資料庫建立與資料的標準語言,該 語言衍生自 SEQUEL(Structured English Query Language)語言,SQL 可以看成是關聯式代數與聯式計算的綜合體,主要功能就是各種資料 庫建立聯繫,進行溝通。最初是由 1970 年當時在 IBM 工作的 E.F. Codd,針對關聯式模型 ( relational model ),提出了抽象理論因此 奠定了關聯式資料系統的基礎。之後才有更多的學者投入這個領域, 關聯式資料庫就以更快的速度發展。按照 ANSI(美國國家標準協會) 的規定,SQL 被作為關聯型資料庫管理系統的標準語言。其標準有得訂 定,分別有 SQL-87、SQL-89、SQL-92 以及目前最新的 SQL 3。 在 1996 年由美國電子電機工程學會(IEEE)Computer Society 所 舉 辦 的 「 國 際 資 料 工 程 研 討 會 論 文 集 」 (Proceedings of IEEE International Conference on Date Engineering )中,Jim Melton [J.Melton(1996)]對最新的 SQL3作了簡單的介紹。 基於商業上的考量或技術上的突破,各廠商所提供的 SQL 的版本 不盡相同 ,也就是說有些 SQL 所明定的標準可能沒有提供,但有提供 的可能會超過 SQL 所明定的標準。基本上 SQL 並沒有完整的將關聯式 資料模式實現出來,所以有些可能會與關聯式模式的定義有所衝突。 例如:在 SQL 的基底關聯表上可允許有重複的值組,而且在同一個關 聯表中的屬性欄位在觀念上是可以有順序的(由左至右排列)。 目前,絕大多數流行的關係型資料庫管理系統,如 Oracle, Sybase, Microsoft SQL Server, Access 等都採用了 SQL 語言標準。雖然很多 資料庫都對 SQL 語句進行了再開發和擴展,但是包括 Select, Insert, Update, Delete, Create, 以及 Drop 在內的標準的 SQL 命令仍然可以 被用來完成幾乎所有的資料庫操作。

(26)

成。資料庫中的所有數據或資訊都被保存在這些資料庫表格中。資料 庫中的每一個表格都具有自己唯一的表格名稱,都是由行和列組成, 其中每一列包括了該列名稱,數據類型,以及列的其它屬性等資訊, 而行則具體包含某一列的記錄或數據。 下面我們來詳細介紹一下 SQL 語言的基本知識。 2.4.2 SQL 查詢語言 不論各廠商提供的 SQL 有何差異,一般的 SQL 查詢語言大致上可 以分為三個部分:

資料定義語言(Data Definition Language,DLL) 資料操作語言(Data Manipulation Language,DML) 資料控制語言(Data Control Language,DCL)

2.4.2.1 資料定義語言(DDL) 用於定義資料庫中的資料表、資料綱要(Data Schema), 的語言,例如:資料表的名稱、屬性的名稱、屬性的資料型態、 關聯表的綱要、索引、視界、整合限制條件…等。主要的指令 可以分為以下三種: 作用於基底關聯表( Base Table ) 的 DDL, 作用於視界關聯表( View ) 的 DDL, 作用於資料索引( Index ) 的 DDL。 1)作用於基底關聯表的 DDL:用來定義、修改,以及去除基 底關聯表的綱要結構或清除基底關聯表中的資料。常用 的指令有: (1)Create Table --- 新增關聯表

CREATE TABLE <table name> (<column name> <column type> [NOT NULL]{,<column name> <column type> [NOT NULL]})

(27)

(2)Alter Table --- 更改關聯表綱要 *增加欄位

ALTER TABLE <table name>

ADD <column name> <column type> *新定義一個已存在欄位之內定值

ALTER TABLE <table name> *刪除一個已存在的欄位之內定值

ALTER TABLE <table name> drop constraint <constrain name>

(3)Drop Table --- 刪除整個關聯表 DROP TABLE <table name>

(4)Truncate Table – 刪除關聯表內容,僅留下綱要 TRUNCATE TABLE < table name >

2)作用於視界關聯表的 DDL (1) 建立 VIEW

CREATE VIEW <view name>[(<column name>{,<column name>})]

AS <select statement (2)刪除 VIEW

DROP VIEW <view name>

3)作用於索引上的 DDL:用來建立以及去除一個基底關聯表 上的索引。

(1)Creat Index --- 建立新索引,設定索引鍵 CREATE [UNIQUE] INDEX <index name>

ON<tablename>(<columnname>[<order>]{,<column name>[<order>]})

(28)

(2)Drop Index --- 刪除索引鍵 DROP INDEX <index name> 2.4.2.2.資料操作語言(DML) 資料操作語言用於處理資料庫中的資料,維護資料庫資料 內容的語法,執行有關使用者對於資料庫中資料的異動部份 如:新增(Insert)、刪除(Delete)、修改(Update)與查詢(Select) 之動作等。 常看到的關鍵字有: 1)Insert--- 增加紀錄:新增資料到 Table 中。

INSERT INTO <table name>[(<column name>{,<column name>})]

VALUES(<constant value>,{<constant value>})|<select statement>

2)Update ---更改紀錄 :更改 Table 中的資料。 UPDATE <table name>

SET<column name>=<value expression>{,<column name> = <value

expression>}[WHERE <select condition>] 3)Delete --- 刪除紀錄:刪除 Table 中的資料。

DELETE FROM <table name>

[WHERE <selection condition>]

4)Select--- 查詢紀錄:選取資料庫中的資料。 SELECT [DISTINCT] <attribute list>

FROM <table name> {<alias>{,<table name>{<alias>}}

[WHERE <condition>]

[GROUP BY <grouping attributes> [HAVING <group selection

(29)

condition>]]

[ORDER BY <column name> [<order>]{,<column name>[<order>]}] <attributeist>::=*|(<columname>|<function>(([DI STINCT]<column name>|*))){,(<column name>|<function>(([DISTINCT]<column name>|*))})

<grouping attributes>::=<column name>{,<column name>}

<order>::= ASC | DESC

5)集成函數.--Sum, Avg, Count,Min,Max SELECT function(field) AS var

FROM <table name> WHERE <condition> 2.4.2.3.資料控制語言(DCL) 用於控制項資料庫的使用權限和安全限定,保護資料庫, 免 於 被 破 壞 ; 其 可 以 控 制 使 用 者 「 是 否 可 以 合 法 使 用 資 料 庫?」,「是否可以合法對資料庫中的關聯表作新增、刪除、修 改或選擇」,以及「是否可以對資料庫作備份工作」等運算。 常看到的關鍵字有: Grant:賦予使用者使用物件的權限。 Revoke:取消使用者使用物件的權限。 Commit:Transaction 正常作業完成。 Rollback:Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態。

(30)

2.4.3 加速查詢的一些技巧 1.如果是在 SQL 查詢的 where 子句中有兩個以上的條件 AND 起來 時,則將條件中會濾掉較多值組的部分放在最前面 2.如果在 SQL 查詢的 From 子句中有兩個以上的關聯表 R 與 S 要 作合併(Join),則將經條件過濾後所剩下較小的那一個關聯 表,假設是S,放在 From 子句中的後面(From R ,S ),但是 與該關聯表相關的合併條件,在 Where 子句中則放在最前面, 另外還可以加入一個”虛擬的”條件,由於此條件是一個選擇 加入,所以它的執行優先順序會較合併條件要高,所以可以強 迫 DBMS 使用該關聯表 S 做為驅動合併主導關聯表,以小的關聯 表來過濾大的關聯表教省時省力 3.如果已經知道某個欄位的直一定大於某個值時,可以省略就省 略 例:select * select * from Books (較快) from Books where price >= 0 (較慢)

4.將多餘的 Order by 去除,省略不必要的子句.

有些 Subquery 可以用一般的 Where 子句中的條件來替代 5.要預設 LIKE 運算中所使用的部分吻合符號:“ %“與”_”並不

(31)

第三章 系統環境

關於我們所用的系統環境,可以用以下三個來做介紹:JDK、 Tomcat、MySQL。

3.1 系統環境介紹 1.JDK

JDK 的 全 名 為 Java Development Kit , 是 一 套 Java compiler、JVM、class library 及其他工具的組合,也是開發 JAVA 程式最基本的軟體需求。java 是 Sun(昇陽)所大力推銷的 一種跨平台語言(技術),因為其優異的特性,使得程式設計師 不必再改寫程式碼,即可在各平台執行 Java 程式,指不受各硬 體,作業系統的任何限制,這也是我們為何要選擇它的其中一 個重要原因。基本上,Java 是屬於半編譯(Compiler)、半直譯 (Interpreter)的方式執行,當 Java 的 Compiler 將程式編譯成 所謂的 bytecode,傳送到各平台時,只要平台有支援 Java Virtual Machine,即可將 bytecode 直譯成真正可執行的程式。 Java 程式發展的環境不斷的推出更新的版本,而我們用的是 『j2sdk1.4.0_01』這個版本。 2.Tomcat: Tomcat 是一個免費的開源的 Serlvet 容器,提供了各種平 臺的版本供下載,可以從 http://jakarta.apache.org 上下載 其源代碼版或者二進位版。因為 Tomcat 是 Apache 基金會的 Jakarta 專案中的一個核心專案,由 Apache,Sun 和其他一些公 司及個人共同開發而成。所以基於 Java 的跨平臺特性,Tomcat 也具有跨平臺性。 在 Tomcat 中,應用程式的部署很簡單,你只需將你的 WAR (Web Archive)放到 Tomcat 的 webapp 目錄下,Tomcat 會自動 檢測到這個文件,並將其解壓。當你在瀏覽器中叫出這個應用 的 Jsp 時,通常第一次會很慢,因為 Tomcat 要將 JSP 轉化為

(32)

Servlet 文件,然後編譯。編譯以後,叫出動作就會很快了。因 為 Tomcat 免費,功能強大,也具有開放性,所以我們選擇 Tomcat 作為編譯 JSP 的工具之一。 3.MySQL: MySQL 是一個快速、多線性(multithread)、多使用者的 SQL 資料庫伺服器。尤其在 select/insert/update 等基本 SQL 指令之執行效率非常快速,比商業之 MSSQL 及 Oracle 資 料庫等更快,更重要的是 MySQL 是免費的。同時支援中文 Big5 碼 。SQL(結構化查詢語言)是世界上最流行的和標準化的資 料庫語言,它使得存儲、更新和存取信息更容易。例如,你能 用 SQL 語言來為一個網站檢索產品信息及儲存顧客信息,同時 MySQL 也足夠快和靈活以允許你存儲記錄文件和圖像。MySQL 是以一個主從式架構的實現,它由一個伺服程式 mysqld 和很 多不同的用戶端程式庫組成。MySQL 的主要目標是快速、穩固和 易用。 經過了以上的介紹,希望你們可以了解到我們的整個系統環境的 整個組成和架構。 3.2 系統環境安裝及設定方法 以下都是在 Windows2000 所做的設定,而安裝這個環境,我們必 須先安裝 JDK,使得 Java 服務在電腦上成為有效的程式語言。 3.2.1 JDK 安裝設定 1.到 http://www.javasoft.com/j2se/下載 JDK,然後直接安裝, 請注意安錄的目錄名稱最好照著它所預設的,不要做修改,否 則 之 後 將 會 有 不 能 夠 啟 動 服 務 的 問 題 , 預 設 目 錄 路 徑 為:”c:\j2sdk1.4.0_01”。 *一開始我們來設定 JDK1.3.1 的 PATH(路徑),先到 『開始 → 設定 → 控制台 → 系統 → 進階 → 環境變數 → 系統變

(33)

數』 ,然後新增 CLASSPATH 和 PATH(若這兩項已經有的話就 點編輯,加在原有的路徑後面) 2.找到系統變數 PATH,按「編輯」鈕,在最後面加上 1)C:\ j2sdk1.4.0_01\bin;,然後按確定。 2)按「新增」,變數名稱輸入 JAVA_HOME,變數值輸入 C:\ j2sdk1.4.0_01,然後按確定。 3)按「新增」,變數名稱輸入 CLASSPATH,變數值輸入 C:\ j2sdk1.4.0_01\lib,然後按確定。 3.如此就完成了 JDK 的安裝了。(如圖 3.1) 圖 3.1 新增編輯系統變數(JDK)

(34)

3.2.2 Tomcat 安裝設定 安裝 JSP 的主要環境 Tomcat。 1.首先先到 http://jakarta.apache.org/site/binindex.html 下 載 Tomcat 4.0.6。然後再用解壓縮的工具,將它解壓縮到 C:\。 因此你的 C:\目錄下會有 jakarta-tomcat-4.0.6 這個目錄產 生。(注意請不要修改他所設定的路徑) 2.再來設定 Tomcat 4.0.6,進入 c:\ jakarta-tomcat-4.0.6\bin 目錄,找到 startup.bat 批次檔案,用筆記簿打開來編輯,在 最上面那一行加上以下兩行。(如圖 3.2) SET TOMCAT_HOME=C:\jakarta-tomcat-4.0.6 SET JAVA_HOME=C:\j2sdk1.4.0_01 圖 3.2 設定 Tomcat 路徑 3.上一步完成後,再到剛剛的『開始 → 設定 → 控制台 → 系 統 → 進階 → 環境變數 → 系統變數』,然後新增變數名稱, 輸入 CATALINA_HOME,變數值輸入 C:\ jakarta-tomcat-4.0.6, 然後按確定。(如圖 3.3) 4.再來必須重新開機,才能讓上述的設定值生效。

(35)

5.重新開機後,做一個執行 Tomcat 的動作。進入命令提示字元, 執行\jakarta-tomcat-4.0.6\bin\startup 便可以啟動 Tomcat (如圖 3.4),這時候會出現一個 dos 視窗,停止不動,並有一 些運行成功 Tomcat 和初始化資訊,這就證明 Tomcat 運行成功 了。(如圖 3.5) 圖 3.3 新增編輯系統變數(TOMCAT) 圖 3.4 啟動 Tomcat

(36)

圖 3.5 Tomcat 啟動成功畫面

6.測試 Tomcat 是否啟動起來,可以開啟瀏覽器,在網址列輸入 http://localhost:8080 , 如 果 可 以 看 得 到 Tomcat Version 4.0.6 這一頁,就表示安裝設定都已完成,可以開始開發程式 了。上面有一些 JSP 和 Servlet 的例子,可以執行測試看看。 注意,千萬不能將 dos 視窗關閉,若關閉即表示關閉 Tomcat。 而關閉的程序一定要是打入 shutdown 指令,不可以直接關閉命 令提示字元視窗,否則下一次再執行的時候可能會有不能開啟 的問題。 3.2.3 MySQL 安裝設定

1.首先我們需要先下載 MySQL for Windows 的檔案,以開始接下 去的安裝工作,目前 MySQL for Windows 只有一個版本,並沒 有因 95/98/NT/2000 的不同而有不一樣的檔案。 2.將取回的 zip 檔案解開到一個暫時的目錄(檔名應該像是 mysql-shareware-x.xx.xx-win.zip ), 通 常 我 們 是 安 裝 至 C:\mysql 下,然後執行該目錄下的 setup.exe 開始進行安裝。 在 Windows2000 這個平台下,通常都會把 MySQL 安裝成一個系 統服務(service)。 3.進入命令提示字元以後,在 MySQL 的目錄底下的 bin 的資料夾 下,打入 net start mysql 這時候就會啟動我們所要的 MySQL

(37)

的服務了。(如圖 3.6) 圖 3.6 啟動 MySQL 服務畫面 4.現在 MySQL 應該就已經開始運作了。我們可以做一個簡單的小 測 試 。 我 們 可 以執 行 C:\mysql\bin\MySqlManager, 這 是個 Windows 介面的管理程式,您大概的操作一下,例如在 MySQL 那個資料夾圖示上用滑鼠點選兩下,若您的 MySQL 已順利啟 動,就可以看到其下的幾個資料庫喔!原始狀態會有 test 和 mysql 兩個資料庫。(圖 3.7) 圖 3.7 MySQL 的 Windows 介面管理程式

(38)

5.我們 也可以在命令提 示字元裡面執行 C:\mysql\bin\ 下的 mysqlshow,也是會看到在 DOS 裡面顯示出有 test 和 mysql 兩個資料 庫(圖 3.8)。現在我們就可以使用 MySQL 了 +---+ | Databases | +---+ | mysql | | test | +---+ 圖 3.8 在 DOS 下顯示資料庫 3.3 在 Windows2000 底下連接 JSP 和 MySQL 在上一節我們已經安裝好了 JDK、Tomcat、MySQL。而我們必須要 做到可以讓 JSP 連接 MySQL 資料庫,才可以讀到我們資料庫裡面的東 西,不過 JSP 連接 MySQL 還有點複雜,以下就對於連接的方法做一個 說明。 3.3.1 MySQL 的前期準備 在我們所安裝的 MySQL 中,我們所使用的是系統初始的 root 用 戶。而在第一次設定密碼的時候,可以如下所示來設定: 1.設定密碼:(首次設密碼) C:\mysql\bin>mysqld

C:\mysql\bin>mysqladmin –u root password 新密碼 (root 是 user 名稱)

(39)

2.變更密碼:

C:\mysql\bin>mysqladmin –u root –p 舊密碼 password 新 密碼

3.3.2 查詢資料表和進入 MySQL 1.查詢資料庫和資料表:

C:\mysql\bin>mysqld

C:\mysql\bin>mysqlshow –u root –p 密碼

C:\mysql\bin>mysqladmin –u root –p 密碼 mysql(mysql 是指定資料庫)(後面可再加上資料表)

2.進入 MySQL:

C:\mysql\bin>mysqld C:\mysql\bin>mysql 3.MySQL 的內建指令:

help (\h) Display this help.

? (\?) Synonym for `help'.

clear (\c) Clear command.

connect (\r) Reconnect to the server. Optional

arguments are db and host.

ego (\G) Send command to mysql server, display result vertically.執行並垂直顯示結果 exit (\q) Exit mysql. Same as quit.

go (\g) Send command to mysql server.執行指令 notee (\t) Don't write into outfile.

print (\p) Print current command. 顯示要執行的指令 quit (\q) Quit mysql.

rehash (\#) Rebuild completion hash.

source (\.) Execute a SQL script file. Takes a file name as an argument.

(40)

tee (\T) Set outfile [to_outfile]. Append everything into given outfile.

use (\u) Use another database. Takes database name as argument.

4.建立新資料庫:

mysql>create database 資料庫名稱;

5.建立新資料表:(要先用 use 來指定存放資料表的資料庫) mysql> use 資料庫名稱;

mysql> create table table 名稱 圖 3.9 是一個簡單的例子:

圖 3.9 建立新資料表的簡單例子

6.新增紀錄到資料表:(用 insert) 例子:

mysql> insert into my_table(

-> name,email,address,password,sex,id) ->

(41)

values('cecilia','[email protected]','Taiwan','123456' ,'f',1,

-> );

7.查詢 table 內的紀錄:

mysql>select * from Friends;

圖 3.10 新增和查詢資料表內的紀錄 另外,若要刪除資料庫或資料表的話可用 drop 指令 8.刪除資料庫 資料表: mysql>drop table 資料表名稱; mysql>drop database 資料庫名稱; 以上如此,我們就已經建立好了一個叫做 test 的資料庫和一個在 test 裡面的一個叫做 personal 的資料表了。 3.3.3 JSP 連接 MySQL 1. 先 從 http://www.mysql.com/Downloads/Contrib/mm.mysql. jdbc-1.2c.tar.gz 下載 mm.mysql.jdbc-1.2c.tar.gz,然後將

(42)

其 解 壓 縮 到 c:\ 的 目 錄 下 , 我 們 使 用 的 是 c:\mm.mysql.jdbc-1.2c。

2. 然 後 , 在 CLASSPATH 系 統 便 亮 的 最 後 添 加 上

c:\mm.mysql.jdbc-1.2c;

3.再來創建一個 JavaBean,名為 DBconn.java,在 Tomcat 的 /webapps/examples/WEB-INF/classes 下建立一個 mysqltest 的目錄,將該檔案保存在這個目錄中,DBconn.java 是用來封裝 與資料庫連接的操作。DBconn.java 的內容如下:

package Mysqltest; import java.sql.*; public class DBconn

{String DBDriver="org.gjt.mm.mysql.Driver";

String ConnStr="jdbc:mysql://localhost/my_test"; String MyUser="root";

String MyPassword="cecilia1"; Connection conn = null;

ResultSet rs = null; public DBconn() {try {Class.forName(DBDriver); } catch(java.lang.ClassNotFoundException e) {System.err.println("DBconn (): " + e.getMessage()); } }

public ResultSet executeQuery(String sql) {rs = null;

try

{conn = DriverManager.getConnection(ConnStr,MyUser,MyPassword);

(43)

rs = stmt.executeQuery(sql); } catch(SQLException ex) {System.err.println("aq.executeQuery:"+ex.getMessage() ); } return rs; } } 4.建立好後再利用 JDK 的 Javac 命令編譯 DBconn.java 形成相應 的 class 文 件 , 放 在 相 同 的 資 料 夾 中 。 接 著 在 c:\jakarta-tomcat\webapps\examples 下創建 my_test.jsp, 用 notebook 编辑。如下:

<%@page language="java" import="java.sql.*" contentType="text/html; charset=big5" %>

<%//可以修改的參數

String ls_username = "root"; //資料庫用戶名 String ls_password = "cecilia1"; //密碼 String ls_server = "localhost";

String ls_dbname = "test"; // 資料庫名稱 Connection con = null; // 連線物件 Statement Stmt = null; try // 偵測是否有意外狀況發生 { //註冊 JDBC 連接驅動 Class.forName("org.gjt.mm.mysql.Driver"); //與資料庫建立連接 con = DriverManager.getConnection("jdbc:mysql://"+ls_server+ "/"+ls_dbname,ls_username,ls_password); Stmt =

(44)

con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Re sultSet.CONCUR_READ_ONLY); } catch(Exception e) // 接收意外狀況,這是用來配合前一個 try { System.out.println(e.toString()); } %> <html> <head> <title>測試資料庫連接</title>

<meta http-equiv="Content-Type" content="text/html; charset=big5">

</head>

<body bgcolor="#FFFFFF" text="#000000"> <%

int li_count = 0;

String ls_sql = "select * from personal"; // 要執行的 SQL 語法 ResultSet rs = null; try { // 執行過 SQL 語法後,傳回的結果,在這個範例中,會帶 有所有查詢到的資料 rs = Stmt.executeQuery(ls_sql); // rs.next() 是用來讀取下一筆資料 // 如果 rs.next() 有資料,則會一直在 while 迴圈內執行 // 如果沒有下一筆資料的話,rs.next() 就會傳回 false, 就會跳出 while 迴圈

(45)

while(rs.next() ) { out.println(rs.getString("NAME")); out.println(rs.getString("EMAIL")); out.println(rs.getString("ADDRESS")); out.println(rs.getString("PASSWORD")); out.println(rs.getString("SEX")); out.println(rs.getString("ID")); out.println("<BR>"); } } catch(Exception e) { out.println("<br>" + e.toString() + "<br>"); } %> </body> </html> <% try { if(con != null) con.close(); } catch(SQLException sqle) { System.out.println(sqle.toString()); } %> 5.最後,打開一個窗口來看看是否可以看到所選取的資料表,輸 入以下網址來查看其運行結果 http://localhost:8080/examples/my_test.jsp 你應該可以看到你所建的資料表,這時候你就已經成功的連接

(46)

了 JSP 跟 MySQL 了。(如圖 3.11)

(47)

第四章 系統核心架構

本章 3.1 節介紹系統的整體架構與特色簡介。在 3.2 將針對系統 的做法做一個詳細的說明。3.3 節則是此系統的事件流程圖。 4.1 系統發展架構圖與特色簡介 4.1.1 系統架構圖 圖 4.1 系統架構 遠端資料庫 (提供資料供近端 查詢的資料庫) (使用 Access) URL:jdbc:odbc:querydb 瀏覽器 WEB 伺服器 http JDBC 資料庫 伺服器 近端資料庫 (提供對遠端資料庫做查詢 時的資訊(MAPTABLE)) (使用 MySQL) SQL (Tomcat) (JSP/HTML) MAPTABLE

(48)

4.1.2 系統特色簡介 此系統的目的是為了讓資料表欄位數(註一)、欄位名稱(註二)、資 料欄位的對應位置不同(註三)與資料庫型態不同(註四)的兩個資料庫可 以讀取彼此的資料,不受上述條件的不同而無法讀取。 ※ 下列有兩個資料表用來說明註解 資料表一(Access)的欄位資料如下: 編號 姓名 電話 生日 資料表二(MySQL)的欄位資料如下: ID NAME ADDRESS TEL E-MAIL

(註一):欄位數不同是指資料表一有四個欄位,資料表二有五個欄位 (註二):欄位名稱不同是指資料表一的欄位名稱有「編號、姓名、電 話、生日」與資料表二不同,資料表二以英文名稱來表示。 (註三):資料欄位的對應位置不同是指資料表一的「電話」是在第三 欄,而資料表二的電話「TEL」是在第四欄 (註四):資料庫型態不同是指資料表一是 Access 的資料庫,資料表 二是 MySQL 的資料庫。 系統的功能及特色如下: 1.特色: 1)即使資料庫型態不同、欄位數不同、對應位置不同、欄 位名稱不同,仍可透過網路讀取對方資料庫。 資料庫型態不同:例如遠端資料庫是 Access,近端資 料庫是 MySQL。 欄位數不同(Access 有六欄、MySQL 有五欄)、對應位 置不同(ADDRESS 與位址的對應位置不同)、欄位名稱不同:

(49)

NUM 姓名 電話 住址 E-MAIL

ID NAME ADDRESS TEL BIRTHDAY SEX Access MySQL 圖 4.2 解釋資料庫型態不同、欄位數不同、欄位名稱不同、對應位置不同 2)透過網路,即時讀取對方資料庫的資料,且不會更改對 方資料庫裡的資料。 3)因為是線上讀取,因此不同於資料庫轉檔的優點是,資 料不怕讀取到未更新的資料。 例如說:將 Access 的資料匯至 MySQL。 2.功能: 1)在使用者端,輸入帳號、密碼,接著進入查詢畫面,輸 入關鍵資料,即可查詢與近端資料表格式不同的遠端資 料庫裡的資料。 4)在管理者端,進入設定之前,先需輸入資料庫路徑、資 料表名稱等,只要輸入過一次,系統會將紀錄存在 Session 中,以後只要輸入第一個字母變會有下拉式的 選單,可以選取,不必再次鍵入長長的路徑、資料表等 名稱。 2)在管理者端,是用來建立 MAPTABLE。MAPTABLE 可 以看成是用來當作讀取遠端資料表欄位時的指標。 3)當使用者端在讀取查詢遠端資料庫時,會自動去尋找

(50)

MAPTABLE,再去讀取遠端資料表將欲取之欄位資料傳回 近端資料表的對應欄位。 4.2 系統核心架構 本節是說明系統的製作及流程。分為管理者端與使用者端。 4.2.1 管理者端 4.2.1.1 讀取資料庫中的資料表 1.資料庫路徑:透過這個路徑,可以經由網路連到遠端資料庫。 使用 URL 連到資料庫: jdbc:subprotocol://host:port / databasename URL 中的 subprotocol 用來辨識正在使用的特殊資料庫系 統。Java 中的 DriverManager 類別利用 URL 的這個部分,從註 冊中的驅動程式清單中,選擇適當的 JDBC 驅動程式。如果 DriverManager 無法替資料庫找到合適的 JDBC 驅動程式,就會 丟出 SQLException。 在此系統中使用了 MySQL 及 ACCESS,URL 如下: MySQL: jdbc:mysql://localhost:8080/mydata Access: jdbc:odbc:technical_library 2.輸入資料表:使用 SQL 語法連接到資料庫中的某資料表。 SELECT * FROM 資料表 使用 SQL 敘述,將敘述傳到資料庫,再顯示結果。 每次進入時若都要輸入資料庫的路徑名稱及資料表的 SQL 語法,

(51)

或許過於繁瑣及冗長,於是我們使用了「Session」,「Session」的意 義在於當使用者與伺服器連線時,伺服器可以給定每一個上線的使用 者一個 Session 並設定其中的內容,這些 Session 都是個別獨立的, 伺服器端可以藉此來辨識使用者資訊進而提供個別的服務。 4.2.1.2 秀出資料欄位

在 Java 程式中利用 Connection 類別物件負責維護 Java 資料庫程 式和資料庫之間的連結,連到資料庫後,然後利 PreparedStatement 類別將 SQL 指令傳送給資料庫,再利用 ResultSetMetaData 類別 將近端及遠端的資料庫中資料表的欄位特性取出,最後秀出欄位名稱。 *Statement 類別與 Preparedstatement 類別是分常相似的,但我 們選用了 PreparedStatement 類別是因為此類別會將傳入的 SQL 指令編譯並暫存在記憶體中,如此當某單一 SQL 指令在程式 中會被執行許多次時,使用 PreparedStatement 類別再效率上 有所提昇。 4.2.1.3 選擇來源欄位資料 在秀出遠端與近端的資料表欄位後,舉例如下所示: 遠端資料表一 (T1) t1 t2 t3 t4 t5 t6 t7 t8 t9 ID 姓名 身分字號 住址 電話 性別 血型 過敏情形 病史 近端資料表 (T2) a b c d e f NUM 身分字號 NAME 性別 病史 過敏情形 註:遠端資料表示指提供資料查詢的資料庫所包含的資料表,近

(52)

端是指查詢資料者 目的:欲取 T1 中的姓名(t2)、身分字號(t3)、性別(t6)、過敏情 形(t8)、病史(t9)。並將查詢取得的資料依序對應至 T2 中 的 c、b、d、f、e 欄位中。 做法:先將 T1 中的 t2、t3、t6、t8、t9,依欄位的位置編號, 第二欄、第三欄、第六欄、第八欄、第九欄依序將這些數 字儲存至一自訂好的資料表中(在此稱 MAPTABLE)。 *管理者輸入的數字需轉換成 byte 資料型態的字串,因為 MySQL 內部資料庫處理的方式是以 byte 的資料型態來進 行,且 MySQL 的 JDBC 驅動程式在收送資料時是以 String 來 傳送,所以必須經過轉換成 byte 型態的字串傳送到 MySQL 資料庫後才能正確的顯示與處理。 4.2.2 使用者端 4.2.2.1 使用者資料的查詢 在 3.2.1.3 中提到依序將欄位數存入一 MAPTABLE 中,接著使用者 就是透過這個 MAPTABLE 來選擇性的讀取遠端資料庫中資料表的欄位資 料。 首先,鍵入欲搜尋的關鍵值 例如:姓名、身分字號等。 於是程式就會先到 MAPTABLE 這個資料表,把裡面的值取出,再連 接到遠端資料庫,找到符合關鍵值的那列資料,在遠端資料表中,利 用指標一一的指向每個欄位,用 GetColumnCount 來計算,若 MAPTABLE 裡的值和 GetColumnCount 傳出的值相同,則將欄位裡的資料傳回至近 端,然後將資料秀出。

(53)

4.2.3 程式中使用到的類別 4.2.3.1 DriverManaget 類別 這個類別負責管理 JDBC 驅動程式。再使用 JDBC 驅動程式之前, 需先將 JDBC 驅動程式載入並向 DriverManage 類別註冊後才能使用。 載入和註冊驅動程式可以使用 Class.forName 這個函式來完成。 DriverManage 類別也負責建立 Java 程式和資料庫的連線。 DriverManage 提供的函式如下表: 表 4.1 DriverManage 提供的函式 函 式 說 明 Connection getConnection( String ur1,String user,String password ) 取得資料庫的連線 ur1=” jdbc:<subprotocol>:<subname> user:連接資料庫的使用者名稱 password:使用者密碼 Driver getDriver(String ur1) 再已經向 DriverManager 註冊的驅動程式 中尋找一個能夠開啟 ur1 所指定的資料庫 驅動程式 4.2.3.2 Connection 類別 Connection 類別物件負責維護 Java 資料庫程式和資料庫之間的 聯結。透過 Connection 類別可以建立出另外三種類別物件。分別是:

「Statement」、「PreparedStatement」、「DatabaseMetaData」類別。

1.Statement 類別:主要功能是將 SQL 指令傳送給資料庫,並將 SQL 指令的執行結果傳回。

(54)

表 4.2 Statement 類別提供的函式 函 式 說 明 ResultSet executeQuery(String sql) 使用 SQL 指令 SELECT 對資料庫進行 查詢紀錄作業

Int executeUpdate(String sql) 使用 SQL 指令 INSERT、DELETE 和 UPDATE 對資料庫進行新增、刪除和 修改紀錄

Void close() 結束 Statement 類別物件對資料庫 的連線

2.PreparedStatement 類別:與 Statement 是相似的。

表 4.3 PreparedStatement 類別提供的函式

函 式 說 明

ResultSet executeQuery() 使用 SQL 指令 SELECT 對資料庫進行

查詢紀錄作業

Int executeUpdate() 同 statement

ResultSetMetaData getMetaData 取得 ResultSet 類別物件有關欄 位的相關資訊

3.DatabaseMetaData 類別:不同公司研發的資料庫系統擁有不同 的特性,DatabaseMetaData 類別保存了資料庫的特性,還提供 函式來取得資料庫的特性。

(55)

4.3 系統的資料流程圖 資料流圖的符號及符號名稱,利用 Yourdon 符號集。 外部實體 過程 資料流 資料儲存 4.3.1 管理者端 帳號、密碼 輸入資料庫 路徑及資料 表名稱 確認 登入 管理者 秀出遠端及 近端資料表 欄位名稱 欄位數字 MAPTABLE 將數字存入 一資料表 (maptable) 利用 checkbox 勾選欲得之欄 位 路徑及資料表名稱 欄位數字 欄位名稱 圖 4.3 管理者端的資料流程圖

(56)

3.3.2 使用者端 輸入帳號密碼 秀出所求 資料 輸入欲查詢的關鍵值 取 得 g et co lu m n co u n t 及 與 關 鍵 值 香 符 合 的 欄 位 的 資 料 傳回 MAPTABLE 欄位裡的 資料(是數字) MAPTABLE 使用者資料庫 遠端資料庫 連接遠端資料庫並同 時取出 MAPTABLE 裡的欄位值與遠端資 料表 getColumnCount 相比對 查詢 確認 登入 使用者 圖 4.4 使用者端的資料流程圖

(57)

第五章 未來展望及心得

5.1 心得 5.1.1 徐憶茹

從完全不會 java 到學習 Java Server Pages,SQL,HTML,JDBC, 安裝資料庫伺服器(Tomcat),一步步走來,從遇到挫折然後解決問題, 都是一些些經驗的累積。 有時候程式寫不好,Debug 也找不出問題所在,就會把程式一段段 分解,一部份一部份測試,就好像在做電路實驗一樣,想找出短路的 地方。或許有時是一個小問題,但想不通就是沒辦法解決,我就會把 問題先丟著,離開電腦前,把有關的書拿出來看一看,或是去做一些 不用腦筋的事,常常會因為這樣而有所領悟,突然開竅了。那樣的心 情實在很奇妙。 之後,系統有了一些基本的功能以後,就會開始想可能會有哪些問 題,有些問題都是在實作中才想到的,因為專題在十月時換了題目, 這樣的時間實在有點短,很多事情都還來不及把它做到最好,像是人 性化的介面,看起來很不錯的介面實在是很重要,就像人的外表一樣, 大家第一眼看到的都是外表給人的印象。在專題製作的期間,我覺得 跟別人討論是一件很不錯也很重要的事,除了學會跟別人溝通外,對 於專題問題的靈感也很有刺激的作用,很多的問題都是經由討論發現 的。這個專題雖然歷經波折,遇到更改題目、組員生病等問題,但終 於還是把它完成了,我覺得這是一個很不錯的經驗,姑且不論做出來 的東西怎麼樣,但其過程是不可抹滅的。 5.1.2 蔡曉君 在我過去幾年的大學生活中,從來沒有接觸過類似像專題一樣很 大型完整的專案,這需要從一開始的構思、設計規劃到實做,之後再 把每個人所做的組合成一個完整的系統。所以剛開始的時候,真的有

數據

圖 表 目 錄  圖 2.1  將物件以圖形表現.................  4  圖 2.2  繼承-子物件以及上層物件.............  5  圖 2.3  請求 JSP 網頁的過程................  7  圖 2.4  JDBC 驅動程式存取架構 .............. 13  圖 2.5 JDBC API 元素 ..................  14  圖 3.1 新增編輯系統變數(JDK)  ..............  28  圖 3.2 設定 T
圖 2.4 JDBC 驅動程式存取架構
圖 3.9 建立新資料表的簡單例子
圖 3.10 新增和查詢資料表內的紀錄 另外,若要刪除資料庫或資料表的話可用 drop 指令  8.刪除資料庫 資料表:  mysql&gt;drop table 資料表名稱;  mysql&gt;drop database 資料庫名稱;  以上如此,我們就已經建立好了一個叫做 test 的資料庫和一個在 test 裡面的一個叫做 personal 的資料表了。  3.3.3 JSP 連接 MySQL  1
+3

參考文獻

相關文件

請問下列的

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple

National Taiwan University July 9, 2005 Page 5..

Contains the core Swing components, including most of the model interfaces and support

JRE (Java Runtime Environment): for users, JVM + basic libraries JDK (Java Development Kit): JRE + compilers + ... —jdk-6u12-windows-i586-p.exe or other platform

• Copy a value from the right-hand side (value or expression) to the space indicated by the variable in the left-hand side.. • You cannot write codes like 1 = x because 1 cannot

• Instead, static nested classes do not have access to other instance members of the enclosing class. • We use nested classes when it

• Instead, static nested classes do not have access to other instance members of the enclosing class. • We use nested classes when it