程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 理解pureQuery:IBM最新的Java數據庫應用編程范例

理解pureQuery:IBM最新的Java數據庫應用編程范例

編輯:關於JAVA

簡介

關系數據訪問的對象化

大多數業務都建立在信息管理系統的基礎上,而這些信息管理系統主要的底層基礎設施又 是基於存儲在一個或多個關系數據庫中的數據。這些系統由一些軟件程序組成,這些軟件程 序專門用於信息處理,並且是以 Java 之類的托管語言實現的。

作為一種以封裝、繼承和多態為特征、易於使用、基於面向對象的語言,Java 一方面用 於實現信息處理程序的計算和邏輯方面,另一方面則用於訪問和操縱關系數據。Java 按照對 象 來定義信息,而數據庫則使用 行。對象是其所屬類的惟一實例,在物理上,對象之間互 有區別。同樣,關系數據庫中的行也是惟一的,它們由主鍵值標識。另一方面,對象是獨立 的,只要還被一個或多個其它對象引用,它就繼續存在著。而行被包含在表當中,當被從表 中刪除時,也就隨之消失。

因此,雖然對象與行在很多方面相似,但對象對於模塊化編程的內在價值在於可伸縮性、 可擴展性和高效的代碼維護,這是通過 對象化(objectization)抽象關系行的設計基礎。 我們把對象化定義為這樣一種過程:將面向對象的基本概念(封裝、繼承和多態)引入到使 用 SQL 執行的指令式的、內聯的數據查詢實踐。簡言之,對象化就是創建無縫對象的過程, 使用的方法可以通過純面向對象范例執行數據庫操作(包括創建、替換、更新和刪除)。

對於通過對象化來編程式地訪問和操縱關系數據,最流行的方式是通過一些 API 和包裝 器,這些 API 和包裝器提供了一個或多個編寫為文本字符串的 SQL 語句。整個關系數據處 理都是基於這些封裝的 SQL 語句的,它們是程序邏輯的重要組成部分。但是,這些 SQL 語 句對於 Java 語言不是透明的,不能享受編譯時優化和語義及語法驗證的好處 —— 更不用 說諸如內容輔助之類可以在底層設計和實現過程中節省大量時間的設計時特性了。

因此,在提高程序員的效率和生產率時,一個主要的挑戰是將關系數據轉換為可通過自然 的面向對象方式無縫使用的對象,從而編寫底層代碼。要實現這種轉換,需要很好地理解如 何安排數據訪問 API 調用的順序,並從技術上理解底層的數據訪問編程模型(例如 JDBC) ,此外,還需要具備優秀的編程技能並能夠將軟件(尤其是它的數據訪問層)拆分成多個模 塊化部分。

pureQuery 項目為數據庫應用開發人員提供了一套基於 GUI 且易用的方 法,它能夠顯著提高應用程序的設計和實現階段的生產效率。通過將關系數據自動轉換為 Java 對象的實現方式,方便了用戶對數據的訪問和操縱。將關系數據轉換為 Java 對象後, 就可以很自然的通過面向對象編程范例無縫地利用這些對象來編寫業務邏輯和底層代碼。通 過將查詢語言與 Java 本身相集成,pureQuery 可以代替傳統的 JDBC 編程。

本文對 pureQuery 進行了概述,並提供一個詳細的場景,以展示 pureQuery 如何顯著提高程序員的 生產率。

pureQuery 是什麼?

pureQuery 是一個基於 Eclipse 的、可插拔的 組件,它可以與 Eclipse 集成開發環境(IDE)無縫集成。它自動提供設計和運行時方式, 可將關系數據作為對象管理。這種設計使開發人員可以指定一個數據庫連接(例如使用 DB2®),然後使 Eclipse Java 項目能夠識別底層的數據庫工件(例如表、存儲過程等 )。在建立連接並完成所有數據庫工件的自動發現之後,用戶可以通過 GUI 直觀地將任何底 層關系表實體轉換成 Java 對象。這是通過自動生成相關 SQL 語句和自動創建封裝這些語句 的父 Java 對象來實現的。然後,還可以在一個自然的 Eclipse IDE 編程環境中,使用充分 集成的 SQL 和 Java 編輯功能對生成的 Java 對象和其中包含的 SQL 語句進行進一步定制 。

Java 編輯器與 SQL 的緊密集成可以提高編程生產率,提供無縫的設計時體驗,並在編寫 Java 代碼時簡化 SQL 編碼。編輯器集成包括設計時編譯過程中完全支持的語義和語法驗證 、內容輔助、語法著色以及在 Java 中動態、選擇性執行 SQL,當出錯時,像處理 Java 錯 誤一樣在錯誤面板中進行標記。

而且,設計和運行時之間的緊密聯合,使得 SQL 語句可在設計時運行。運行 SQL 語句時 ,將考慮所使用的全部主機變量和參數,以預覽結果集,並自動回滾執行 SQL 語句導致的副 作用。

此外,在設計時,可通過啟動 Visual Explain 對選擇的 SQL 語句進行性能分析,為查 詢請求的優化器實現提供可視化表示。查詢請求被拆分成不同的部分,每個部分用圖標表示 。Visual Explain 還包括關於查詢優化器所考慮和選擇的數據庫對象的信息。Visual Explain 提供了對查詢實現的詳細表示,在設計時就可以從集成的 SQL-Eclipse Java 編輯 器中輕松找到造成昂貴成本的原因。

pureQuery 對象化過程

pureQuery 系統提供三種不同的方式來將關系訪問層轉換成基於對象的模型。

數據庫驅動的對象化(Database-driven objectization,DDO):

pureQuery 的最常見用法是選擇一個表,然後生成用於數據訪問和操縱(即創建、替換、 更新、刪除)的對象。此時,pureQuery 生成基於面向對象的類和接口,用於在所選表上執 行 CRUD 操作。它還生成一個特殊的類,這個類可用於對創建的對象進行單元測試。實際上 ,這是一個表到 Java 的轉換,其中,根據底層表的特征生成以 Java 為中心的 CRUD 操作 。在 概覽 小節中我們將對此作詳細討論。

查詢驅動的對象化(Query-driven objectization,QDO):

通常,需要從一組已有的數據庫查詢語句(SQL)實現應用程序構建。這時就需要基於已 有的查詢語句生成對象層次,這些查詢語句又可用於構建底層的應用程序。實際上,這是一 個 SQL 到 Java 的轉換,此轉換過程將查詢語句無縫地轉換為以 Java 為中心的對象。在 pureQuery 系統中,只需單擊選中一個查詢語句,利用直觀的 GUI 方式(彈出的上下文菜單 ),就可以很容易地生成相關的對象類層次。該系統實際上利用作為解析查詢語句的結果的 元數據(或者通過它所維護的來自底層數據庫連接的元數據)自動生成所需的對象類。

對象-關系映射(ORM):

有時候已經存在表示一個關系表的 bean 類,但是還不 存在該類與所需的數據庫表之間的實際鏈接。pureQuery 憑借其豐富的內容輔助基礎設施提 供了一種直觀的機制,可以執行類名到底層數據庫中給定表名之間的一對一映射,並能夠將 類的受保護(或公共)變量映射到表中的列。實際上,這是一個 Java 到 SQL 的轉換,此轉 換過程將以 Java 為中心的實體無縫地轉換成基於 SQL 的 CRUD 操作。

有時候,已 經存在一個 bean 類,其中包含所有需要的關系映射元數據,但是這個類所映射的底層物理 表卻丟失了。pureQuery 提供了直觀的 GUI 方式來根據 bean 類生成所需的 DDL 語句,以 創建所需的底層數據庫工件(即表和列)。

概覽

接下來的小節將介紹 pureQuery 的最常見用法,包括 pureQuery 對象化過程 小節中介紹的 DDO 過程、QDO 過程 和 ORM 過程 。最後,對 pureQuery 與 Eclipse Java Editor 的緊密集成和它所提供的附 加特性作一個概述。這包括設計與運行時之間的聯合,從而測試 SQL 語句的運行。

在嘗試下面的場景之前,應確保已安裝以下軟件:

DB2 for Linux®, UNIX®, and Windows® Version 8.0 或更高版本,以及附帶的 SAMPLE 數據庫

Developer Workbench Version 9.5

pureQuery plug-in Version 1.0

在本文 參考資料 小節中可以找到用於下載 DB2 和 IBM Viper Developer V9.5 Open Beta (含 Developer Workbench 和 pureQuery 插件)的鏈接。

數據庫驅動的對象化(DDO)案例場景

在本節中,我們研究一個簡單的雇員場景,該場景的目的是以面向對象范例編程式地 訪問和操縱雇員數據。

下面的步驟將創建一個可感知 pureQuery 的 Java 項目,該 項目將 DB2 SAMPLE 數據庫中的 Employee 表轉換成一個對象模型,後者可在任何 Java 應 用程序中以一種自然的、面向對象的方式使用。

使用 pureQuery 開發數據庫應用程序的設計模式由以下基本步驟組成:

創建一個 Eclipse Java 項目

將 Java 項目連接到一個數據庫連接上

通過自動 pureQuery 代碼生成功能將底層連接中的所有給定數據庫表工件轉換成 Java 對象

通過直觀的編輯、測試運行和調試進一步定制

步驟 1. 在 Eclipse IDE 中創建 Java 項目

在創建 Java 項目時,應確保創建 source 和 bin 文件夾。將項目命名為 “Personnel ”。

步驟 2. 為 Personnel Java 項目啟用 pureQuery 支持

右鍵單擊 Personnel Java 項目,在彈出菜單中選擇 Add pureQuery Support。

圖 1. 為 Eclipse Java 項目啟用 pureQuery 支持

這時會打開 Add pureQuery Support 向導,通過該向導可以為 Java 項目啟用 pureQuery。

該向導的第一頁包括一些常規選項。可以保留默認值。最重要的是,要確保選中 Import required pureQuery JAR files into project 旁邊的復選框。這是因為 pureQuery 有它自 己特定的設計和運行時 JAR 文件,必須將這些文件包括在 Java 項目中。

圖 2. Add pureQuery Support 向導:pureQuery 常規選項頁面

單擊 Next 進入 Add pureQuery Support 向導的下一個頁面。

接下來創建數據庫連接。該頁面顯示所有已發現的數據庫連接。從列表中選擇一個數據庫 連接。如果不存在連接,該向導將指導您創建一個新的連接。對於這個例子,選擇 SAMPLE 數據庫,Employee 表就在這個數據庫中。

圖 3. Add pureQuery Support 向導:pureQuery 數據庫連接頁面

單擊 Finish 按鈕關閉該向導,進入提供 pureQuery 支持的 Personnel Java 項目。

步驟 3. 將關系工件轉換為 Java 對象並自動生成 pureQuery 代碼

建立數據庫連接後,這個 Java 項目就可以感知數據庫了。這將導致特定連接上的所有數 據庫工件都會在 IDE 的 Database Explorer 樹型視圖中自動顯示,如圖 4 所示。

圖 4. 包含 SAMPLE 數據庫中所有工件的 Database explorer

pureQuery 的威力在於,它能夠自動生成將底層關系數據庫表工件轉換成 Java 對象所需 的代碼。只需選中所需的數據庫工件,然後啟動 pureQuery Code Generation 向導,就可以 自動生成代碼。

下面的步驟將關系工件轉換成 Java 對象,並自動生成 pureQuery 代碼:

對於本例,從數據庫浏覽器樹型視圖中選擇 Employee 表節點,然後在該節點上單擊鼠標 右鍵,如圖 5 所示。

圖 5. 將 Employee 表轉換為 Java 對象:自動生成 pureQuery 代碼

從彈出菜單中選擇 Generate the pureQuery code 選項。 這時會打開 Generate pureQuery Code 向導,如圖 6 所示。

圖 6. pureQuery Code Generation 向導

指定 Java Bean General 選項。

如 圖 6 所示,Generate pureQuery Code for a Table 向導的第一頁包含一些用於描述一個表示 Employee 表的 bean 類的屬性。可以保留其中的 默認值。我們來研究其中一些屬性:

Source folder:該字段指定用於保存生成的 Java 文件的物理位置。可以保留默認值: Personnel/Src。

Name:該字段表示生成 的 Java Bean 的名稱。默認情況下,這個 bean 的名稱與之前在 Database Explorer 中選 擇的、為之生成 pureQuery 代碼的數據庫表工件(在此即為 Employee)的名稱相同。可以 更改這個名稱,但最後生成的文件中會有一個標注,以表明這個 bean 與相應的數據庫表工 件之間的映射。

對於這個例子,將這個名稱改為 MyEmployee。於是,生成的標注為 :@Table(name="EMPLOYEE", schema="DB2ADMIN")

Generate annotated-method interface for table:這將導致生成一個 Interface 文件,該文件包含數據庫 Create/Update/Delete/Insert 方法。這些方法實際上 為前面 1.0 小節描述的數據庫行的對象化提供了便利。當構建項目時,還會生成該接口的一 個默認的實現,其中包含所有需要的 SQL 語句。注意,默認的接口名稱也是可以更改的。

Generate test class for annotated-method interface for table:這將導致生成一個 特殊的類,這個類可用於對 bean 接口進行單元測試。這個測試類的名稱可以更改。

Generate test class for Inline-method style:這將導致生成一個包含顯式的內聯 SQL 語句的文件,默認情況下,這些 SQL 語句將被生成為接口實現的方法。通過一個簡化的 API,可以以一致的方式使用 SQL 來查詢各個數據源。可以對應用程序進行配置,使其靜態 地運行數據庫 SQL,而不會影響編程或用戶體驗。測試類的名稱也可以修改。

注意,無論出現上述哪一種情況,都可以通過選擇 Generate JUnit test cases 復選框 ,請求系統自動生成一組 JUnit 測試實例。

Include Connection information and user name:該選項可以將連接字符串和用戶名包 括在所有生成的測試類中。

指定如何定義生成的 bean 變量。

在該向導的第二個頁面(如圖 7 所示),可以指定生成 public 還是 protected 字段, 是否包含 public 訪問方法。

圖 7. 定義 bean 字段

還可以更改 bean 變量的名稱(默認情況下,bean 變量的名稱與 Employee 表列的名稱 相同)。注意,對於變量名與其所映射的列的名稱不相同的每個變量,會生成一個專門的標 注。標注的格式如下所示:

@Column(name="name of the table column")

該標注被放在變量聲明之前。例如,在這個例子中,將 Bean 字段名稱 firstnme 改為 firstnme_new。於是,Java 文件中生成的、放在聲明之前的標注為:

@Column(name="FIRSTNME") protected string firstnme_new

對於其他所有不同於表列名的變量名也是如此(見 圖 9)。

對於這個例子,確保選中 Protected Fields with Public accessor methods。還可以將 變量類型改為與其映射的列數據的類型不相同的類型。

指定所生成的 SQL 語句的風格。

在該向導的最後一個頁面中(見圖 8),可以選擇生成不同風格的 SQL 語句。對於這個 例子,選擇 Generate all SQL statements。

圖 8. 生成不同風格的 SQL 語句

單擊 Finish 生成 pureQuery 代碼。

單擊 Finish 按鈕時,該向導除了生成以下 5 個完成 pureQuery 對象化過程 小節中描 述的 DDO 過程的主要文件以外,還生成一個實用包。我們來看看生成的工件有哪些:

構成對象層次的文件

MyEmployee.java (見圖 9):這是主 bean 類。這個類包含一些變量及其相應的訪問方 法,這些變量與 Employee 表中的列存在 1 對 1 的映射。

圖 9. 表示 Employee 表的 Java bean 類

MyEmployeeData.java (見圖 10):這是抽象數據庫訪問層的文件,用於數據查詢和操 縱。它包含一些抽象方法,實現這些方法的惟一目的是在底層表上執行 CRUD 操作。

圖 10. 包含用於 CRUD 操作的接口的 MyEmployeeData.java

MyEmployeeDataImpl.java (見圖 11):這是前面提到的 MyEmployeeData 接口 的默認實現。該實現包含封裝所有用於數據訪問和操縱的 SQL 語句的方法。

請注意 :該文件當且僅當項目構建時生成。可以通過從主 Eclipse IDE 菜單中設置 Build Automaticallyoption of the Project 來構建項目,或者由開發人員手動構建項目。

圖 11. 包含接口方法實現的類

MyEmployeeDataTest.java(見圖 12):這是由 pureQuery 系統生成的默認類, 這個類可用於單元測試。它包含一個 static main 函數,該函數實際上用於測試實現類(即 MyEmployeeDataTest.java)中所有方法的運行。

圖 12. 生成的類可用於單元測試

MyEmployeeInLineSample.java (見圖 13):當且僅當 Generate Sample Class With Inline method call syntax 選項被選中時,才會生成該文件。實際上,這將通過 pureQuery 的運行時 API 使用內聯風格的方法調用測試所有生成的 SQL 語句。

圖 13. 自動生成的測試類可以內聯運行生成的 SQL 語句

實用包

除了前一小節提到的那些文件以外,pureQuery 系統還生成一個實用包,其中包含一個名 為 SampleUtil.java 的文件(見圖 14)。該文件包含很多常見的靜態實用函數(例如獲取 連接、打印等),例如,生成的測試類(即 MyEmployeeDataTest.java)可以使用這些函數 打印輸出結果,以及創建底層數據庫連接。

圖 14. 自動生成的示例類包含很多常見的靜態實用函數

查詢驅動的對象化(QDO)案例場景

給定一個或多個 SQL 語句,通過 pureQuery 可以直觀地為關系數據訪問層自動創建對象 層次。下面的逐步講解將演示 pureQuery 僅根據給定的 SQL 語句創建對象模型的功能。

打開 DDO 案例場景 小節中創建的 Eclipse Java Personnel 項目。

在項目中添加一個新的 Java 文件,並在其 Main 方法中包括以下 SQL 語句:

SELECT BIRTHDATE, BONUS, COMM, EDLEVEL, EMPNO, FIRSTNME, HIREDATE, JOB, LASTNAME,
MIDINIT, PHONENO, SALARY, SEX, WORKDEPT from EMPLOYEE

在 SQL 語句中的任何位置單擊鼠標右鍵,從彈出的上下文菜單中選擇 pureQuery Assist -> Generate SQL Bean 選項。這將打開 Create Bean for a SQL Result Set 向導。

圖 15. 根據 SQL 語句創建 bean

在第一個頁面中,為生成的 Bean 類指定一個名稱。對於這個例子,輸入 “MySQLEmployee” 並單擊 Next 按鈕。

圖 16. 指定根據 SQL 語句生成的 Bean 類的名稱

在該向導的第二個頁面中,可以指定如何定義 bean 字段。對於這個例子,可以保留默認 值。還可以將變量類型改為與它所映射的列的數據類型不同的類型(見圖 17)。

圖 17. 指定 bean 字段

單擊 Finish 按鈕。這將生成 bean 文件 MySQLEmployee.Java。

為了創建接口和默認實現類,可以像下一小節描述的那樣使用 pureQuery 的 ORM 過程。

對象-關系映射(ORM)案例場景

給定一個 Java bean 類,通過 pureQuery 可以直觀地將該類的成員映射為底層數據庫表 中的任何給定的關系實體。

注意需要根據表模式和相關規則 來進行設計時映射。例如,雖然在運行時可以將 double 類型的變量映射到 XML 類型的表列,但是這可能導致不可預測的運行時結果,並因此而產生 錯誤。下面的例子演示了這種映射。

打開 DDO 例子 中創建的 Eclipse Java Personnel 項目。

為了演示 ORM 特性,可以使用一個已有的 bean,也可以使用表示數據庫中某個表的 Java 用戶定義類。在這個例子中,我們使用一個已有的 bean,所以刪除 MyEmployee.Java 之外的所有生成的 Java 文件。

圖 18. 將一個 bean 映射到一個關系表

在編輯器中打開 MyEmployee.Java 類,在類名的上面添加以下標注:@Table (name = "EMPLOYEE", Schema = "DB2ADMIN")

該標注執行類名與底層數據庫表之間的實際映射。

在要映射的每個字段/變量的上面添加以下注釋。在這個例子中,我們只映射 BIRTHDAY 和 FIRSTNME 字段,因此在 BIRTHDAY 變量名之上添加

@Column (name = "BIRTHDAY")

,在 FIRSTNME 變量名之上添加@Column (name = "FIRSTNME")

(見圖 19)。

圖 19. 標注創建主機變量與表列之間的映射

在編輯器中,在 MyEmployee 類中的任何地方單擊鼠標右鍵,從彈出的上下文菜單中選擇 pureQuery Assist -> Generate pureQuery CODE 選項。這將打開 Generate pureQuery Code for a Table 向導,該向導最終將生成相關的 pureQuery 代碼(包括接口文件、測試 類、實現代碼等)。

注意,由於 Java bean 類已經存在,該向導的 Bean Field 頁面被省略,沒有提供給用 戶。

pureQuery 的內容輔助以及與 Java 編輯器的緊密集成

pureQuery 提供的最強大的一個特性是 SQL 與 Java 在同一個編輯器中的無縫集成。這 種緊密集成為 Java 和 SQL 提供了一組相同的設計時特性,包括代碼輔助、語法驗證和著色 ,以及 SQL 語句的語義驗證。

代碼輔助提供:

SQL 語句完成(SQL statement completion ) 當輸入 SELECT 之類的 SQL 關鍵字時, 或者在期望一個操作符時,就會出現一個上下文窗口,其中顯示用於完成語句的可能的方式 。

圖 20. 語句完成

內容輔助(Content Assist) 顯示一組可能的實體名稱,與一個給定的關系工件(例如 一個表、模式等)相關,或者當需要在一個語句中指定參數時顯示一組 Java 主機變量(見 圖 21 和 22)。

圖 21. 內容輔助

圖 22. 主機變量內容輔助

快速修復(Quick Fix) 提供一種內聯動態語法驗證機制,通過這種機制可以檢測並快速 修復拼寫錯誤之類的錯誤。

圖 23. 快速修復:Select 關鍵字被誤拼為 Selct

自動發現數據庫定義 (見圖 24 和 25),通過該特性,只需點擊選擇任何一個 bean 成 員名稱,就可以快速跳轉到數據庫浏覽器中的數據庫定義(例如,點擊映射一個表名的類名 就會跳轉到數據庫浏覽器中的表節點,點擊映射列名的變量名就會跳轉到數據庫浏覽器中的 列節點,依此類推)。

圖 24. 點擊選擇 bean 類中的成員名稱

圖 25. 點擊選擇將跳轉到數據庫浏覽器

設計與運行時聯合

pureQuery 的設計時功能當中最優越的一個特性是它能在編輯器中動態地運行任何給定的 SQL 語句。這個獨特的特性使得在設計時能夠動態執行 SQL 語句並允許回滾。

在 Java 編輯器中,要查看這個特性,只需在任何生成的 SQL 語句上單擊鼠標右鍵。從 上下文菜單中選擇 pureQuery Assist -> Run SQL(見圖 26)。 這將執行該 SQL 語句 ,並在 Eclipse IDE 的 Data View 中顯示結果集(見圖 27)。

圖 26. 在設計時通過點擊選擇運行 SQL

圖 27. Data View 中顯示在設計時執行 SQL 的結果

Conclusion

當今時代,數據以及對數據的有效訪問正推動著以數據庫為中心的業務應用程序的演變, 從而實現通過 Web(或其他方式)交付的純服務,為了提高生產率以實現快速應用程序開發 和維護,對擁有一個面向對象的基礎設施框架的需求愈發強烈。IBM 的 pureQuery 通過對關 系訪問的無縫、直觀的對象化過程,為 Eclipse IDE 環境提供了一種先進的、可插入式解決 方案,能夠優化開發人員的生產率和性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved