top
Loading...
為DB2編寫表編輯器GUI

盡管您可能是公司里最好的程序員,但事實上您還是要查閱編程手冊,因為您無法記住所有這些編程API。別擔心;不是只有您一個人有這個問題。如果您是中等水平的程序員,您可能有著非常繁忙的生活,忙于完成經理交給您的項目,即使他們已完全忘記了交給您什么事情!您開始懷疑您的工作與契約勞役有什么分別。

有時候,有些東西的設計意圖是使您的生活稍稍輕松一些。當這些“東西”能夠消除我們必須完成的乏味任務時,它們就特別有用。如果您是拿計時工資的,那么我們提前道歉;本文介紹的代碼可以讓您完成工作稍快一些。

如果有一個簡單的、與平臺無關的應用程序讓您添加、刪除和更新 DB2 數據庫表中的行而不必臨時去知道表名和列名,那難道不好嗎?應用程序基本上會可視化地顯示您正試圖操作的表中的內容。知道嗎?我們要您考慮這個問題。

我們這里講述的SQL實用程序是一個讓您能夠以直觀和易用的方式與IBM DB2 數據庫進行交互的應用程序。這個實用程序是與平臺無關的,因為它是用基于Java的技術開發的。您將在這個應用程序中看到的GUI是用 Java Swing 組件構建的,并且數據庫訪問層是用 IBM 提供的 JDBC 2.0 驅動程序構建的。應用程序是用 JDK 1.3.1_02 開發和測試的。

請記住這個簡單的工具無法取代 IBM 提供和支持的完整功能的 DB2 Table Editor。我們的工具在功能和作用域方面有限得多,但我們認為它有助于滿足某些用戶的需要,更不用說它給我們提供了編碼 DB2 Java 語言應用程序的有趣練習。

先決條件

JDBC 的能力使這個項目成為可能,JDBC 是通過 Java 編程語言讓您與數據庫交互的 API。既然提到了 Java,那么應該想到平臺無關性的概念。因此,我們介紹的代碼可以方便地移植到您選擇的平臺(AIX、Windows NT等等)。我們在 Windows 2000 環境中編碼應用程序。然而,正如您將從使用的代碼中看到的那樣,我們沒有使用與平臺有關的技術(例如 ODBC、MFC 等等)。

但是,我們的代碼有以下要求:

DB2 通用數據庫版本 7.2(也稱為帶修訂包 3 的版本 7.1)。

請確保類路徑(classpath)中有用于 DB2 的 JDBC 2.0 驅動程序。這極為重要,因為我們要接入 JDBC 2.0 的一些功能。

此外,需要確保使用的 JDK 支持 Swing。我們使用了許多 Swing 提供的功能來完成一些界面,您將用它們與 DB2 數據庫交互。

應用程序概述

如圖 1 所示,SQLUtility 應用程序允許您用 IBM DB2 數據庫完成四件事情:

● 查看表

● 向表添加行

● 從表刪除行

● 更新表

圖 1:用 SQLUtility 應用程序可以做什么

最好下載本項目的代碼,然后仔細研究它以理解其工作原理。我們已經盡最大努力來注釋代碼以使您能理解我們所做的工作。我們建議使用一個類似于 IBM VisualAge? for Java 的集成開發環境(IDE),它允許您單步調試代碼并掌握應用程序流。

對應用程序的仔細研究

用戶在能夠查看或更改數據庫中的表之前必須得到授權。應用程序的登錄階段(由 LoginDialog.java 實現)驗證用戶是否得到授權。圖 2 顯示了您在首次訪問該實用程序時會看到的認證對話框。

圖 2. 認證對話框

當使用在認證對話框中輸入的信息與指定的數據庫成功地建立連接時,您就獲得了授權。授權代碼駐留在 SQLFacade.java 的構造函數中,其中用清單 1 中所示代碼建立到數據庫的 JDBC 連接。

清單 1. 連接到數據庫

if (!username.equals("")){       connection =             DriverManager.getConnection(dbURL, username, password);}else{       connection = DriverManager.getConnection(dbURL);}   

如果成功地建立了到指定數據庫的連接,就會出現一個類似于圖 3 中所示的屏幕。

圖 3. 成功認證用戶后的 SQLUtility

圖 4 顯示如何向您呈現數據庫中表的列表。

圖 4. 用戶創建的數據庫表的下拉菜單

創建下拉菜單的數據是用 DatabaseMetaData 對象(SQLFacade.java,第 122 行)獲取的。

當從下拉菜單選擇一個表并單擊 Go 按鈕時,實用程序會在一個用戶友好的表格式視圖(如圖 5 中所示)中顯示數據庫表的內容。顯示的第一列是行號,它讓您方便地標識特定的數據行。使用 GUI,您可以在所選的表中添加行、刪除行或對現有行加以更新。

圖 5. SQLUtility 顯示 TEST 表的內容

添加行

要添加行,請單擊 Add Row 按鈕。通過 AddRowDialog.java 代碼促進了向 DB2 表添加行的能力。單擊 Add Row 按鈕后,就出現一個帶有兩列的對話框(如圖 6 中所示)。在這個界面中,第一列列出表的列名;第二列是輸入數據庫表每一列的值的位置。

圖 6. 添加新行的 GUI

輸入每一列的值并單擊 Add New Row后,輸入的值臨時存儲在散列表中,該表的鍵就是列名。這個信息被傳遞到方法addRowToDatabase。ResultSetModel.java 的這個方法承擔向數據庫添加所需的行的任務。

當然,始終存在輸入非法數據的可能性。這里的“非法”指的是使用無效字符和向非空列輸入空值等行為。當 addRowToDatabase 方法試圖添加一個被認為非法的行時,會拋出一個 SQL 異常。因此,添加將不被允許,而且您將看到一個如圖 7 中所示的錯誤。

圖 7. 錯誤對話框

另一方面,如果要在所需行中添加的數據是“合法的”,實用程序會把該行附加到當前的表。結果,GUI 自動被更新(如圖 8 所示)。請留意 Tom Little 的新行。

圖 8. 添加到 TEST 表的新行

刪除行

要刪除行,所有您要做的就是單擊該行來選擇它(如圖 9 所示),然后單擊 Delete Row。負責從數據庫刪除行的方法是 deleteRow,可在 ResultSetModel.java 中找到。

圖 9. 從 TEST 表刪除行

更新現有行

要更新現有的行,選擇一個單元(圖 10 中選擇了姓名Jones),然后輸入新值。您可以在多個行中對多個列進行更改。每個編輯過的單元顯示為紅色。編輯完成后,單擊 Update Database 在數據庫中進行更新。

圖 10. 更新 TEST 表中的多個值

負責進行更新的方法是 updateDatabase,可以在 ResultSetModel.java中找到。這個程序跟蹤表中單元所做的更改。當單擊 Update Database 時,方法 updateDatabase() 在每個修改的行重復執行,并將更改推送至數據庫。正如添加新行時有錯誤發生會顯示一個錯誤對話框一樣,更新現有行時出現錯誤會顯示一個對話框。因為您可能在一次更新中操作多個行,所以對每個有錯誤的行都會顯示一個對話框(請參閱圖 11)。

圖 11. 對每個更新得不正確的行顯示的錯誤對話框

請注意在錯誤對話框標題中標識出了行號。有了這個信息,就可以方便地標識一行,因為行號是每行的第一列。

并行性所涉問題:注意我們設置中涉及的并行性問題是重要的。當從數據庫檢索數據時,我們沒有鎖定記錄。因此,在嘗試更新某一行時,可能有另一個用戶進入并操作您正在處理的同一行。我們更新一行的方法本質上是在更新前對該行的內容進行快照。然后允許您聲明希望更改的內容。然后您告訴數據庫您希望更改與快照相似的行。如果與快照相似的行不存在(可能由于競態條件而發生),那么更新操作將不會執行。有兩行與快照的標識相匹配的可能性很小(在設計得很差的數據庫模型中)(請參閱限制以了解關于這個問題的更多信息)。

面臨的復雜情況

我們使用 IBM 提供的 JDBC 驅動程序開發 SQL Utility 應用程序。遺憾的是,因為我們使用的驅動程序當前不提供可滾動和可更新的 java.sql.ResultSet 實現,所以編碼 SQL Utility 應用程序的工作會稍稍麻煩一點。我們必須對整個 ResultSet 對象重復執行并且在本地存儲信息,而不是滾動到我們感興趣的行。這個方法在 ResultSetModel.java 中可見。當然,擁有可滾動的 ResultSet 本來可以使方法 reloadTableModel() 中的所有代碼更簡單。但是,我們的變通方法可以完成這項工作。

另外,缺少可更新的 ResultSet 實現意味著我們必須創建 SQL Update 查詢以更改數據庫,而不是使用 jaba.sql.ResultSet 接口的 updateXXX() 方法。因此,在方法 updateDatabase() 中,我們必須動態地生成 SQL 更新語句。

限制:缺少可更新的 ResultSet 還會在我們的實用程序中產生一些限制。要刪除或更新一行,該行必須是被唯一標識的。如果有可更新的結果集,這會自動發生。但我們必須自己標識感興趣的行,而這正是可能遇到問題的地方。我們按以下方法在用于更新或刪除的 SQL 查詢中標識感興趣的行。

DELETE from TESTTABLE WHERE col1 = 'value1' AND col2 ='value2' AND col3='value3'UPDATE TESTABLE SET col1 = 'new value1' WHEREcol1='value1' AND col2 = 'value2' AND col3='value3'   

當數據庫表有兩行或多行擁有重復數據時,問題就出現了,這導致查詢的 WHERE 子句要匹配多行而不是一行。根據我們生成的查詢,這會更新或刪除所有重復的行。然而,在正確設計的關系數據庫中,重復行并不常見。因此,這個“錯誤”應該很少見。

結束語

DB2 無疑是功能極其強大的數據庫。它可以毫無問題地容納龐大數量的數據。IBM DB2 對許多任務關鍵商業應用程序起著基礎技術的作用。隨著越來越多的人使用 DB2,類似我們這里提供的簡單工具可以幫助用戶以可視方式簡單地編輯數據而無需懂得 SQL。即使對于那些真正了解 SQL 的人而言,在處理大量復雜表時,要方便地撰寫查詢是很困難的。SQL 語句輸入起來有時很長而且很乏味。如果忽略了一個單引號,您就有麻煩了。本文的目的是交給您一個能讓您的生活更輕松的代碼,向您提供能夠可視化地操作 DB2 表的實用程序。

可以根據自己的目的修改本文的 Java 代碼,但要自己承擔使用它的風險。作者或 IBM 對使用本代碼所產生的任何后果不承擔任何責任。

『引自 IBM DW中國』

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗