数据源(Data Sources)
数据源是结构化数据容器。 在生成报告时,JasperReports引擎从数据源获取数据。 可以从数据库,XML文件,对象数组和对象集合中获取数据。 我们在Filling Reports一章中看到,fillReportXXX()方法希望以net.sf.jasperreports.engine.JRDataSource对象或java.sql.Connection的形式接收报告的数据源,该报告必须填写。当在关系数据库中找到报告数据时)。
JRDataSource接口只有两个方法,应该实现 -
public boolean next()抛出JRException;
在报告填充时,报告引擎在迭代数据时会在数据源对象上调用此方法。
public Object getFieldValue(JRField jrField)抛出JRException;
此方法为当前数据源记录中的每个报告字段提供值。
从数据源检索数据的唯一方法是使用报告字段。 JRDataSource接口有几个默认实现,取决于方式,获取数据源中的记录。
数据源实现
下表总结了数据源及其实现类 -
数据源 | 实施类 |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
Map-based | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModel | net.sf.jasperreports.engine.data.JRTableModelDataSource |
XML | net.sf.jasperreports.engine.data.JRXmlDataSource |
CSV | net.sf.jasperreports.engine.data.JRCsvDataSource |
XLS | net.sf.jasperreports.engine.data.JRXlsDataSource |
Empty | net.sf.jasperreports.engine.JREmptyDataSource |
JDBC数据源
类JRResultSetDataSource java.sql.ResultSet对象。 当从关系数据库中提取报表数据时,这是最常用的数据源实现。 如果将java.sql.Connection传递给引擎,则首先执行相关查询并将返回的java.sql.ResultSet对象存储在JRResultSetDataSource实例中。
JavaBean数据源
类JRBeanArrayDataSource和JRBeanCollectionDataSource表示可以包装JavaBean对象的数组和集合的实现。 数组或集合中的每个对象都将被视为此类数据源中的一个记录。 特定JavaBean属性与相应报告字段之间的映射是通过命名约定进行的。 报告字段的名称必须与JavaBeans规范指定的JavaBean属性的名称相同。
在本教程的所有示例中,我们使用了JRBeanCollectionDataSource。
基于地图的数据源
如果父应用程序已将内存java.util.Map objects可用的报告数据存储为java.util.Map objects ,则实现类JRMapArrayDataSource和JRMapCollectionDataSource非常有用。 包装数组或集合中的每个Map对象都被视为数据源中的虚拟记录,并使用名为key的报告字段从地图中提取每个报告字段的值。
TableModel数据源
在许多客户端应用程序中,数据以表格格式显示。 许多应用程序中的一个常见要求是允许用户将此表格格式打印为报告。 实现类JRTableModelDataSource使得从表格格式生成报告的任务对于Swing应用程序来说是微不足道的。 此类包装javax.swing.table.TableModel对象。 包装的TableModel对象中的列可以通过其名称或基于0的索引进行访问。
XML数据源
类JRXmlDataSource是基于DOM的数据源实现,它使用XPath表达式从XML文档中选择数据。 XML数据源中的记录由通过XPath表达式选择的节点元素表示。 使用字段描述(JRXML中的“fieldDescription”元素)提供的XPath表达式从每个记录中检索字段值。
XPath是一种用于浏览XML文档的属性和元素的语言。 有关XPath的更多信息, http://www.w3.org/TR/xpath.
CSV数据源
JRCsvDataSource表示数据源的实现,它从结构化文本文件中检索数据; 通常是CSV。 使用列索引检索字段值。
XLS数据源
JRXlsDataSource表示数据源的实现,它从Excel文档中检索数据。 此数据源实现的报告字段映射也基于字段列索引。
空数据源
类JREmptyDataSource模拟内部具有给定数量的虚拟空记录的数据源。 UI工具使用它来提供基本的报告预览功能,或者在特殊的报告模板中,或者用于测试和调试目的。
可回收数据源
net.sf.jasperreports.engine.JRRewindableDataSource扩展了基本的JRDataSource接口。 它只向接口添加一个名为moveFirst()的方法。 此方法旨在将光标移动到数据源中的第一个元素。
当处理由于isSplitAllowed =“false”设置而不允许拆分的子带内的子报表时,可回滚数据源非常有用,并且当前页面上没有足够的空间来呈现子报表。
除了JRResultSetDataSource之外,所有上述数据源实现都是可重JRResultSetDataSource ,因为它不支持将记录指针移回。 只有在将java.sql.ResultSet传递给子报告之前手动使用此数据源进行包装时,才会出现问题。 如果SQL查询驻留在子报告模板中,则没有问题,因为引擎将在下一页重新启动子报告时再次执行它。
数据源提供商
JasperReports库有一个接口net.sf.jasperreports.engine.JRDataSourceProvider 。 这有助于创建和处理数据源对象。 使用GUI工具创建报告模板时,需要一个用于自定义报告数据源的特殊工具。 JRDataSourceProvider是将自定义数据源插入设计工具的标准方法。 此接口的自定义实现应实现以下允许创建和处理数据源对象的方法,以及在可能的情况下列出数据源中可用报告字段的方法 -
public boolean supportsGetFieldsOperation();
public JRField[] getFields(JasperReport report)
throws JRException, UnsupportedOperationException;
public JRDataSource create(JasperReport report) throws JRException;
public void dispose(JRDataSource dataSource) throws JRException;