在JDBC4.0推出后,它的从多的特性正在受到广泛地关注。而最重要的更新就是支持XML数据类型(在最新的SQL2003标准中定义了这种数据类型),当然,将XML数据保存在数据库中,并在应用程序中更新XML数据并不是什么新技术。但这是JDBC第一次提供了一个映射接口(java.sql.SQLXML),并利用这个接口来支持SQL/XML数据类型。当然,为了满足处理XML数据类型的需要,其他的接口,如java.sql.Connection和java.sql.ResultSet,也被更新了。
在SQL2003标准和XML数据类型推出之前,开发人员必须将XML数据保存在BLOB、CLOB或TEXT类型字段中。现在,很多主流的数据库(如SQL Server、Oracle和DB2)已经加入了对XML数据类型的支持。但在JDBC4以前,Java应用程序仍然必须将数据库中的XML数据类型转换为JDBC支持的数据类型。但新的JDBC可以通过本地的接口来绑定XML,因此,在处理任何数据库中的XML数据变得更容易和高效。
在本文中将介绍如何用JDBC4.0来操作XML类型的字段(保存和获得XML数据),并给出了一个例子供读者参考。
一、存储和获得XML数据
为了将XML数据保存在一个XML类型的字段中,我们首先应该调用java.sql.Connection.createSQLXML()方法。这个方法返回了一个java.sql.SQLXML的实例。然后我们可以通过调用setOutputStream(), setCharacterStream()或简单地调用setString(String xml)来将XML数据加到SQLXML对象中。要注意的这个功能非常类似于BLOB和CLOB类型的使用。
JDBC4.0的关键特性之一就是我们还可以通过调用java.sql.SQLXML的setResult(Class resultClass)方法来获得一个设置avax.xml.transform.Result的类的实现。这些类包括DOMResult, JAXBResult以及SAXResult。换句话说,我们无需转换就可以简单地做以下事情:
1.得到XML数据
2.建立一个独立的DOMResult对象
3.将DOMResult传入java.sql.SQLXML对象
4.直接通过java.sql.Statement将XML数据保存到响应数据库字段中
为了java.sql.ResultSet获得SQLXML类型数据,我们只需要地调用getSQLXML,并指定相应地字段名或索引即可。然后我们可以通过getBinaryStream(), getCharacterStream()或getString()从java.io.InputStream中获得实际的XML数据,或是一个简单的字符串。保存XML数据也获得XML数据的过程类似,我们还可以通过调用SQLXML对象实例的getSource(Class sourceClass)方法来获得XML源,因此,我们可以从任何实现javax.xml.transform.Source的类访问XML数据。
二、实例程序
由于JDBC4是在2006年12月11日由官方发布的(随J2SE6.0发布),因此,现在很多数据库驱动对JDBC4支持的还不是很好。在本例子中使用了Apache Derby数据库的较版本10.2来讨论对XML类型数据的保存和获取。Derby的这个版本还不持java.sql.SQLXML,这就意味着我们不能直接从结果值中获得XML数据,以及绑定XML数据。但Derby和SQL 2003兼容,可以常非容易地使用嵌入模式,类此,它仍然可以为我们演示如何操作XML数据,就好象在使用一个完全支持JDBC4的驱动一样。用于操作Derby的XML数据的代码如下: