Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103753850
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-23 17:37:24

作者: Dustin Marx/Michael G. Martin 出处: 
 

示例 9:使用 XML 为 JFreeChart 提供输入数据

最后一个示例演示如何基于 XML 数据创建 JFreeChart。在本示例中,我们将使用 Oracle 数据库支持以 XML 形式返回表中的数据。通常,当我们只使用 JDBC 数据集即可直接处理关系数据时,我们并不希望将关系数据转换为 XML 进行 JFreeChart 处理。但是,该关系到 XML 转换的特性在本示例中却很有用,因为利用该特性,我们可以使用 HR 模式模拟面向 XML 的数据源。许多源都可以 XML 格式提供数据,包括 XML 数据库(如存储 XML 文档而非传统的标准化关系数据的 Oracle 数据库)、XML Web 服务以及其他产品和库。

在本示例中,我们将收集 HR 模式中有关员工佣金率的信息。我们在此处假定表中佣金值为空的员工没有佣金补偿,因此只绘制了确实收到佣金的人员的佣金率图表。清单 14 显示了与此相关的一般关系数据查询。

清单 14:用于佣金查询的 SQL SELECT

SELECT commission_pct, count(commission_pct)
FROM   employees
WHERE commission_pct IS NOT NULL
GROUP BY commission_pct
ORDER BY commission_pct;

清单 14 中的查询返回收到各个佣金级别(百分比)的员工的人数。总计中不包括未收到佣金的员工。

我们需要提供给 JFreeChart 以生成我们的图表的 XML 数据需要满足 JFreeChart 期望的 XML 语法。在清单 15 中,我们显示了一个在清单 14 中首次列出的查询的修改版本,它部分满足 JFreeChart 对 XML 语法的期望。

清单 15: 使用列别名将查询结果与 JFreeChart 期望的 XML 相匹配

SELECT commission_pct AS "Key"
count(commission_pct) AS "Value" 
FROM   employees
WHERE commission_pct IS NOT NULL
GROUP BY commission_pct
ORDER BY commission_pct

这个新版本的查询重命名在 SELECT 语句中返回的列或使用该列的别名。我们现在不使用 commission_pct 和 count(commission_pct) 作为列标题,而改用这两个列标题的别名,分别称为 Key 和 Value。

虽然清单 15 对该查询进行了修改,但是我们仍然不能以 XML 格式检索数据。清单 16 提供了使用 OracleResultSet 以 XML 格式检索数据库中的数据的 Java 代码。

清单 16: 以 XML 格式获取 Oracle 数据库中的数据

   /**
* Get commission percentage breakdown from database.
    */
public String getCommissionPercentageBreakdownAsXml()
   {
final String QUERY_NUMBER_EACH_COMMISSION_LEVEL =
"SELECT commission_pct AS \"" + DatasetTags.KEY_TAG + "\", " +
"count(commission_pct) AS \"" + DatasetTags.VALUE_TAG + "\" " +
"FROM employees " +
"WHERE commission_pct IS NOT NULL " +
"GROUP BY commission_pct " +
"ORDER BY commission_pct";

OracleXMLQuery qry =
new OracleXMLQuery( getOracleDbConnection(),
QUERY_NUMBER_EACH_COMMISSION_LEVEL);
qry.setRowTag(DatasetTags.ITEM_TAG);
qry.setRowsetTag(DatasetTags.PIEDATASET_TAG);

return qry.getXMLString();
   }

在清单 16 中,我们使用 JFreeChart 提供的静态常量(DatasetTags.KEY_TAG 和 DatasetTags.VALUE_TAG)而非两个列标题的硬编码值(Key 和 Value),因此,在 JFreeChart 的以后版本中,该查询仍将保持与这些常量的任何更改同步。

清单 16 显示了如何使用 OracleXMLQuery 以 XML 格式获得查询数据。setRowTag 和 setRowsetTag 调用很重要,因为利用通过它们,我们可以轻松更改行标记和行集标记以与满足 JFreeChart 期望。如前所述,我们使用 JFreeChart 提供的常量(DatasetTags.ITEM_TAG 和 DatasetTags.PIEDATASET_TAG)指定这些标记的名称。最后,在我们的 OracleXMLQuery 实例上调用 getXMLString 方法以完备的 XML 格式返回所有结果。清单 17 显示该生成的 XML 字符串的内容。

清单 17: 通过 Oracle 数据库查询生成的 JFreeChart 兼容 XML




0.1
6


0.15
5


0.2
7


0.25
6


0.3
7


0.35
3


0.4
1

如上面提到的,DatasetTags 常量用于提供 JFreeChart 期望的标记名称 PieDataset、Item、Key 和 Value。由于有了 OracleXMLQuery 类、使用返回列的别名的能力以及 JFreeChart 提供的常量,我们现在已经准备好 XML 文档可以将其填充到 JFreeChart 饼形图中了。

清单 18 显示如何使用 JFreeChart 的 DatasetReader 相应地将准备好的 XML 作为输入数据用于图表生成。

阅读(275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~