Integration von Java mit IBM System i über JDBC

In unserem vorherigen Beitrag haben wir die Grundlagen von JDBC und dessen entscheidende Rolle bei der Interaktion mit verschiedenen Datenbanksystemen beleuchtet, insbesondere im Umgang mit IBM System i (AS400) über den JTOpen-Treiber. Dieser Artikel vertieft unser Verständnis für Java-Entwicklung, indem er aufzeigt, wie das Projekt zeus-access-400 JDBC nutzt, um effizient mit Datenbanken auf IBM System i (AS400) zu kommunizieren. Jede Klasse in diesem Projekt erfüllt eine einzigartige Funktion, die eine nahtlose Verbindung zwischen Java-Anwendungen und Datenbanksystemen ermöglicht. Darüber hinaus unterstützt zeus-access-400 verschiedene Datenformate, um die Vielseitigkeit und Anwendbarkeit in einem breiten Spektrum von Anwendungsszenarien zu maximieren:

  • XML: Ideal für datenintensive Anwendungen, bei denen die Dokumentstruktur wichtig ist.
  • HTML: Perfekt für die Erstellung von Berichten oder Datenvisualisierungen, die im Webbrowser angezeigt werden sollen.
  • JSON: Ein leichtgewichtiges Daten-Austauschformat, das sich gut für Webanwendungen und APIs eignet.
  • JSONL: Eine Variante von JSON, die sich besonders für den Export großer Datensätze eignet, wobei jedes Objekt in einer neuen Zeile steht.
  • CSV: Ein klassisches Format für den Export tabellarischer Daten, das sich leicht in Tabellenkalkulationsprogramme wie Microsoft Excel oder Google Sheets importieren lässt.
  • MD (Markdown): Ideal für die Erstellung dokumentierter Berichte oder Anleitungen, die direkt auf GitHub, GitLab oder anderen Versionierungssystemen verwendet werden können.

Eine Datenselektion – viele Exportformate

zeus-access-400

Diese breite Palette an unterstützten Formaten erweitert die Einsatzmöglichkeiten von zeus-access-400, von der Datenverwaltung und -analyse bis hin zur Erstellung und Veröffentlichung von Inhalten, und stellt sicher, dass Anwender die Daten effektiv für ihre spezifischen Bedürfnisse nutzen können.

Download von GitHub:

zeus-access-400

Durchführung des Maven-Builds

Öffne eine Konsole oder ein Terminal und navigiere zum Wurzelverzeichnis zeus-access-400 des Projekts. Führe den folgenden Befehl aus, um das Projekt zu kompilieren und eine ausführbare JAR-Datei zu erstellen: siehe auch Maven und die POM.xml

mvn clean package

Dieser Befehl bereinigt vorherige Builds (clean) und erstellt ein neues Paket (package), wobei eine JAR-Datei im target-Verzeichnis abgelegt wird.

Deployment für Java-IBM System i: Integration mit zeus-access-400.zip

Um die Integration von Java mit IBM System i über JDBC zu vereinfachen, haben wir unseren Deployment-Prozess optimiert. Anstatt jede Datei einzeln zu kopieren, kannst du jetzt die vereinfachte Methode mit der Datei zeus-access-400.zip verwenden. Dieser Schritt vereinfacht das Hinzufügen aller erforderlichen Dateien erheblich.

Nach dem Entpacken von zeus-access-400.zip musst du nur noch die jt400.jar Datei in den Ordner zeus-access-400 hinzufügen und die application.properties nach Bedarf anpassen. Dies gewährleistet, dass alle notwendigen Bibliotheken und Konfigurationen für den Zugriff auf IBM System i bereitstehen.

Der Start der Anwendung erfolgt nun bequem mit runexport.cmd unter Windows bzw. runexport.sh unter OS-400/QSH. Diese Skripte erleichtern den Startprozess und stellen sicher, dass deine Anwendung mit den richtigen Einstellungen ausgeführt wird.

Die Struktur des zeus-access-400 Ordners sieht wie folgt aus:

./zeus-access-400
│   application.properties
│   runexport.cmd
│   runexport.sh
│   zeus-access-400-1.0-SNAPSHOT.jar
│
├───export
└───xslt
        xml_to_csv.xslt
        xml_to_html.xslt
        xml_to_json.xslt
        xml_to_jsonl.xslt
        xml_to_md.xslt

Diese Änderung im Deployment-Prozess macht es einfacher und effizienter, deine Java-Anwendung mit IBM System i zu integrieren und zu starten.

Weitere Informationen zu Java auf System-i:

Starten der Anwendung auf Unix/Linux/System-i

Um die Anwendung auf einem Unix/Linux/System-i zu starten, verwende den folgenden Befehl, wobei du sicherstellst, dass der Klassenpfad korrekt gesetzt ist, um die jt400.jar und die application.properties Datei einzubeziehen:
Wechsle dazu zunächst in den target – Folder:

java -cp "zeus-access-400-1.0-SNAPSHOT.jar:jt400.jar" de.zeus.hermes.AppInitializer application.properties

Starten der Anwendung auf einem Windows-System

Der Befehl zum Starten der Anwendung auf einem Windows-System ähnelt dem für Unix/Linux, verwendet jedoch ein Semikolon (;) als Trennzeichen im Klassenpfad:

java -cp "zeus-access-400-1.0-SNAPSHOT.jar;jt400.jar" de.zeus.hermes.AppInitializer application.properties

Der Unterschied zwischen den Calls liegt lediglich bei den Trennzeichen für jar-Files im Classpath: Doppelpunkt (:) auf Unix/Linux/System-i und Semikolon (;) auf Windows-Systemen.

Beschreibung der verwendeten Klassen

AppInitializer

Die AppInitializer-Klasse dient als Einstiegspunkt der Anwendung. Sie ist verantwortlich für die Initialisierung der Anwendungsumgebung, das Laden der Konfigurationseinstellungen und den Start des Datenbankserviceprozesses. Diese Klasse demonstriert, wie die Config und DatabaseService Klassen genutzt werden, um Datenbankoperationen basierend auf in einer externen Eigenschaftsdatei spezifizierten Konfigurationen zu erleichtern. Der AppInitializer betont die Bedeutung einer externen Konfiguration für Flexibilität und Wartbarkeit von Java-Anwendungen und verwendet den PropertiesLoader, um Datenbankverbindungsdetails und andere Einstellungen dynamisch zu laden.

Config

Die Config-Klasse agiert als zentralisiertes Repository für die Verwaltung der Anwendungskonfigurationseinstellungen. Sie ist als Singleton konzipiert, um eine einzige, global zugängliche Instanz bereitzustellen, die Konfigurationsparameter wie Datenbankverbindungsdetails (Treiber, URL, Benutzername, Passwort) und Abfragespezifikationen enthält. Diese Klasse ermöglicht den einfachen Zugriff und die Modifikation von kritischen Einstellungen in der gesamten Anwendung und fördert Konsistenz sowie die Reduzierung der Wahrscheinlichkeit von Konfigurationsfehlern.

PropertiesLoader

Der PropertiesLoader ist ein Hilfsprogramm, das zum Laden von Eigenschaftsdateien verwendet wird. Diese Klasse erleichtert das Laden von Konfigurationen aus Dateien, die im Dateisystem oder in JAR-Dateien gespeichert sind, und unterstützt damit die Flexibilität der Anwendung durch die Anpassung an verschiedene Laufzeitumgebungen.

DatabaseManager

Die DatabaseManager-Klasse ist verantwortlich für die Verwaltung von Datenbankverbindungen und die Ausführung von SQL-Anweisungen. Sie bietet Methoden zum Herstellen von Verbindungen zur Datenbank mit den bereitgestellten Anmeldeinformationen, zum Schließen von Verbindungen sowie zum Vorbereiten und Ausführen von SQL-Anweisungen. Diese Klasse fungiert als Dienstprogramm, um Datenbankoperationen für die Anwendung zu abstrahieren und zu vereinfachen.

DatabaseController

Der DatabaseController verwaltet den Lebenszyklus der Datenbankverbindung innerhalb der Anwendung. Er nutzt den DatabaseManager, um Verbindungen zur Datenbank basierend auf den in der Config-Klasse spezifizierten Konfigurationsparametern herzustellen und zu schließen. Diese Klasse stellt Methoden bereit, um eine Verbindung zur Datenbank herzustellen und sicher zu schließen, wenn sie nicht mehr benötigt wird. Zudem delegiert sie die Aufgabe des Exportierens von Datenbankabfrageergebnissen im XML-Format an die XmlExporter-Klasse, was die Modularität der Anwendung verbessert.

DatabaseService

Die DatabaseService-Klasse fungiert als höher gelegene Dienstschicht, die Interaktionen mit der Datenbank über den DatabaseController erleichtert. Sie abstrahiert die Prozesse der Datenbankoperation und bietet eine vereinfachte Schnittstelle für spezifische Aufgaben wie den Export von SQL-Abfrageergebnissen im XML-Format. Diese Klasse ermöglicht eine bessere Trennung der Zuständigkeiten, indem sie die Anwendungslogik von direkten Datenbankoperationen entkoppelt.

XmlExporter

Die XmlExporter-Klasse erleichtert die Umwandlung von SQL-Abfrageergebnissen aus einem ResultSet in ein XML-Format. Sie bietet eine statische Methode zum effizienten Exportieren von Daten und kapselt den Prozess der XML-Dokumentenerstellung, der Zuordnung von Elementen und des Dateischreibens. Diese Klasse abstrahiert die Komplexität, die mit der Umwandlung von Datenbankabfrageergebnissen in ein strukturiertes XML-Dokument verbunden ist, und ermöglicht eine einfache Integration und Nutzung innerhalb von Datenbankinteraktionsschichten oder Diensten.

XMLtransformer

Die XMLtransformer-Klasse dient der Transformation von XML-Dokumenten mittels XSLT-Stylesheets. Ähnlich der XmlExporter-Klasse, die SQL-Abfrageergebnisse in XML umwandelt, fokussiert sich XMLtransformer auf die Konvertierung von XML zu anderen Formaten wie JSON. Diese Funktionalität unterstützt die flexible Anpassung von Datenpräsentationen und deren Weiterverarbeitung.Mit der Methode transformXML liest die Klasse XMLtransformer XML- und XSLT-Dateien ein und transformiert diese in ein neues Format. Dieser Prozess beginnt mit dem Laden der XML- und XSLT-Dateien als Source-Objekte, gefolgt von der Erzeugung eines Transformer-Objekts mittels TransformerFactory. Anschließend führt sie die Transformation durch und speichert das Ergebnis in einer Ziel-Datei. Dieser Ablauf ermöglicht den flexiblen Einsatz der Klasse in verschiedenen Bereichen der Datenverarbeitung und -integration.

Jede Klasse innerhalb des zeus-access-400 Projekts trägt dazu bei, eine robuste und flexible Architektur für die Interaktion mit Datenbanksystemen über Java zu schaffen, wobei ein besonderer Fokus auf die effiziente Kommunikation mit IBM System i (AS400) gelegt wird.

Abschluss und Ausblick

zeus-access-400 zeigt eindrucksvoll einen praktischen Ansatz zur Nutzung von JDBC in Java-Anwendungen für die Interaktion mit IBM System i und unterstreicht die universelle Anwendbarkeit dieser Technik. Mit der JDBC-API kann die Anwendung mit jedem Datenbanksystem arbeiten, für das ein JDBC-Treiber verfügbar ist, was die Stärke von Java und JDBC als flexible Werkzeuge für die Datenbankinteraktion bestätigt. Beispiel dazu im kommenden Artikel.