程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 怎樣為DB2 XML數據開發Java應用程序(一)

怎樣為DB2 XML數據開發Java應用程序(一)

編輯:DB2教程

在本文中,我們將逐步介紹幾個常見的編程場景,比如插入 XML 數據、查詢 XML 和非 XML 數據、更新 XML 數據、刪除 XML 數據和創建訪問 XML 數據的存儲過程。但是我們首先來復習一下開發任何類型的 DB2 數據庫應用程序的幾個基本指導原則。

遵循典型的編程 “最佳實踐”

盡管 DB2 的本機 XML 支持是新的,但是好的數據庫應用程序編程實踐沒有變。在進入 DB2 的 XML 技術的細節之前,應該牢記以下一般原則:

只尋找您需要的:如果您只需要該信息的一個子集的話,不要檢索一個表的整個內容 —— 或者許多 XML 文檔的整個內容。否則只會提高處理成本和降低運行時性能。

避免重復數據庫服務器的工作:指示 DB2 根據您的需要過濾和處理數據,而不是在應用程序中做這項工作。例如,要讓 DB2 按指定順序返回結果,您不需要自己去對數據排序。類似地,要讓 DB2 確保只返回獨特的結果,您不需要重復檢查重復值。以數據為中心的處理最好由數據庫服務器而不是應用程序來完成。

使您的代碼容易維護:在代碼中包含注釋或 Javadoc,尤其是當您的應用程序包含復雜的查詢時。

仔細地考慮事務的范圍:默認情況下,JDBC 將每個查詢看作一個獨立的事務。確定這是否適合您的需要,還要考慮您為事務定義的范圍(和隔離級別)將如何影響整體並發需求。

最小化網絡環境中的流量:如果避免應用程序和 DB2 之間不必要的數據傳輸,將會感受到更好的運行時性能。只檢索需要的數據是做到這一點的方式之一。調用數據庫存儲過程也是有幫助的,這取決於您的工作的性質。

配置環境

要開發或運行處理 XML 數據的 Java 應用程序,DB2 不需要任何特殊的配置。實際上,可以通過使用自己選擇的集成開發環境 (IDE) 或者從命令行直接利用支持的 Java Developer Kit (JDK),來編寫、測試和調試 Java 程序。但是因為 DB2 Viper 是隨 Developer Workbench 一起發布的,所以本文中的例子使用的是 Developer Workbench 的開發環境。本節討論如何配置 Developer Workbench,查看一些示例數據,並探討一些也許您會感興趣的數據庫配置參數。

DB2 Developer Workbench

DB2 Developer Workbench 基於 Eclipse 3.1 平台,後者是一個可免費下載的開放源碼項目。要用該工作台編譯和運行任何 DB2 XML 應用程序,需要創建一個項目並在該項目的構建路徑中包含適當的 DB2 庫(包括支持 DB2 的 JDBC 3.0 兼容驅動器的庫)。要配置環境,需完成以下步驟:

啟動 DB2 Workbench。例如,從 Windows Start 菜單,選擇 DB2 > IBM DB2 Developer Workbench V9.1 > Developer Workbench。

創建一個新項目。我們最初將使用一個簡單的項目。切換到 Java 透視圖(Window > Open Perspective -> Java),並選擇 File > New > Project。根據向導指定項目名稱。對於其他項,保持默認的設置。

將 DB2 庫添加到項目的構建路徑。高亮顯示項目,右擊鼠標,並選擇 Properties。選擇 Java Build Path,並單擊 LibrarIEs 選項卡。添加適當的 DB2 外部 .jar 文件,比如 db2jcc.jar、db2jcc_Javax.jar 和 db2jcc_license_cu.jar。

可選地,為應用程序創建一個包。高亮顯示項目,右擊鼠標並選擇 New > Package。

有關創建項目和包的詳細信息,請參考在線幫助信息。

示例數據

本文中的例子使用 "Get off to a fast start with DB2 Viper"(developerWorks,2006 年 3 月)中創建的 "clIEnts" 表。快速回顧一下,該表定義為:

清單 1. 最大寬度的示例代碼清單

create table clIEnts(
id		int primary key not null, 
name		varchar(50), 
status 		varchar(10), 
contactinfo 	XML
)

圖 1 展示了一個馬上將插入該表的 "contactinfo" 列的示例 XML 文件。

圖 1. 將插入 "clIEnts" 表的示例 XML 數據

數據庫配置參數

本文中的例子很簡單,它們處理少量的 XML 數據,所以您不需要更改默認的數據庫配置參數也能讓它們運行。但是默認值對一些生產環境來說可能是不夠的。具體來說,日志大小、Java 堆、查詢語句堆和應用程序堆的設置值可能需要增加。如果這些值設置得不適當,那麼運行時性能可能會很低,或者由於日志空間不夠而不能將大型 XML 文檔插入 DB2 表中。

可以從 DB2 Control Center(選擇 Tools > Configuration Assistant)或 DB2 命令行處理器查看和更改 DB2 數據庫配置參數。有關詳細信息,請參考產品手冊。

連接數據庫

處理 DB2 XML 數據需要建立到包含數據的數據庫的連接。關於該代碼沒有什麼特殊的 —— 與編寫到任何 DB2 數據庫的連接的邏輯相同。

清單 2 包含一個 Helper 類,其中具有用於建立和關閉 DB2 數據庫連接的方法。

清單 2. 用於獲得和釋放數據庫連接的 Helper 類

public class Conn {
// for simplicity, I've hard-coded account and URL data.
private static String user = "user1";
private static String pwd = "mypassWord";
private static String url = "jdbc:db2:test";

// this method gets a database connection 	
public static Connection getConn(){
Connection conn=null;
		
//load the appropriate DB2 driver and 
//get a connection to the “test” database
try {
 Class.forName("com.ibm.db2.jcc.DB2Driver");
 conn = DriverManager.getConnection(url, user, pwd);
 . . . 	
}
catch (Exception e) { e.printStackTrace();	}
return conn;
		
} // end getConn();
	
// this method closes a database connection 
public static void closeConn(Connection conn){
try {
if(conn == null) { return; }
conn.close();
}
catch (Exception e) { e.printStackTrace(); }
finally { 
try { conn.close();}
catch (Exception e) { } 
}
}// end closeConn();
}// end class

您將在執行廣泛任務(比如插入和查詢 XML 數據)的應用程序中調用這些方法。

插入 XML 數據

由於最初的 XQuery 規范沒有解決數據庫寫操作(比如插入數據),所以 DB2 依賴於熟悉的 SQL INSERT 語句來允許程序員將新的 XML 數據寫入包含 XML 列的表中。DB2 最多可存儲 2 GB 格式良好的 XML 文檔。

通常,Java 程序員需要將包含在文件中的 XML 數據插入到 DB2 中,盡管也可以從字符串、二進制數據(包括大對象)和 SQL 子選擇語句插入 XML 數據。這裡介紹了如何從文件和簡單的字符串插入 XML 數據。有關其他插入場景的詳細信息,請參考 DB2 Viper 手冊。

DB2 Viper 也允許您插入 XML 文檔時針對以前注冊的 XML 模式進行驗證或不進行驗證。本文中的例子介紹了這兩種方法。

插入文件時不進行驗證

清單 3 中的 insertFile() 方法演示了如何將 XML 文件中的數據插入 "clients.contactinfo" 列。該方法首先定義幾個變量供以後使用。前 3 個變量對應於 "clIEnts" 表中的 ID、name 和 status 列。第 4 個是將要插入 "contactinfo" 列的 XML 文件的名稱。為簡單起見,值已經硬編碼在該方法中;在生產環境中,輸入值將以不同的方式獲得。

在建立數據庫連接之後,為 INSERT 語句創建一個簡單的字符串。如您所見,它看起來與任何其他 DB2 INSERT 語句一樣,並對四個輸入列值使用參數標志符(marker)。INSERT 語句像平常一樣准備好了,它的四個參數標志符也設置好了。要為 XML 列設置標志符,需打開一個 FileInputStream,並傳遞 XML 文件的位置。也獲得該文件的長度,並使用該信息作為 setBinaryStream() 方法的輸入。最後,執行該語句,檢查錯誤,並關閉連接。

清單 3. 從文件插入 XML 數據

public static void insertFile(){
try {
// for simplicity, I've defined variables with input data 
int id = 1885;
String name = "Amy Liu";
String status = "Silver";
String fn = "c:/XMLFiles/ClIEnt1885.XML";// input file

// get a connection 
Connection conn = Conn.getConn();

// define string that will insert file without validation
String query = 
"insert into clIEnts (id, name, status, contactinfo) values (?, ?, ? ,?)";

// prepare the statement
PreparedStatement insertStmt = conn.prepareStatement(query);
insertStmt.setInt(1, id);
insertStmt.setString(2, name);
insertStmt.setString(3, status);
File file = new File(fn);
insertStmt.setBinaryStream(4, new FileInputStream(file), (int)file.length());

// execute the statement 
if (insertStmt.executeUpdate() != 1) {
System.out.println("No record inserted.");
}
. . . 
conn.close();
}
catch (Exception e) { . . . }
}

插入文件時進行驗證

插入 XML 文件時進行驗證只需要很少的附加編程工作。假設您已經創建並注冊 "DB2 Viper 快速入門"(developerWorks,2006 年 3 月)中討論的 ClIEntInfo.xsd 文件,那麼您只需要修改 清單 3 中的一行代碼,以指示 DB2 插入 XML 文件時進行驗證。該代碼涉及到 query 字符串的定義。

如 清單 4 所示,修訂後的 INSERT 語句在為 XML 數據指定參數標志符之前調用 XMLValidate 函數。該函數也需要您指定將用於驗證的 XML 模式標識符。在這裡,引用的是前面注冊的一個叫做 "user1.mysample" 的模式。

清單 4. 從文件插入 XML 數據時進行驗證

String query = "INSERT INTO clIEnts (id, name, status contactinfo)
 " +"VALUES (?, ?, ?, xmlvalidate
(? according to XMLschema id user1.mysample))";

如果您的 XML 輸入文件包含根據指定模式來說有效的數據,那麼 DB2 就會插入行。否則,整個語句失敗,不會插入該行的數據。

插入字符串時不進行驗證

清單 5 中所示的 insertString() 方法展示了如何將分配給字符串變量的格式良好的 XML 文檔插入 DB2 中。邏輯與前一例子中從文件插入數據時的邏輯沒有太大的不同。不是使用您的准備語句的 setBinaryStream() 方法,而是使用 setString() 方法。本例中為了簡單起見,xml 變量定義中的 XML 文檔已經進行了硬編碼。

注意:轉義字符(反斜槓)包含在是 XML 文檔一部分的引號之前(比如下面例子中的 XML 版本號)。

清單 5. 從字符串插入 XML 數據

public static void insertString(){
try {
// for simplicity, I've defined variables with input data 
int id = 1885;
String name = "Amy Liu";
String status = "Silver";
String xml = 
"<?xml version=\"1.0\"?>" + 
"<Client>" + 
"<Address> " +
"<street>54 Moorpark Ave.</street>" +
"<city>San Jose</city>" +
"<state>CA</state>" +
"<zip>95110</zip>" +
"</Address>" +
"<phone>" +
"<work>4084630110</work>" +
"<home>4081114444</home>" +
"<cell>4082223333</cell>" +
"</phone>" +
"<fax>4087776688</fax>" +
"<email>[email protected]</email>" +
"</Client>";

// get a connection 
Connection conn = Conn.getConn();

// define string that will insert file without validation
String query = 
	"insert into clIEnts (id, name, status, contactinfo) values (?, ?, ? ,?)";

// prepare the statement
PreparedStatement insertStmt = conn.prepareStatement(query);
insertStmt.setInt(1, id);
insertStmt.setString(2, name);
insertStmt.setString(3, status);
insertStmt.setString(4, XML); 

// execute the statement 
if (insertStmt.executeUpdate() != 1) {
System.out.println("No record inserted.");
}
. . . 
conn.close();
}
catch (Exception e) { . . . }
}

插入字符串時進行驗證

正如您所預期的,驗證作為字符串提供的 XML 文檔只需要很少的額外編程工作。實際上,只需要修改一行代碼 —— query 變量的定義。只需要將 INSERT 語句更改為調用 XMLValidate 函數,就像在 清單 4 中所做的一樣。

下面是修訂後的語句:

清單 6. 從字符串插入 XML 數據時進行驗證

String query = "INSERT INTO clIEnts (id, name, status contactinfo)
 " +"VALUES (?, ?, ?, xmlvalidate
(? according to XMLschema id user1.mysample))";
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved