XQJ解析 用于XQuery查询的Java API
查询是用于查询XML的声明性语言,类似于用于查询关系数据的SQL。大部分Java程序员熟悉JDBC,它提供了标准的Java API来和各种关系数据库的SQL引擎进行交互。XQJ具有相同的目的:它向Java程序员提供了标准的Java API用于和各种XML数据源的XQuery引擎进行交互。
XQJ也被称为JSR 255,因为它是由Java Community Process设计的。这个JSR 255规范定义了接口和Class集合,用于Java应用能够向一个XQuery引擎对一个或者多个XML数据源提交XQuery查询和使用查询结果。这篇文章通过给出基本的用况(use-case)来提供对XQJ的介绍,并且讨论了作为XQuery基础的XQJ中的几个关键的接口。此外,这篇文章强调了XQL和JDBC之间的不同之处。
对那些熟悉JDBC的程序员而言比较幸运的是,XQJ遵守了几个熟悉的模式。执行一个查询的典型编码顺序--获得连接(connection),准备XQuery表达式,在已经准备好的XQuery表达式中的值和变量绑定起来,执行表达式,使用XQuery结果并且清理资源--是和JDBC的次序基本一致。然而,XQuery中的几个关键概念要求创建XQJ中的专用接口,比如static context、dynamic context、XQuery data model和XQuery Sequence Type。进一步,在XQuery数据模型中一个主要元素是XML node。XQJ需要和现有的XML节点操作API如DOM、SAX和StAX等相结合。XQuery允许节点通过XMLSchema定义类型。XQJ通过XQuery Sequence Type接口定义和XMLSchema的关系。
一个简单的例子
下面是简单的、使用XQJ来执行查询的代码示例,演示了典型的使用情况。注意为了简单起见,错误处理已经被忽略了。
// obtain an XQDataSource instance XQDataSource xqds = (XQDataSource) Class.forName("com.jsr225.xqj").newInstance(); // obtain a connection XQConnection con = xqds.getConnection("usr", "passwd"); // prepare an XQuery Expression String xqry = "for $i in fn:collection('dept') " + "where $i/deptname = %dname return count($i/employees)"; XQPreparedExpression expr = con,preparedExpression(xqry); // bind variable with value expr.bindString(new Qname("dname"), "engineering"); // execute the XQuery Expression XQResultSequence rs = expr.executeQuery(); // Consume results while (rs.next()) { System.out.printLn(rs.getInt()); } // clean up resources rs.close(); con.close(); |
在上面的例子中,XQDataSource是你用来获得XQuery连接的接口。你可以通过典型的数据源实例化机制,比如JNDI查询或者显式的类装载方法来创建XQDataSource 接口初始实现类。这类似于JDBC的DataSource和Connection接口的设计。
在获得了XQConnection之后,你可以通过XQExpression或者XQPreparedExpression接口来执行XQuery。假如你只执行XQuery表达式一次,那么你应该使用XQExpression,并且如果你要准备XQuery表达式一次而使用不同的绑定值来多次执行这个表达式,像在前面的例子中那样,那么你应该使用XQPreparedExpression。这两个接口分别类似于JDBC中的Statement和PreparedStatement概念。
XQuery结果是XQuery数据模型的一个实例。在例子中显示的XQResultSequence提供了以光标为中心的接口,允许用户在结果的sequence中迭代每一个元素。用户可以从每个元素获得值,或者是原子数值或者XML节点。这类似于JDBC结果集中的迭代。
在使用完XQuery结果之后,程序员需要对XQResultSequence和XQConnection接口调用close()方法来清理这些资源。合理的用于释放资源的错误处理代码对避免资源泄露非常关键。在sequence结果关闭的时候,这个框架隐含的关闭从sequence结果中创建的元素。类似的,在连接被关闭的时候,这个sequence结果也被隐含的关闭了。
XQuery上下文(Context)的支持
XQuery有双重的"上下文"概念:静态的上下文和动态的上下文。XQJ提供了XQStaticContext和XQDynamicContext接口来为它们建模。XQStaticContext提供了方法检索定义在
- 数据库系统设计全面介绍(上)(11-30)
- 数据库系统设计全面介绍(下)(11-30)
- 官方白皮书:达梦数据库的界面设计(11-30)
- 利用SQL Server数据库快照形成报表(01-01)
- 浅析SQL Server与Oracle区别(04-22)
- SQL Server块日志恢复(04-25)