本文主要講述了如何在 Java 應用程序中嵌入 XQuery,為了滿足您這個要求,我們在文章的後面給出了一段代碼。這段代碼展示了如何檢索居住在具有給定郵政編碼的地區的客戶的地址。
准備工作:
本文所進行的各種查詢操作都是在SAMPLE數據庫中。在SAMPLE數據庫中創建CUSTOMERS(客戶表):
CREATE TABLE ADMINISTRATOR.CUSTOMERS ( CUSTOMERID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1001, INCREMENT BY 1, NO CACHE ) , NAME VARCHAR (10) , AGE BIGINT , COMMPANY VARCHAR (10) , CONTACTINFO XML(標准化越來越近了) ) ;
該客戶表中,包括CUSTOMERID(客戶編號)、NAME(客戶姓名)、AGE(年齡)、COMMPANY(公司)和CONTACTINFO(客戶聯系方式)幾個字段。
在CUSTOMERS表中插入3條記錄:
其中CONTACTINFO(客戶聯系方式)字段為xml(標准化越來越近了)數據類型,其中XML(標准化越來越近了)數據為:
<?xml(標准化越來越近了) version="1.0"?><Customer xml(標准化越來越近了)ns:xsi=http://www.w3.org/2001/XML(標准化越來越近了)Schema-instance
xsi:noNamespaceSchemaLocation="http://bogus"> <Address> <street>5401 Julio Ave.</street> <city>San Jose</city> <state>CA</state> <zip>95116</zip> </Address> <phone> <work>4084630000</work> <home>4081111111</home> <cell>4082222222</cell> </phone> <fax>4087776666</fax> <email>[email protected]</email></Customer>
當然一個CONTACTINFO字段對應著一個XML(標准化越來越近了)數據。
謝謝收藏 http://www.cncms.com.cn/db2/q372730.Html
XQuery 不支持參數占位符,所以將 XQuery 嵌入在 Java 應用程序中時,需要將 XQuery 封裝(或嵌入)在 SQL 語句中。因此我們要用到 XML(標准化越來越近了)Query 函數,我們在這個例子中使用了該函數。
對於熟悉 JDBC的人來說,應該很快發現這個例子中大部分內容比較容易理解。該代碼在聲明和定義了必要的變量後,按照標准的 DB2 方法建立一個數據庫連接。接著,創建一個包含查詢語句的字符串。
我們這裡要進行的操作是檢索居住在具有給定郵政編碼的地區的客戶的地址。如果用XQuery來查詢,應該是:
xquery for $y in db2-fn:XML(標准化越來越近了)column('CUSTOMERS.CONTACTINFO')/Customer/Address
where $y/zip=95116 return $y
邏輯上,用XQuery查詢的代碼等價於下面給出的query代碼,不同的是它:
將 XQuery 嵌入在一個 SQL SELECT 語句中。在 XQuery 被嵌入在 SQL 語句中時,它不再需要調用 db2-fn:XML(標准化越來越近了)column 或 db2-fn:sqlquery 來獲得輸入數據。相反,XQuery 通過由 PASSING 子句從 SQL 傳遞給它的變量來獲得輸入數據。
為郵政編碼值使用參數占位符。
在查詢字符串中需要使用雙引號的地方使用換碼符(反斜槓)。在這個例子中,PASSING 子句使用了換碼符將變量 “t”、“y” 和 “z” 括起來。
顯式地將輸入參數的值覆蓋為適當的數據類型。
然後准備好 SELECT 語句,將它的輸入參數設置為目標值,這個值是在 Java “zipCode” 變量中定義的。我們在這裡使用了 int 類型,最後,執行語句,按要求處理返回的結果,並關閉數據庫連接。
嵌入XQuery的 Java 代碼:
. . .// 連接數據庫的代碼,這裡省略 . . .public static String getAddress() ...{ String Address; Address= null; try ...{ int zipCode = 95116; String query = "select XML(標准化越來越近了)query(" + " '$y/Customer/Address[zip=$z]' " + " passing contactinfo as \"y\", " + "cast (? as Integer) as \"z\") " + "from CUSTOMERS"; poStmt = conn.prepareStatement(query); poStmt.setInt(1, zipCode); rs = poStmt.executeQuery(); boolean flag = rs.next(); while (flag) ...{ Address= rs.getString(1); System.out.println(Address); flag = rs.next(); } } catch (SQLException sqle) ...{ System.out.println("Error Msg: " + sqle.getMessage()); System.out.println("SQLState: " + sqle.getSQLState()); System.out.println("SQLError: " + sqle.getErrorCode()); System.out.println("Rollback the transaction and quit the program"); System.out.println(); System.exit(1); } return Address; }
實際上,DB2 9的JDBC也支持XQuery,即我們沒有必要將XQuery 嵌入在一個 SQL SELECT 語句中。可以直接執行XQuery,如上面的xquery for $y in db2-fn:XML(標准化越來越近了)column('CUSTOMERS.CONTACTINFO')/Customer/Address where $y/zip=95116 return $y
下面的代碼與上面給出的代碼是等價的,只是query不一樣。
. . .// 連接數據庫的代碼,這裡省略 . . .public static String getAddress() ...{ String Address; Address= null; try ...{ //int zipCode = 95116; String query="xquery for $y in
db2-fn:XML(標准化越來越近了)column('CUSTOMERS.CONTACTINFO')/Customer/Address
where $y/zip=95116 return $y"; poStmt = conn.prepareStatement(query); //poStmt.setInt(1, zipCode); rs = poStmt.executeQuery(); boolean flag = rs.next(); while (flag) ...{ Address= rs.getString(1); System.out.println(Address); flag = rs.next(); } } catch (SQLException sqle) ...{ System.out.println("Error Msg: " + sqle.getMessage()); System.out.println("SQLState: " + sqle.getSQLState()); System.out.println("SQLError: " + sqle.getErrorCode()); System.out.println("Rollback the transaction and quit the program"); System.out.println(); System.exit(1); } return Address; }
上面兩段代碼的執行結果為:
<Address xml(標准化越來越近了)ns:xsi="http://www.w3.org/2001/XML(標准化越來越近了)Schema-instance">
<street>5401 Julio Ave.</street>
<city>San Jose</city>
<state>CA</state>
<zip>95116</zip>
</Address>