12.5 Grundlagen der Datenbankprogrammierung
Beinahe jede bedeutende Programmiersprache besitzt eine Schnittstelle zu einer oder sogar mehreren Datenbanken. Es ist erheblich praktischer, Daten für verteilte Anwendungen zentral in einer Datenbank abzulegen und aus Programmen darauf zuzugreifen, als diese Daten in einer selbst entwickelten Datenstruktur zu speichern.
Die meisten Datenbankanbindungen für Programmiersprachen sind in der Lage, auf mehrere unterschiedliche SQL-Datenbanken zuzugreifen. In diesem Abschnitt finden Sie eine kurze Einführung in die Datenbankschnittstelle JDBC, über die Sie aus Java-Programmen heraus Zugriff auf beinahe beliebige Datenbanken haben.
JDBC ist keine Schnittstelle zu einer bestimmten Datenbank, sondern eine unabhängige, allgemeine API, die mit vielen unterschiedlichen Treibern zusammenarbeitet. Die meisten dieser Treiber stammen von den jeweiligen Datenbankanbietern selbst, andere werden von Drittanbietern geliefert. An dieser Stelle sollen zwei dieser Treiber explizit erwähnt werden:
- Die JDBC-ODBC-Bridge ist bereits von Haus aus in das Java SDK eingebaut und bietet
Zugriff auf beliebige Datenbanken mit ODBC-Anbindung. ODBC (Open Database Connectivity)[Anm.: Die Entwickler von Java werden nicht müde zu betonen, dass JDBC nicht für »Java Database
Connectivity« steht, sondern für nichts Konkretes.] ist eine von Microsoft entwickelte Technologie, die seit Langem in alle Windows-Versionen
eingebaut ist und den Zugriff auf unzählige Datenbanken bereitstellt. Die JDBC-ODBC-Bridge
war vor allem bei der Einführung von JDBC wichtig, weil dadurch indirekt eine Vielzahl
von Datenbanktreibern zur Verfügung stand.
Wenn Sie ODBC verwenden möchten, müssen Sie zunächst über die Windows-Systemsteuerung eine Datenbank als ODBC-Datenquelle einrichten.
- MySQL Connector/J stammt von MySQL ab, ist ein Open-Source-Projekt wie MySQL selbst und kann von der MySQL-Website heruntergeladen werden. Nachdem Sie das Archiv entpackt haben, finden Sie im äußersten Verzeichnis eine Datei namens mysql-connector-java-5.1.25.tar.gz (oder eine höhere Version als 5.1.25). Nach dem Entpacken müssen Sie den Pfad zum entsprechenden Verzeichnis zu Ihrem CLASSPATH hinzufügen (siehe hierzu Kapitel 9, »Grundlagen der Programmierung«).
Um JDBC in Ihrem Java-Programm zu verwenden, müssen Sie zuerst die JDBC-Klassen importieren:
Einen JDBC-Treiber können Sie über Class.forName() laden. Das sieht für die JDBC-ODBC-Bridge folgendermaßen aus:
try {
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (ClassNotFoundException e) {
System.out.println
("JDBC-ODBC-Treiber nicht gefunden.");
}
Die entscheidende Zeile für das Laden von MySQL Connector/J sieht entsprechend so aus:
Class.forName("com.mysql.jdbc.Driver");
Ein einfaches Class.forName ("Treiber") funktioniert unter Umständen nicht richtig. Sicherer ist folgende Variante:
Class.forName("Treiber").newInstance();
Der nächste Schritt besteht darin, über den Treiber eine Verbindung zur gewünschten Datenbank herzustellen. Dafür besitzt jeder JDBC-Treiber sein eigenes JDBC-URL-Schema. Eine Verbindung über die JDBC-ODBC-Bridge, in diesem Beispiel zu einer Datenbank namens supermarkt, funktioniert folgendermaßen:
Statt user und pass müssen Sie selbstverständlich Ihren Usernamen und Ihr Passwort eintragen, die Sie zum Zugriff auf die Datenbank berechtigen. Einige Datenbanksysteme besitzen keinen Passwortschutz; hier müssen Sie zwei leere Strings ("") übergeben.
MySQL-Connector/J-URLs sehen ein wenig anders aus. Hier müssen Sie den Netzwerknamen des Rechners angeben, auf dem die Datenbank läuft. Wenn der MySQL-Server auf Ihrem eigenen Rechner läuft, erfolgt ein Zugriff auf die Datenbank supermarkt (in diesem Fall ohne Benutzername und Passwort) wie folgt:
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost/supermarkt", "", "");
localhost ist die Netzwerkbezeichnung für den lokalen Rechner. Falls sie auf Ihrem Rechner nicht unterstützt wird, können Sie stattdessen die numerische Adresse 127.0.0.1 verwenden.
Nachdem die Verbindung hergestellt wurde, benötigen Sie ein Statement-Objekt, das dazu verwendet wird, SQL-Abfragen an die Datenbank weiterzugeben. Das Objekt wird folgendermaßen eingerichtet:
Über das Statement-Objekt (hier st) können Sie SQL-Abfragen ausführen. Es besitzt die Methoden executeQuery() für Auswahlabfragen und execute() für alle Abfragen, die Änderungen an der Datenbank vornehmen. Beispielsweise können Sie folgendermaßen einen Datensatz in die Tabelle artikel einfügen:
try {
st.execute ("INSERT INTO ARTIKEL (ARTNAME, PREIS,
MWST) VALUES (\"Tomaten\", 199, \"7\")");
}
catch (SQLException e) {
// SQL-Abfrage-Ausnahme behandeln
}
Die Methode executeQuery() liefert ein ResultSet-Objekt zurück, aus dem Sie die Ergebnisdatensätze auslesen können. Die folgende Auswahlabfrage liest alle Datensätze aus der Tabelle artikel:
Mit der ResultSet-Methode next() können Sie das Ergebnis nun Zeile für Zeile abarbeiten. Um die einzelnen Felder eines Datensatzes auszulesen, bietet ResultSet eine Reihe verschiedener get-Methoden an, die die verschiedenen SQL-Datentypen in passende Java-Datentypen umsetzen. Beispielsweise können Sie die Inhalte von artikel aus dem soeben ermittelten ResultSet folgendermaßen auf der Konsole ausgeben:
while (rs.next()) {
System.out.print ("Artikel: "
+ rs.getString ("ARTNAME") + " ");
System.out.print ("Preis: "
+ rs.getInt ("PREIS") + " ");
System.out.println ("MWSt-Satz: "
+ rs.getString ("MWST"));
}
Tabelle 12.9 zeigt die wichtigsten SQL-Datentypen, die korrespondierenden Java-Datentypen und die zuständigen get-Methoden, um sie aus einem ResultSet zu lesen.
Falls Sie die Datenbankressourcen in Ihrem Java-Programm nicht mehr benötigen, sollten Sie sie nacheinander mithilfe ihrer close()-Methoden schließen, und zwar zuerst das ResultSet, dann das Statement und zum Schluss die Datenbankverbindung selbst:
rs.close();
st.close();
conn.close();
Ein zusammenhängendes Beispiel für die JDBC-Programmierung finden Sie übrigens in Kapitel 15, »XML«. Weitere Beispiele für Datenbankschnittstellen befinden sich in Kapitel 18, »Webserveranwendungen«, in dem die MySQL-Datenbankanbindungen der Web-Programmiersprache PHP sowie des Frameworks Ruby on Rails erläutert werden.
CouchDB im Schnellüberblick
Einen ganz anderen Weg als relationale Datenbanken gehen die dokumentbasierten Datenbanken. Es gibt sie im Grunde seit vielen Jahren; ein bekanntes kommerzielles Beispiel ist etwa Lotus Notes. Erst in letzter Zeit beginnt sich dieses Paradigma jedoch auch im Bereich der Webanwendungen zu verbreiten. Hier kommt vor allem das Open-Source-Projekt Apache CouchDB zum Einsatz. Die Datenbank wurde 2005 veröffentlicht und kurz darauf von der Apache Software Foundation als Projekt aufgenommen. Die Software ist in der funktionalen Programmiersprache Erlang geschrieben.
In einer dokumentenbasierten Datenbank wie CouchDB gibt es keine Datensätze, sondern nur einzelne Dokumente. Es handelt sich um eine Sammlung frei definierbarer Felder, die jeweils einen Namen und einen Wert mit einem bestimmten Datentyp enthalten. Selbstverständlich besteht die Möglichkeit, beliebig viele Dokumente mit identischer Struktur zu erstellen. Auf diese Weise lassen sich im Grunde auch relationale Abfragen abbilden, allerdings ohne die Flexibilität des dokumentenbasierten Ansatzes einzubüßen.
CouchDB kommuniziert als eigenständiger Webserver mit der Außenwelt; sein Standard-TCP-Port ist 5984. Anfragen werden im REST-Format gestellt, das heißt, es kommen je nach Anfragetyp verschiedene HTTP-Methoden zum Einsatz:
- PUT zum Erzeugen von Datenbanken und Dokumenten
- POST zum Ändern von Datenbanken und Dokumenten
- DELETE zum Löschen von Datenbanken und Dokumenten
- GET zum Lesen von Informationen, zum Beispiel für Abfragen
Alle Antworten von CouchDB erfolgen im JSON-Format (JavaScript Object Notation). Dieses Format wird in Abschnitt 19.8, »Ajax«, genau erläutert. Aufgrund der HTTP-REST-JSON-Architektur wird CouchDB auch als NoSQL-Datenbank bezeichnet.
Obwohl praktisch alle wichtigen Programmiersprachen mit Bordmitteln HTTP-Anfragen stellen und JSON verarbeiten können, stellen die CouchDB-Entwickler Bibliotheken für eine Reihe wichtiger Sprachen bereit, zum Beispiel für JavaScript, Java, PHP, Ruby und Python.
Die meisten CouchDB-Installationen sind mit einer Administrationsoberfläche namens Futon ausgestattet, die sich im Browser über den besagten Port 5984 ansprechen lässt. Ansonsten kann Futon leicht nachinstalliert werden.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.