Datenquellen melden

Datenquellen sind strukturierte Datencontainer. Während der Erstellung des Berichts erhält die JasperReports-Engine Daten aus den Datenquellen. Daten können aus den Datenbanken, XML-Dateien, Arrays von Objekten und der Sammlung von Objekten abgerufen werden. Wir haben im Kapitel Füllen von Berichten gesehen , dass die Methode fillReportXXX () erwartet, eine Datenquelle des Berichts zu erhalten, die in Form von ausgefüllt werden mussnet.sf.jasperreports.engine.JRDataSource Objekt oder a java.sql.Connection (wenn die Berichtsdaten in einer relationalen Datenbank gefunden werden).

Die JRDataSource-Schnittstelle verfügt nur über zwei Methoden, die implementiert werden sollten:

  • public boolean next () löst JRException aus;

    • Zum Zeitpunkt des Berichtsfüllens wird diese Methode vom Berichtsmodul beim Durchlaufen der Daten für das Datenquellenobjekt aufgerufen.

  • öffentliches Objekt getFieldValue (JRField jrField) löst JRException aus;

    • Diese Methode liefert den Wert für jedes Berichtsfeld im aktuellen Datenquellendatensatz.

Die einzige Möglichkeit, Daten aus der Datenquelle abzurufen, besteht in der Verwendung der Berichtsfelder. Abhängig von der Art und Weise, wie die Datensätze in der Datenquelle erfasst werden, gibt es mehrere Standardimplementierungen der JRDataSource-Schnittstelle.

Datenquellenimplementierungen

In der folgenden Tabelle sind die Datenquellen und ihre Implementierungsklassen zusammengefasst.

Datenquelle Implementierungsklasse
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Kartenbasiert 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
Leer net.sf.jasperreports.engine.JREmptyDataSource

JDBC-Datenquellen

Klasse JRResultSetDataSourceCraps ein java.sql.ResultSet- Objekt. Dies ist die am häufigsten verwendete Datenquellenimplementierung, wenn Berichtsdaten aus einer relationalen Datenbank extrahiert werden. Wenn stattdessen eine java.sql.Connection an die Engine übergeben wird, führt sie zuerst die zugehörige Abfrage aus und speichert das zurückgegebene java.sql.ResultSet- Objekt in einer JRResultSetDataSource-Instanz.

JavaBean-Datenquellen

Klassen JRBeanArrayDataSource und JRBeanCollectionDataSourcestellen Implementierungen dar, die Arrays und Sammlungen von JavaBean-Objekten umschließen können. Jedes Objekt innerhalb des Arrays oder der Sammlung wird als ein Datensatz in dieser Art von Datenquelle angesehen. Die Zuordnung zwischen einer bestimmten JavaBean-Eigenschaft und dem entsprechenden Berichtsfeld erfolgt durch Namenskonventionen. Der Name des Berichtsfelds muss mit dem Namen der JavaBean-Eigenschaft übereinstimmen, der in den JavaBeans-Spezifikationen angegeben ist.

In allen Beispielen dieses Tutorials haben wir JRBeanCollectionDataSource verwendet.

Kartenbasierte Datenquellen

Die Implementierungsklassen JRMapArrayDataSource und JRMapCollectionDataSourcesind nützlich, wenn die übergeordnete Anwendung die im Speicher verfügbaren Berichtsdaten bereits als java.util.Map-Objekte speichert . Jedes Map-Objekt im umschlossenen Array oder in der umschlossenen Sammlung wird als virtueller Datensatz in der Datenquelle betrachtet, und der Wert jedes Berichtsfelds wird mithilfe des als Schlüssel angegebenen Berichtsfelds aus der Map extrahiert.

TableModel-Datenquellen

In vielen clientseitigen Anwendungen werden Daten in Tabellenform angezeigt. In vielen Anwendungen ist es häufig erforderlich, dass der Benutzer dieses Tabellenformat als Bericht drucken kann. ImplementierungsklasseJRTableModelDataSourcemacht das Generieren von Berichten aus dem Tabellenformat für Swing-Anwendungen trivial. Diese Klasse umschließt ein javax.swing.table.TableModel-Objekt. Auf Spalten im umschlossenen TableModel-Objekt kann entweder über ihre Namen oder über ihre 0-basierten Indizes zugegriffen werden.

XML-Datenquellen

Klasse JRXmlDataSourceist eine auf DOM basierende Datenquellenimplementierung, die XPath-Ausdrücke verwendet, um Daten aus dem XML-Dokument auszuwählen. Datensätze in der XML-Datenquelle werden durch Knotenelemente dargestellt, die über den XPath-Ausdruck ausgewählt wurden. Feldwerte werden aus jedem Datensatz mithilfe des XPath-Ausdrucks abgerufen, der in der Feldbeschreibung (<fieldDescription> -Element in JRXML) angegeben ist.

XPath ist eine Sprache, mit der Sie durch die Attribute und Elemente eines XML-Dokuments navigieren können. Weitere Informationen zu XPath finden Sie unterhttp://www.w3.org/TR/xpath.

CSV-Datenquellen

JRCsvDataSourcestellt eine Implementierung für Datenquellen dar, die ihre Daten aus strukturierten Textdateien abrufen; normalerweise CSVs. Feldwerte werden anhand ihres Spaltenindex abgerufen.

XLS-Datenquellen

JRXlsDataSourcestellt eine Implementierung für Datenquellen dar, die ihre Daten aus Excel-Dokumenten abrufen. Die Berichtsfeldzuordnung für diese Datenquellenimplementierung basiert ebenfalls auf dem Feldspaltenindex.

Leere Datenquellen

Die Klasse JREmptyDataSourcesimuliert eine Datenquelle mit einer bestimmten Anzahl von virtuellen leeren Datensätzen. Es wird von den UI-Tools verwendet, um grundlegende Funktionen für die Berichtsvorschau oder in speziellen Berichtsvorlagen oder zu Test- und Debugging-Zwecken anzubieten.

Rücklauffähige Datenquellen

Das net.sf.jasperreports.engine.JRRewindableDataSourceerweitert die grundlegende JRDataSource- Schnittstelle. Es wird nur eine Methode namens moveFirst () zur Schnittstelle hinzugefügt. Diese Methode soll den Cursor auf das erste Element in der Datenquelle bewegen.

Rücklauffähige Datenquellen sind nützlich, wenn Sie mit Unterberichten arbeiten, die in einem Bereich platziert sind, der aufgrund der Einstellung isSplitAllowed = "false" nicht aufgeteilt werden darf, und auf der aktuellen Seite nicht genügend Speicherplatz für den Renderbericht vorhanden ist.

Alle oben genannten Datenquellenimplementierungen können mit Ausnahme der zurückgespult werden JRResultSetDataSource, da das Zurückbewegen des Datensatzzeigers nicht unterstützt wird. Dies stellt nur dann ein Problem dar, wenn diese Datenquelle manuell zum Umschließen eines java.sql.ResultSet verwendet wird, bevor es an den Unterbericht übergeben wird. Es ist kein Problem, wenn sich die SQL-Abfrage in der Unterberichtsvorlage befindet, da die Engine sie beim Neustart des Unterberichts auf der nächsten Seite erneut ausführt.

Datenquellenanbieter

Die JasperReports-Bibliothek verfügt über eine Schnittstelle net.sf.jasperreports.engine.JRDataSourceProvider. Dies hilft beim Erstellen und Entsorgen von Datenquellenobjekten. Beim Erstellen einer Berichtsvorlage mit GUI-Tools wird ein spezielles Tool zum Anpassen der Datenquelle des Berichts benötigt. JRDataSourceProvider ist die Standardmethode zum Einfügen benutzerdefinierter Datenquellen in ein Designtool. Eine benutzerdefinierte Implementierung dieser Schnittstelle sollte die folgenden Methoden implementieren, mit denen Datenquellenobjekte erstellt und entsorgt werden können, sowie nach Möglichkeit Methoden zum Auflisten der verfügbaren Berichtsfelder in der Datenquelle:

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;