欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在 Eclipse 中開(kāi)發(fā) Apache Derby 應用程序

在 Eclipse 中開(kāi)發(fā) Apache Derby 應用程序

級別: 初級

Gilles Roux (groux@us.ibm.com), 信息管理軟件工程師, IBM

2005 年 2 月 01 日

在開(kāi)發(fā) Apache Derby 應用程序的過(guò)程中需要執行很多任務(wù),例如創(chuàng )建和連接數據庫,編寫(xiě) Java? JDBC 客戶(hù)機應用程序和存儲過(guò)程,以及將最終得到的軟件組件部署到生產(chǎn)環(huán)境。本文旨在發(fā)現如何結合使用各種基于 Eclipse 的 Apache Derby 工具來(lái)簡(jiǎn)化這一開(kāi)發(fā)過(guò)程。

概述

本文的目的是向您展示如何在 Eclipse 集成開(kāi)發(fā)環(huán)境(IDE)中使用幾種不同的工具,例如 Java Development Tools、IBM? DB2? plug-ins for Eclipse 和 IBM integration plug-in for Derby,以便開(kāi)發(fā) Apache Derby 應用程序。

本文將介紹一個(gè)典型 Derby 應用程序的整個(gè)開(kāi)發(fā)周期,從數據庫的創(chuàng )建開(kāi)始,然后經(jīng)歷 JDBC 客戶(hù)機應用程序的開(kāi)發(fā),存儲過(guò)程和函數的開(kāi)發(fā),最后是解決方案的開(kāi)發(fā)。本文還將描述必要時(shí)如何用 DB2 Universal Database (UDB) 數據庫替代 Apache Derby 數據庫。

本文假設您對 Apache Derby 數據庫、Eclipse 平臺和 DB2 plug-ins for Eclipse 有基本的理解。強烈建議您閱讀 參考資料 一節中列出的文章“與 Apache Derby 一起使用 DB2 plug-ins for Eclipse”的兩個(gè)部分。

為了闡明應用程序開(kāi)發(fā)中涉及的各種不同任務(wù),作者 Gilles Roux 將提供關(guān)于如何構建一個(gè)示例應用程序的具體例子和逐步說(shuō)明。

在這個(gè)例子中,您需要開(kāi)發(fā)一個(gè)命令行應用程序來(lái)執行一家書(shū)店的庫存管理。書(shū)店的數據庫存儲了這家書(shū)店擁有的各種書(shū)籍,以及這些書(shū)籍的現有數量。

這個(gè)示例應用程序將允許您訪(fǎng)問(wèn)這些數據,并允許您更改書(shū)籍的數量。例如,如果從一個(gè)供應商那里收到一批書(shū),那么就要使用這個(gè)應用程序來(lái)添加所收到書(shū)籍的數量。如果書(shū)籍的數量超過(guò)或者低于某個(gè)限制,則需要用電子郵件通知管理員,以便其采取必要的行動(dòng)。

開(kāi)發(fā)環(huán)境

工具

Java Development Tools(JDT)是一組內建到 Eclipse 中的插件,為編輯、編譯、調試、執行和部署一般用途的 Java 應用程序提供了一種方法。

DB2 plug-ins for Eclipse 提供了連接到各種數據庫(包括 IBM Cloudscape 和 Apache Derby)的一組功能。這個(gè)插件是以下幾個(gè)插件的組合。

  • Connection Wizard:用于創(chuàng )建和連接 DB2、Cloudscape 或 Derby 數據庫。
  • Database Explorer View:用于瀏覽數據庫對象。
  • SQL Scrapbook:用于編輯和執行單獨的 SQL 語(yǔ)句。
  • Database Output View:用于對一個(gè)表的內容進(jìn)行抽樣或者查看一條 SQL 語(yǔ)句的執行結果。
  • Migration Wizard:用于自動(dòng)地將一個(gè)現有 Derby 數據庫遷移到 DB2 UDB。

 

IBM integration plug-in for Derby 將很多有用的 Derby 工具集成到了 Eclipse 環(huán)境中。下面是該工具所提供的主要功能:

  • Apache Derby Nature:使 Eclipse 項目可以執行 Derby 任務(wù)。
  • Network Server:直接從 Eclipse 項目中配置和啟動(dòng) Derby Network Server。
  • IJ:直接在 Eclipse 控制臺中以交互模式或腳本模式啟動(dòng) Derby 命令行實(shí)用程序。
  • Sysinfo:顯示與項目相關(guān)的 Derby 系統信息。

 

DB2 plug-ins for Eclipse 和 IBM Integration plug-in for Derby 是兩個(gè)獨立的工具,但是它們之間互補性很強,前者提供了一般數據庫連接,而后者則提供了訪(fǎng)問(wèn)很多特定于 Derby 特性的訪(fǎng)問(wèn)途徑。

然而,很多任務(wù)都可以通過(guò)這些工具中的任意一個(gè)來(lái)執行,效果是一樣的。本文提到了執行一個(gè)給定任務(wù)的各種不同方法,從而使每個(gè)用戶(hù)都可以選擇他們所喜愛(ài)的工作方式。

安裝工具

首先要下載和安裝 DB2 plug-ins for Eclipse。該產(chǎn)品包括 DB2 插件,并且是基于 Eclipse 3.0 的,后者本身就包括了 JDT。

然后從 Apache.org 下載 Apache Derby plug-in,并在安裝了前面軟件的基礎上安裝此軟件。

最后,下載 IBM Integration plug-in for Derby 并在安裝了 eclipse 的基礎上安裝此軟件。該插件包括 JCC JDBC 驅動(dòng)程序和 Derby 集成工具。

設置開(kāi)發(fā)環(huán)境

如前所述,您將使用幾種不同的工具來(lái)開(kāi)發(fā)應用程序:DB2 plug-ins for Eclipse、IBM Integration plug-in for Derby 和 JDT。這些工具都是基于 Eclipse 的,因此它們可以很好地集成到一個(gè)單獨的開(kāi)發(fā)環(huán)境中。

在開(kāi)發(fā)應用程序時(shí),通常要建立一些到數據庫的連接:

  • 使用 Database Explorer 瀏覽數據庫。
  • 使用 Derby ij 命令行實(shí)用程序執行 SQL 語(yǔ)句。
  • 在測試時(shí)應用程序自己將連接到數據庫。

 

Derby 數據庫引擎可以在多種配置下運行。最簡(jiǎn)單的一種是嵌入式配置,但在這里不適合,因為需要通過(guò)運行在不同 Java 虛擬機上的幾種工具建立連接。而且,在生產(chǎn)環(huán)境中,可能需要從多個(gè)應用程序中訪(fǎng)問(wèn)數據庫。因此,這里使用 Network Server 配置。IBM Integration plug-in for Derby 提供了一種選擇,以便可以很容易地從 Eclipse 項目目錄中啟動(dòng)本地機器上的 Derby Network Server。接著(zhù)要配置應用程序和其他工具,以連接到該網(wǎng)絡(luò )服務(wù)器。下圖展示了配置情況。


圖 1. 開(kāi)發(fā)環(huán)境配置

設置環(huán)境的第一步是創(chuàng )建項目。選擇“File->New->Project->Java Project”并輸入 bookstore 作為項目名稱(chēng)。這樣就創(chuàng )建了一個(gè) Java 項目,然后切換到 Java perspective(透視圖)中。右擊該項目并選擇“Apache Derby->Add Apache Derby nature”。這樣使您的項目可以使用 Apache Derby 特性,然后設置該 Java 項目的構建路徑,以便應用程序可以訪(fǎng)問(wèn) Derby 數據庫和 JDBC 驅動(dòng)程序。

DB2 plug-ins for Eclipse 通??梢詮?Data perspective 訪(fǎng)問(wèn),并且無(wú)需與某個(gè)特定的項目相關(guān)聯(lián)。為了簡(jiǎn)化開(kāi)發(fā)過(guò)程,避免 Java perspective 和 Data perspective 之間的切換,需要將 DB2 plug-ins 視圖,即 Database Explorer 視圖和 DB Output 視圖,添加到 Java perspective。這可以通過(guò) Show View->Other 菜單來(lái)完成。下圖展示了開(kāi)發(fā)環(huán)境的外觀(guān)。


圖 2. 開(kāi)發(fā)環(huán)境布局
 

創(chuàng )建數據庫

在開(kāi)始編寫(xiě)實(shí)際的應用程序代碼之前,需要創(chuàng )建應用程序將要用到的數據庫,或者連接到一個(gè)已有的數據庫。

首先通過(guò)右擊項目并選擇“Apache Derby->Start Derby Network Server”來(lái)啟動(dòng) Derby Network Server。每次重新啟動(dòng) Eclipse 時(shí)都需要執行這一步。這時(shí)項目圖標上有一個(gè)綠色的箭頭,表明服務(wù)器正在運行。

創(chuàng )建數據庫

創(chuàng )建一個(gè) Derby 數據庫非常類(lèi)似于連接到一個(gè)已有的數據庫:通過(guò)將 create=true 屬性包括在 URL 中,可以指示數據庫引擎在您第一次連接到數據庫時(shí)創(chuàng )建該數據庫。這可以通過(guò)使用 DB2 plug-ins for Eclipse 的 Connection Wizard 來(lái)完成。下面的表展示了在這個(gè)向導中應該使用的參數。

表 1. 連接參數

Connection name bookstoredb
Database Manager Apache Derby v10.0
JDBC Driver IBM DB2 Universal 需要使用這個(gè)參數來(lái)連接到網(wǎng)絡(luò )服務(wù)器
Database bookstoredb 要創(chuàng )建的數據庫的名稱(chēng)
Host localhost 網(wǎng)絡(luò )服務(wù)器運行在本地機器上
Port Number 1527 默認端口號
Class Location 比如: C:\eclipse\plugins\ com.ibm.cloudscape.ui_1.0.0\db2jcc_license_c.jar;C:\eclipse\plugins\com.ibm.cloudscape.ui_1.0.0 \db2jcc.jar
Create database if required yes 需要使用這個(gè)參數在第一次連接時(shí)創(chuàng )建數據庫
User ID bookstore 數據庫上的認證沒(méi)有被啟用,因此可以使用任何用戶(hù),但是用戶(hù)名將定義默認模式
Password aaa 數據庫上的認證沒(méi)有被啟用,因此可以使用任何密碼


圖 3. 使用 Connection Wizard 創(chuàng )建數據庫

完成該向導后,便創(chuàng )建了一個(gè)數據庫,并且向 Database Explorer View 中添加了一個(gè)連接。通過(guò)展開(kāi)連接的節點(diǎn),就可以瀏覽這個(gè)數據庫,但是顯然這個(gè)時(shí)候它是空的。

數據庫被創(chuàng )建在 Derby 網(wǎng)絡(luò )服務(wù)器的當前目錄中,也就是之前創(chuàng )建 Eclipse 項目時(shí)所在的目錄??梢酝ㄟ^(guò)右擊項目名并選擇 Refresh 來(lái)刷新該項目,這樣將顯示一個(gè)新的 bookstoredb/ 目錄,該目錄包含用于數據庫的文件。不要試圖修改這些文件,否則數據庫會(huì )受到損壞。

創(chuàng )建數據庫對象

接下來(lái)的步驟是創(chuàng )建應用程序將要用到的數據庫對象。在這里,只需使用 SQL Scrapbook 創(chuàng )建一個(gè)表即可。SQL Scrapbook 可以通過(guò)右擊連接名并選擇“Open SQL Scrapbook”來(lái)調用。這時(shí)將打開(kāi)一個(gè)新的編輯器,在這個(gè)編輯器中可以輸入要發(fā)出的 SQL 語(yǔ)句:


清單 1. CREATE TABLE 語(yǔ)句
                                create table books(                                id int,                                title varchar(128),                                author varchar(128),                                price decimal(6,2),                                quantity int,                                status int                                )                                

請注意,SQL Scrapbook 只能用于執行單條的 SQL 語(yǔ)句。而且,不要以分號來(lái)結束 SQL 語(yǔ)句。然后,可以按下主 Eclipse 按鈕欄中的“Execute SQL statement”按鈕。DB Output 視圖應該顯示結果是成功的。還可以刷新連接,以及驗證數據庫現在是否包含新創(chuàng )建的表。


圖 4. 使用 SQL Scrapbook 創(chuàng )建表

創(chuàng )建測試數據

現在通過(guò)執行 INSERT 語(yǔ)句向 books 表填充一些測試數據。這也可以通過(guò) SQL Scrapbook 來(lái)實(shí)現,但這里我們使用了 IBM Integration plug-in for Derby 的“Run SQL script using ij”功能。這項功能允許使用 Derby 命令行實(shí)用程序執行 SQL 腳本,并在 Eclipse 輸出視圖中查看結果。這種方法的一大優(yōu)點(diǎn)是:它允許一次執行多條語(yǔ)句。而且,這種方法要求在腳本的開(kāi)始處包含一條連接語(yǔ)句,因此您可以對連接 URL 有更多的控制。

表 2. SQL Scrapbook 和 IJ 腳本 之間的不同之處

SQL Scrapbook 執行 IJ 腳本
語(yǔ)句存儲在一個(gè)文件中 不是
一次可以執行多條語(yǔ)句 不是
語(yǔ)句終止符 不允許有終止符 分號
編輯功能 語(yǔ)法高亮顯示,內容輔助 沒(méi)有
到數據庫的連接 SQL scrapbook 被關(guān)聯(lián)到一個(gè)給定的連接 第一條語(yǔ)句應該是到所需數據庫的一個(gè)連接

構建 URL 的一種簡(jiǎn)便方法是復制 Connection Wizard 所使用的 URL:在數據庫瀏覽器中右擊連接,然后選擇“Edit Connection”并訪(fǎng)問(wèn)“Connection URL”字段。這里需要添加用戶(hù)名和密碼作為 URL 屬性。

使用 Eclipse 在項目中創(chuàng )建一個(gè)名為 data.sql 的文本文件,并鍵入以下命令:


清單 2. INSERT INTO 語(yǔ)句
                                connect 'jdbc:derby:net://localhost:1527/bookstoredb:user=bookstore;password=aaa;';                                insert into books values(1, 'East Of Eden', 'John Steinbeck', 7.20, 3, 0);                                insert into books values(2, 'Hard-Boiled Wonderland and the End of the World',                                'Haruki Murakami', 10.50, 9, 0);                                insert into books values(3, 'SQL for Dummies', 'Allen G. Taylor', 16.49, 6, 0);                                disconnect;                                

然后就可以在 Project Explorer 中右擊該文件并選擇“Apache Derby->Run SQL script using ij”。Eclipse 的控制臺輸出視圖將顯示執行的結果,這個(gè)結果應該是成功的。然后可以在 Database Explorer 中選擇 books 表,并選擇“Sample Content”,以確信數據真正被插入到這個(gè)表中。


圖 5. 執行 SQL 腳本以插入數據
 

編寫(xiě) Derby Client JDBC 應用程序

裝載 JDBC 驅動(dòng)程序

通過(guò)使用 Eclipse JDT 和 Derby JDBC 驅動(dòng)程序,可以很容易地編寫(xiě) JDBC 應用程序。首先使用 JDT Class 向導在 bookstoreapp.clientside 包中創(chuàng )建一個(gè) Inventory 類(lèi),并在類(lèi)中添加一個(gè) main() 方法。由于啟用了 Derby nature,所以包含 JDBC 驅動(dòng)程序和 Derby 類(lèi)的 JAR 文件已經(jīng)位于項目的類(lèi)路徑中。

在連接到一個(gè) Derby 數據庫之前,需要使用 Class.forName(jdbcDriverClassName) 方法裝載適當的 JDBC 驅動(dòng)程序。該方法將裝載參數指定的 JDBC Driver 類(lèi),并注冊這個(gè)類(lèi),以便進(jìn)行下一次 JDBC 連接。

可以使用兩種不同的 JDBC 驅動(dòng)程序,這取決于 Derby 配置:

表 3. Derby JDBC 驅動(dòng)程序

配置 Embedded Server Network Server
所需 JAR 文件 derby.jar db2jcc.jar;db2jcc_license_c.jar
類(lèi)名 org.apache.derby.jdbc.EmbeddedDriver com.ibm.db2.jcc.DB2Driver

由于這個(gè)例子是基于一個(gè)網(wǎng)絡(luò )服務(wù)器配置,因此這里使用 jcc JDBC 驅動(dòng)程序。如果不確定的話(huà),那么正確的類(lèi)名可以通過(guò)從 Connection 向導復制獲得:


清單 3. 裝載 jcc JDBC 驅動(dòng)程序
                                Class.forName("com.ibm.db2.jcc.DB2Driver");                                

連接到數據庫

DriverManager.getConnection(url) 方法用于建立到數據庫的連接。它假設一個(gè)連接 URL,并返回一個(gè) Connection 對象,這個(gè)對象可用于查詢(xún)數據庫。

獲得連接 URL 的一種好方法是在 Database Explorer 視圖中編輯 Derby 連接,并復制從各個(gè)連接屬性自動(dòng)構造而成的連接 URL。出于安全的原因,這里沒(méi)有顯示用戶(hù)名和密碼,因此在應用程序代碼中需要手動(dòng)地將它們添加到 URL 的后面。


圖 6. 使用連接向導構建連接 URL

其他選項也可以添加到 URL 的后面。例如,retrieveMessagesFromServerOnGetMessage=true 選項指示 JDBC 驅動(dòng)程序從 Derby 服務(wù)器獲取可讀的錯誤消息,這在調試連接到遠程 Derby 數據庫的應用程序時(shí)非常有用。

在本文的例子中,使用下列代碼連接到 Derby 數據庫:


清單 4. 連接到數據庫
                                String url = "jdbc:derby:net://localhost:1527/bookstoredb";                                url += ":user=bookstore;password=aaa;";                                url += "retrieveMessagesFromServerOnGetMessage=true;";                                Connection con = DriverManager.getConnection(url);                                

查詢(xún)數據庫

一旦建立了連接,便可以通過(guò)使用 JDBC API 查詢(xún)數據庫。例如,您可以創(chuàng )建一個(gè) Statement 對象,然后使用這個(gè)對象來(lái)執行對數據庫的 SQL 查詢(xún)。查詢(xún)返回一個(gè)用于迭代查詢(xún)結果集的 ResultSet 對象:


清單 5. 執行查詢(xún)并迭代結果集
                                Statement stmt = con.createStatement();                                ResultSet rs = stmt.executeQuery("SELECT * FROM bookstore.books");                                while (rs.next()) {                                System.out.print(rs.getString(1) + ", ");                                System.out.print(rs.getString(2) + ", ");                                System.out.print(rs.getString(3) + ", ");                                System.out.print(rs.getString(4) + ", ");                                System.out.print(rs.getString(5) + ", ");                                System.out.println(rs.getString(6));                                }                                rs.close();                                stmt.close();                                


圖 7. 運行 JDBC 應用程序

要了解關(guān)于使用 JDBC 的更多信息,請參閱本文 參考資料 一節中列出的 JDBC 教程。

您可以下載 Inventory 類(lèi)的完整代碼。這個(gè)類(lèi)實(shí)現了一個(gè)簡(jiǎn)單的文本界面,用于列出書(shū)店中的書(shū)籍以及更新書(shū)店中給定的某種書(shū)籍的數量。

下面是應用程序輸出的一個(gè)例子:


圖 8. Inventory 應用程序的示例輸出
 

編寫(xiě) Java 函數和過(guò)程

前一節中討論的 JDBC 應用程序對于開(kāi)發(fā)用于用戶(hù)的前端應用程序非常有用。然而,在這一層中實(shí)現重要的應用程序邏輯不是很妥當,因為應用程序邏輯放置在數據庫之外,這使得數據庫更容易受到損壞。例如,如果另一個(gè) JDBC 應用程序連接到同一個(gè)數據庫,那么就需要確保它實(shí)現相同的邏輯。對于這個(gè)問(wèn)題,一種解決辦法是通過(guò)使用觸發(fā)器、存儲過(guò)程和函數,在數據庫中實(shí)現數據庫規則。

編寫(xiě) Java 代碼

由于 Derby 是一種 Java 數據庫,因此它沒(méi)有自己的存儲過(guò)程/函數語(yǔ)言,而是使用 Java 語(yǔ)言??梢酝ㄟ^(guò)創(chuàng )建一個(gè) Java 方法,然后基于這個(gè) Java 方法聲明一個(gè) Derby 過(guò)程或函數,從而創(chuàng )建 Derby 存儲過(guò)程或函數(通常稱(chēng)為例程)。對 Derby 例程的調用將導致這個(gè) Java 方法被調用。

為了讓這種調用獲得成功,重要的是讓 Derby 和 Java 例程的聲明相匹配。下面的表展示了應該使用的 Derby 和 Java 特性的映射。

表 4. 用于編寫(xiě) Java 函數和過(guò)程的特性映射

Derby Java
過(guò)程 沒(méi)有返回值的公共靜態(tài)方法
函數 有一個(gè)返回值的公共靜態(tài)方法
輸入參數(過(guò)程或函數) 方法參數
輸出參數(過(guò)程) 單入口數組參數
輸入/輸出參數(過(guò)程) 單入口數組參數
返回值(函數) 返回值
返回的結果集 附加的單入口 java.sql.ResultSet[] 參數

表 5. 用于編寫(xiě) Java 函數和過(guò)程的類(lèi)型映射

Derby Java
SMALLINT short
INTEGER int
BIGINT long
DECIMAL(p,s) java.math.BigDecimal
REAL float
DOUBLE PRECISION double
CHAR(n) String
VARCHAR(n) String
LONG VARCHAR *unsupported*
CHAR(n) FOR BIT DATA byte[]
VARCHAR(n) FOR BIT DATA byte[]
LONG VARCHAR FOR BIT DATA *unsupported*
CLOB(n) *unsupported*
BLOB(n) *unsupported*
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp

對于 Java 方法本身的內容沒(méi)有約束,因此任何合法的 Java 代碼都可以作為 Derby 過(guò)程或函數來(lái)調用。一種有趣的應用是使用標準 derby:default:connection URL 建立到 Derby 數據庫的 JDBC 連接,以便查詢(xún)發(fā)出調用的數據庫。還可以使用完整 JDBC URL 連接到另一個(gè)數據庫。

對于本文的應用程序,需要在 bookstoreapp.serverside 包中創(chuàng )建一個(gè) DerbyFunctions 類(lèi),用于容納數據庫服務(wù)器將要運行的所有 Java 方法。然后可以創(chuàng )建一個(gè) updateQuantity 方法,當更新一種書(shū)籍的數量時(shí),將調用該方法。調用該方法時(shí)需要提供這種書(shū)籍的 ID、titleauthor,以及舊的數量和新的 quantity。這個(gè)方法將返回一個(gè)整數值,用于表明是否到達數量限制。

因此,這個(gè) Java 方法的聲明如下:


清單 6. Java 方法的聲明
                                public static int updateQuantity(int id, String title, String author,                                int oldQuantity, int newQuantity)                                

這個(gè)函數的作用是:當書(shū)的數量達到一個(gè)下界或上界時(shí),就發(fā)送一封電子郵件。因此,可以聲明 LOW_LIMITHIGH_LIMIT 常量,并測試舊的數量是否低于下界,新的數量是否高于上界或低于下界。如果條件符合,那么可以調用另一個(gè)負責發(fā)送電子郵件的 Java 方法。在這個(gè)例子中,只是輸出一條調試消息,而不發(fā)送真正的電子郵件。

下面是完整的代碼:


清單 7. DerbyFunctions 類(lèi)
                                package bookstoreapp.serverside;                                public class DerbyFunctions                                {                                public static final int LOW_LIMIT = 2;                                public static final int HIGH_LIMIT = 10;                                public static int updateQuantity(int id, String title, String author,                                int oldQuantity, int newQuantity)                                {                                if ( oldQuantity<HIGH_LIMIT && newQuantity>=HIGH_LIMIT )                                sendEMailAlert("High limit reached", "title: "+title+", author: "+author);                                else if ( oldQuantity>LOW_LIMIT && newQuantity<=LOW_LIMIT )                                sendEMailAlert("Low limit reached", "title: "+title+", author: "+author);                                if (newQuantity>=HIGH_LIMIT)                                return +1;                                else if (newQuantity<=LOW_LIMIT)                                return -1;                                else                                return 0;                                }                                public static void sendEMailAlert(String subject, String msg)                                {                                System.out.println("Sending email: " + subject);                                System.out.println(msg);                                }                                }                                

從 main 方法中調用這個(gè) Java 方法,以便對其進(jìn)行測試,這通常是一種很好的做法。

創(chuàng )建 Derby 函數

創(chuàng )建 Derby 存儲過(guò)程或函數比較容易,只需指定名稱(chēng)、參數、返回值和相應 Java 方法的全限定名稱(chēng)即可。Derby 例程的標簽必須與 Java 方法的標簽相匹配,以便數據庫可以成功地調用 Java 代碼。

可以很容易地從 SQL Scrapbook 發(fā)出 CREATE 語(yǔ)句,但是在這個(gè)例子中,最好使用 ij 實(shí)用程序。如果使用 ij 實(shí)用程序,便可以顯式地指定連接 URL,從而允許我們包括 retrieveMessagesFromServerOnGetMessage=true 屬性。該選項導致 JDBC 驅動(dòng)程序從服務(wù)器獲取完整的錯誤消息,當語(yǔ)句執行失敗時(shí),這一點(diǎn)很有幫助。

下面是在 ij 中發(fā)出的命令:


清單 8. 在 Derby 中創(chuàng )建 Java 函數
                                connect 'jdbc:derby:net://localhost:1527/bookstoredb                                :user=bookstore;password=aaa;retrieveMessagesFromServerOnGetMessage=true;';                                create function updateQuantity(id int, title varchar(128), author varchar(128),                                oldQuantity int, newQuantity int) returns int                                PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA                                EXTERNAL NAME 'bookstoreapp.serverside.DerbyFunctions.updateQuantity';                                

Derby 函數的創(chuàng )建應該可以成功,但有時(shí)候我們很難一開(kāi)始就能保證語(yǔ)句完全正確。下面是可能發(fā)生的一些常見(jiàn)錯誤:

  • ERROR 42962: Long column type column or parameter 'I' not permitted in declared global temporary tables or procedure definitions. 如果使用一種不受支持的參數類(lèi)型聲明一個(gè) Derby 過(guò)程,就會(huì )發(fā)生這種錯誤。
  • ERROR 42X50: No method was found to be able to match method call pack.A.p(int), even tried all combinations of object and primitive types and any possible type conversion for any parameters the method call may have. It may be that the method exists, but it is not public and/or static, or that the parameter types are not method invocation convertible. 當調用一個(gè)過(guò)程/函數時(shí),如果 Derby 不能找到與過(guò)程/函數聲明相匹配的 Java 方法,就會(huì )發(fā)生這種錯誤。錯誤消息給出了不能找到的 Java 方法的標簽。

 

請注意,如果更改了方法的 Java 代碼,那么就需要停止并重新啟動(dòng) Derby 網(wǎng)絡(luò )服務(wù)器,以便數據庫引擎的類(lèi)裝載器裝載新的代碼。

成功地創(chuàng )建了 Derby 例程之后,就可以通過(guò) ij 命令行調用這個(gè)例程,以便對其進(jìn)行測試??梢酝ㄟ^(guò)使用 CALL 語(yǔ)句來(lái)調用 derby 過(guò)程,但在這里因為需要測試一個(gè)函數,因此發(fā)出以下命令:


清單 9. 調用 Derby 中的 Java 方法
                                values(updateQuantity(1, 'title', 'author', 5, 15));                                

IJ 顯示返回值,在這里,這個(gè)返回值為 1,因為數量到達了上界。由于這個(gè) Java 方法是在 Derby 服務(wù)器 JVM 中運行的,因此調試消息將被輸出到服務(wù)器的標準輸出中。使用 eclipse 控制臺視圖切換到 Derby 網(wǎng)絡(luò )服務(wù)器控制臺,您應該可以看到一條 Sending email... 消息。

還可以嘗試使用以下代碼從 JDBC 應用程序中調用 Derby 函數:


清單 10. 從客戶(hù)機應用程序中調用 Java 方法
                                stmt.executeQuery("values(updateQuantity(1, 'title', 'author', 5, 15)); ");                                

結果應該與前面測試中的結果一致。

從 Derby 觸發(fā)器中調用函數

本節最后一步是配置 Derby,以便每次更新某種書(shū)籍的數量時(shí),調用之前定義的函數。這可以用一個(gè)觸發(fā)器來(lái)實(shí)現。

derby 觸發(fā)器包含關(guān)于要執行的動(dòng)作以及何時(shí)執行動(dòng)作的信息。

表 6. CREATE TRIGGER 語(yǔ)句的子句

INSERT、DELETE 或 UPDATE UPDATE
REFERENCING 子句 OLD AS OLD, NEW AS NEW。為了調用那個(gè)函數,需要能夠引用舊的和新的數量
FOR EACH 子句 FOR EACH ROW。即使有多行被更新,對函數的調用也是逐行進(jìn)行的
動(dòng)作 update books set status = updateQuantity(…) where id = NEW.id;

下面是在 ij 中發(fā)出的用于創(chuàng )建觸發(fā)器的語(yǔ)句:


清單 11. CREATE TRIGGER 語(yǔ)句
                                create trigger updateQuantityTrig after update of quantity on books                                referencing OLD as OLD NEW as NEW for each row mode db2sql                                update books set status = updateQuantity(NEW.id, NEW.title, NEW.author,                                OLD.quantity, NEW.quantity) where id = NEW.id;                                

檢查觸發(fā)器是否有效的一種簡(jiǎn)便方法是使用以下命令從 ij 工具中更新 book 表:update books set quantity=10 where id=1; 對表的修改將觸發(fā)函數的調用,從而導致執行 Java 方法。這將更新書(shū)的狀態(tài),并發(fā)送一條消息,這條消息可以通過(guò)切換到網(wǎng)絡(luò )服務(wù)器控制臺視圖來(lái)查看。

由于觸發(fā)器直接存儲在數據庫中,因此無(wú)論如何更新數據,對觸發(fā)器的調用都將是一致性的。由于這個(gè)原因,如果您試圖使用客戶(hù)機應用程序更新數量,那么您將看到,適當的時(shí)候就會(huì )生成電子郵件消息,不需要對應用程序作任何更改。

下圖展示了客戶(hù)機應用程序的輸出,用的是原始數據。注意,這一次書(shū)的狀態(tài)會(huì )獲得更新,并生成了一條消息:


圖 9. Inventory 應用程序的示例輸出


圖 10. Network Server 的示例輸出
 

部署應用程序

至此,您已經(jīng)有了一個(gè)功能完備的數據庫和客戶(hù)機應用程序,但它們仍然只能在 Eclipse 環(huán)境中運行,在生產(chǎn)環(huán)境中不被接受。因此,還需要執行應用程序的部署。

將 Java 函數存儲在數據庫中

如前所述,Derby Java 函數或過(guò)程是由數據庫引擎自身來(lái)執行的。因此,數據庫引擎必須能夠訪(fǎng)問(wèn) Java 類(lèi)。在這個(gè)例子中,這一點(diǎn)是沒(méi)有問(wèn)題的,因為 Derby 網(wǎng)絡(luò )服務(wù)器運行在 Eclipse 項目中,并且使用項目的類(lèi)路徑,該類(lèi)路徑包含了已創(chuàng )建的所有 Java 類(lèi)。

在一個(gè)典型的生產(chǎn)環(huán)境中,您不需要更改用于 Derby 網(wǎng)絡(luò )服務(wù)器的類(lèi)路徑。Derby 提供了一些可以解決這個(gè)問(wèn)題的過(guò)程:

  • sqlj.install_jar 過(guò)程將一個(gè) JAR 文件安裝到數據庫中。JAR 文件在安裝好之后便無(wú)法修改,但是可以使用 sqlj.remove_jarsqlj.replace_jar 來(lái)刪除或更新 JAR。
  • derby.database.classpath 屬性包含數據庫將要使用的附加類(lèi)路徑條目??梢酝ㄟ^(guò)使用 syscs_util.syscs_set_database_property 過(guò)程更新這個(gè)屬性,以便更新屬性和包含已安裝的 JAR。

 

對于本文中的例子,首先要創(chuàng )建一個(gè) JAR 文件,這個(gè) JAR 文件包含 DerbyFunctions 類(lèi)。這可以在 Eclipse 中通過(guò)右擊這個(gè)類(lèi)并選擇 Export->JAR file 來(lái)完成創(chuàng )建任務(wù)。

然后可以使用下列命令(在 ij 中)將 JAR 文件安裝到數據庫中,并將其添加到類(lèi)路徑中:


清單 12. 將 JAR 文件存儲在 Derby 數據庫中
                                CALL sqlj.install_jar('functions.jar', 'bookstore.functionsjar', 0);                                CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(                                'derby.database.classpath', 'bookstore.functionsjar');                                

做完這些后,Java 代碼便屬于數據庫,這使得數據庫的轉移和啟動(dòng)變得很容易。整個(gè)數據庫目錄可以直接轉移到一個(gè)完全不同的環(huán)境中,并且可以正常運行。

網(wǎng)絡(luò )服務(wù)器配置

在開(kāi)發(fā)應用程序時(shí),我們使用了網(wǎng)絡(luò )服務(wù)器配置,這樣一來(lái),應用程序的部署就會(huì )按正確的方式打包各個(gè)組件。

在服務(wù)器端,需要安裝:

  • derby.jar,其中包含 Derby 數據庫引擎。
  • derbynet.jar,其中包含網(wǎng)絡(luò )服務(wù)器。
  • bookstoredb/ 目錄,其中包含數據庫,還包括帶有函數的 JAR 文件。

 

這些組件可以復制到任何裝有 JVM 的機器上,網(wǎng)絡(luò )服務(wù)器可以使用下列命令來(lái)啟動(dòng):


清單 13. 啟動(dòng) Derby 網(wǎng)絡(luò )服務(wù)器
                                java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl start                                

可以使用下列命令可以停止網(wǎng)絡(luò )服務(wù)器:


清單 14. 停止 Derby 網(wǎng)絡(luò )服務(wù)器
                                java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl shutdown                                

在客戶(hù)端,需要安裝:

  • db2jcc.jardb2jcc_license_c.jar,用于 JDBC 驅動(dòng)程序。
  • inventory.jar,這個(gè) jar 包含了應用程序的各個(gè)類(lèi)。通過(guò)使用 eclipse 導出功能,可以很容易地基于應用程序包創(chuàng )建這個(gè) JAR。

 

這些組件可以復制到任何裝有 JVM 的機器上。當網(wǎng)絡(luò )服務(wù)器正在運行時(shí),可以使用以下命令啟動(dòng)應用程序:


清單 15. 啟動(dòng)客戶(hù)機應用程序
                                java -cp db2jcc.jar;db2jcc_license_c.jar;inventory.jar bookstoreapp.clientside.Inventory                                

下圖闡明了網(wǎng)絡(luò )服務(wù)器配置中應用程序的部署:


圖 11. 網(wǎng)絡(luò )服務(wù)器部署配置

下圖展示了應用程序在生產(chǎn)環(huán)境中的執行:


圖 12. 已部署的網(wǎng)絡(luò )服務(wù)器的執行


圖 13. 已部署的客戶(hù)機應用程序的執行

嵌入式服務(wù)器配置

網(wǎng)絡(luò )服務(wù)器配置也許最適合這種類(lèi)型的應用程序,但是也可以使用嵌入式服務(wù)器配置,比如出于性能方面的原因。

在部署應用程序之前,需要在代碼中作一下修改,使連接指向嵌入式服務(wù)器,而不是遠程服務(wù)器。這可以通過(guò)修改 JDBC 驅動(dòng)程序類(lèi)名和連接 URL 來(lái)實(shí)現這一點(diǎn):


清單 16. 新的連接代碼
                                Class.forName("org.apachy.derby.jdbc.EmbeddedDriver");                                String url = "jdbc:derby:bookstoredb";                                

完成這些修改之后,便可以使用 Eclipse 導出功能將應用程序的類(lèi)打包到 JAR 文件中,并將下列文件部署到生產(chǎn)機器上:

  • derby.jar,其中包含 Derby 數據庫引擎和 JDBC 驅動(dòng)程序。
  • inventory.jar,其中包含應用程序的類(lèi)。
  • bookstoredb/ 目錄,其中包含數據庫,還包括帶有存儲過(guò)程和函數的 JAR 文件。

 

可以使用下列命令啟動(dòng)應用程序:


清單 17. 啟動(dòng)應用程序
                                java -cp derby.jar;inventory.jar  bookstoreapp.clientside.Inventory                                

下圖闡明了應用程序在嵌入式服務(wù)器配置中的部署:


圖 14. 嵌入式服務(wù)器部署配置
 

遷移到 DB2

雖然 Apache Derby 是一種非常健壯的、可伸縮的數據庫,但是由于以下原因,您有理由轉而使用企業(yè)數據庫,例如 DB2 UDB:

  • 功能缺乏。
  • 性能受限。
  • 需要與其他數據庫集成。

 

由于有了 DB2 plug-ins for Eclipse,并且客戶(hù)機應用程序是基于標準 JDBC 接口的,所以從 Derby 到 DB2 的遷移很容易完成。

遷移數據庫

第一步是遷移數據庫本身。DB2 plug-ins for Eclipse 提供了一個(gè)工具來(lái)自動(dòng)地將 Apache Derby 數據庫遷移到 DB2 for Linux、Unix 和 Windows。

首先通過(guò)在 DB2 CLP 中發(fā)出 create database bookstoredb 命令創(chuàng )建一個(gè) DB2 數據庫。

然后可以通過(guò)在 Database Explorer 視圖中右擊之前創(chuàng )建的 derby 數據庫條目并選擇 ‘Migrate to DB2 UDB…’ 動(dòng)作來(lái)調用遷移工具。確保 DB2 服務(wù)器已經(jīng)啟動(dòng),并遵循使用說(shuō)明來(lái)創(chuàng )建 DB2 數據庫、遷移數據庫對象和遷移實(shí)際數據。


圖 15. 使用 DB2 plug-ins for Eclipse 遷移 Derby 數據庫

手動(dòng)遷移不受支持的對象

完成了數據庫的遷移之后,遷移工具會(huì )給出一個(gè)報告,指出遷移獲得成功,但是有些對象不能遷移。當前版本的遷移工具不支持觸發(fā)器和函數,因此需要手動(dòng)遷移這些對象。

Apache Derby SQL 語(yǔ)言是與 DB2 兼容的語(yǔ)言,因此可以重復使用以前的 SQL 語(yǔ)句來(lái)創(chuàng )建丟失的對象。在 Database Explorer 中右擊 DB2 連接,并打開(kāi)一個(gè)新的 SQL Scrapbook。

包含 Java 函數的 JAR 文件的安裝與 Derby 的安裝類(lèi)似,惟一的區別是無(wú)需將 JAR 文件添加到類(lèi)路徑。從 DB2 連接打開(kāi)一個(gè) SQL scrapbook,并輸入以下命令:


清單 18. 在 DB2 中安裝 JAR 文件
                                CALL sqlj.install_jar('functions.jar', 'bookstore.jar1', 0)                                

為了創(chuàng )建函數和觸發(fā)器,只需將之前使用的 SQL 語(yǔ)句復制和粘貼到 SQL scrapbook 中。記住,一次只能執行一條語(yǔ)句,因而不能使用冒號作為結束符。


清單 19. 在 DB2 中創(chuàng )建函數和觸發(fā)器
                                create function bookstore.updateQuantity(id int, title varchar(128), author varchar(128),                                oldQuantity int, newQuantity int) returns int                                PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA                                EXTERNAL NAME 'bookstoreapp.StoredProcs.updateQuantity'                                create trigger bookstore.updateQuantityTrig after update of quantity on books                                referencing OLD as OLD NEW as NEW for each row mode db2sql                                VALUES(updateQuantity(NEW.id, NEW.title, NEW.author, OLD.quantity, NEW.quantity))                                

遷移客戶(hù)機應用程序

遷移客戶(hù)機應用程序的主要工作是修改建立數據庫連接的那部分代碼:

  • 既然不再使用 Derby,那么右擊 bookstore 項目并選擇“Apache Derby->Remove Apache Derby nature”。這將從構建路徑中刪除 Derby JAR 文件。
  • 編輯項目的 Java 構建路徑,并添加 DB2 JDBC 驅動(dòng)程序 jar 文件:db2jcc.jar and db2jcc_license_cisuz.jar,對于 Windows 機器,這兩個(gè)文件通??梢栽?C:\Program Files\IBM\SQLLIB\java\ 目錄下找到。
  • 在 Java 代碼中,將 JDBC 驅動(dòng)程序的類(lèi)名更改為 com.ibm.db2.jcc.DB2Driver。
  • 再將連接 URL 更改為:jdbc:db2://localhost:50000/BOOKSTORE,并更改用戶(hù)名和密碼。
  • 由于可能沒(méi)有 bookstore 用戶(hù)名,因此需要更改 DB2 默認模式。這可以通過(guò)在客戶(hù)機應用程序初始化時(shí)發(fā)出以下命令來(lái)完成:stmt.execute("SET CURRENT SCHEMA = bookstore");

 

雖然 JDBC API 允許以相同的方式連接到任何數據庫,但發(fā)送到數據庫的實(shí)際的 SQL 查詢(xún)必須遵從數據庫 SQL 語(yǔ)言。因此,遷移 JDBC 應用程序時(shí)需要重新編寫(xiě)某些 SQL 查詢(xún)。在這個(gè)例子中,Derby 語(yǔ)言是 DB2 語(yǔ)言的一個(gè)子集,因此不存在這方面的問(wèn)題,您無(wú)需對 SQL 查詢(xún)作任何修改。

現在應用程序應該可以進(jìn)行編譯,并且可以成功地在 DB2 數據庫上運行。還可以像在 Derby 網(wǎng)絡(luò )服務(wù)器配置中那樣部署應用程序。

結束語(yǔ)

在閱讀本文之后,您應該能夠有效地使用為 Derby 提供的基于 Eclipse 的不同工具開(kāi)發(fā) Apache Derby 應用程序。您還應該可以執行一些相關(guān)的任務(wù),例如在各種可能的配置中部署這種應用程序,或者將數據庫和應用程序遷移到 DB2 UDB。

下載

描述 名字 大小 下載方法
Java source code for the Inventory application Inventory.java 2 KB HTTP

參考資料



關(guān)于作者

Gilles Roux 是 IBM DB2 組織中的一名信息管理軟件工程師。他的主要工作是開(kāi)發(fā)數據庫遷移工具。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Cloudscape數據庫介紹及幾個(gè)問(wèn)題
在Eclipse下,從安裝到使用Derby插件
用 Eclipse、WTP 和 Derby 構建 Web 應用程序
Derby 使用的2種方式:內嵌和獨立
HIVE一些小技巧和java操作hive
Java SE 6 新特性: Java DB 和 JDBC 4.0
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久