原文地址:http://www.tutorialspoint.com/jasper_reports/jasper_report_data_sources.htm
Datasources是一個結構化的數據容器。當要生成報表時,Jasperreport引擎從數據源獲取數據。數據可以從數據庫(databases)、XML文件(XML file)、對象數組、對象集合獲取。在Filling Reports章節可以看到,fillReportXXX()方法需要接收一個數據源填充這個報表,比如net.sf.jasperreports.engine.JRDataSource對象或java.sql.Connection對象(當報表數據在相關的數據庫中查找到)。
JRDataSource接口有兩個需要實現的方法:
1.public boolean next() throws JRException;
嘗試將光標定位到數據源的下一個位置
2.public Object getFieldValue(JRField jrField) throws JRException;
此方法提供了從當前數據源記錄中獲取報表的每個字段的值
Datasource Implementations
下表總結了數據源與他們的實現類
Datasource | Implementation class |
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.JRMapCollectionDataSource, net.sf.jasperreports.engine.data.JRMapArrayDataSource |
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 net.sf.jasperreports.engine.data.XlsDataSource |
Empty | net.sf.jasperreports.engine.data.JREmptyDataSource |
JDBC data sources
這是最常用的從相關數據庫提取報表數據的方式。如果用java.sql.Connection來代替傳遞給引擎,它會在JRResultDataSource實例中執行相關查詢並保存返回的java.sql.ResultSet對象。
JavaBean data sources
類JRBeanArrayDataSource與JRBeanCollectionDataSource分別代表了實現包裝數組或集合的JavaBean對象。數組或集合內的每個對象都被視為該類型數據源的一條記錄。通過命名約定映射JavaBen屬性與對應的報表字段之間的字段。報表字段的名稱必須與JavaBean屬性的名稱相同(按指定的JavaBeans規范)。
Map-based data sources
實現類JRMapArrayDataSource與JRMapCollectionDataSource使用時,必須是已經把報表數據以java.util.Map對象的形式保存在內存中。包裝數組或集合中的每個Map對象可以被認為是數據源中的虛擬記錄,並且每個報表字段的值是以報表字段的名稱作為key提取的。
TableModel data sources
//此處省略
Empty data sources
JREmptyDataSource類模擬一個具有經定數的虛擬空記錄的數據源。它用UI工具提供基本的報表預覽功能,或者特殊的報表模板,或者用於測試或調試。
Rewindable Data Sources
接口net.sf.jasperreports.engine.JRRewindableDataSource繼承了JRDataSource接口。它增加了一個moveFirst()方法。這個方法的目的是把光標移動到數據源的第一條記錄。
Rewindable數據源用於子報表band設置了isSplitAllowed="false"表明不允許分割,或者當前頁面沒有足夠的空間給子報表進行渲染。
上面所有的數據源都實現了JRRewindableDataSource,除了JRResultSetDataSource,因為它不支持回退記錄指針。數據源傳遞一個手動包裝的java.sql.ResultSet給子報表是有問題的。正確的處理方法是SQL查詢在子報表模板內,因為在重啟下一個頁面的子報表時,引擎會再次執行。
Data Source Providers
JasperReport庫有一個接口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;