为DB2 XML数据开发Java应用程序
插入文件时进行验证
插入 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>sailer555@yahoo.com</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))";
