DB2 9应用开发:Java应用程序中嵌入XQuery
【IT168技术文档】
本文主要讲述了如何在 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数据为:
当然一个CONTACTINFO字段对应着一个XML数据。<?xml version="1.0"?>
<Customer xmlns:xsi=http://www.w3.org/2001/XMLSchema-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>love2shop@yahoo.com</email>
</Customer>
【IT168技术文档】
XQuery 不支持参数占位符,所以将 XQuery 嵌入在 Java 应用程序中时,需要将 XQuery 封装(或嵌入)在 SQL 语句中。因此我们要用到 XMLQuery 函数,我们在这个例子中使用了该函数。
对于熟悉 JDBC的人来说,应该很快发现这个例子中大部分内容比较容易理解。该代码在声明和定义了必要的变量后,按照标准的 DB2 方法建立一个数据库连接。接着,创建一个包含查询语句的字符串。
我们这里要进行的操作是检索居住在具有给定邮政编码的地区的客户的地址。如果用XQuery来查询,应该是:
逻辑上,用XQuery查询的代码等价于下面给出的query代码,不同的是它:xquery for $y in db2-fn:xmlcolumn('CUSTOMERS.CONTACTINFO')/Customer/Address
where $y/zip=95116 return $y
将 XQuery 嵌入在一个 SQL SELECT 语句中。在 XQuery 被嵌入在 SQL 语句中时,它不再需要调用 db2-fn:xmlcolumn 或 db2-fn:sqlquery 来获得输入数据。相反,XQuery 通过由 PASSING 子句从 SQL 传递给它的变量来获得输入数据。
为邮政编码值使用参数占位符。
在查询字符串中需要使用双引号的地方使用换码符(反斜杠)。在这个例子中,PASSING 子句使用了换码符将变量 “t”、“y” 和 “z” 括起来。
显式地将输入参数的值覆盖为适当的数据类型。
然后准备好 SELECT 语句,将它的输入参数设置为目标值,这个值是在 Java “zipCode” 变量中定义的。我们在这里使用了 int 类型,最后,执行语句,按要求处理返回的结果,并关闭数据库连接。
嵌入XQuery的 Java 代码:
实际上,DB2 9的JDBC也支持XQuery,即我们没有必要将XQuery 嵌入在一个 SQL SELECT 语句中。可以直接执行XQuery,如上面的xquery for $y in db2-fn:xmlcolumn('CUSTOMERS.CONTACTINFO')/Customer/Address where $y/zip=95116 return $y. . .
// 连接数据库的代码,这里省略
. . .
public static String getAddress() ...{
String Address;
Address= null;
![]()
try ...{
int zipCode = 95116;
String query = "select xmlquery("
+ " '$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;
}
下面的代码与上面给出的代码是等价的,只是query不一样。
上面两段代码的执行结果为:. . .
// 连接数据库的代码,这里省略
. . .
![]()
public static String getAddress() ...{
String Address;
Address= null;
![]()
try ...{
//int zipCode = 95116;
String query="xquery for $y in
db2-fn:xmlcolumn('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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<street>5401 Julio Ave.</street>
<city>San Jose</city>
<state>CA</state>
<zip>95116</zip>
</Address>
0
相关文章