Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 20 Datenbankmanagement mit JDBC
gp 20.1 Das relationale Modell
gp 20.2 JDBC: der Zugriff auf Datenbanken über Java
gp 20.3 Die Rolle von SQL
gp 20.3.1 Ein Rundgang durch SQL-Anfragen
gp 20.3.2 Datenabfrage mit der Data Query Language (DQL)
gp 20.3.3 Tabellen anlegen mit der Data Definition Language (DDL)
gp 20.4 Datenbanktreiber für den Zugriff
gp 20.4.1 Treibertypen
gp 20.5 Datenbanken und ihre Treiber
gp 20.5.1 Die freie Datenbank MySQL
gp 20.5.2 JDBC-Treiber für MySQL: MySQL Connector/J
gp 20.5.3 Die Datenbank Microsoft Access
gp 20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000
gp 20.5.5 Die JDBC-ODBC-Bridge
gp 20.5.6 ODBC einrichten und Access damit verwenden
gp 20.5.7 Oracle9i Enterprise Edition
gp 20.5.8 JDBC-Treiber für mobile Endgeräte
gp 20.6 Eine Beispielabfrage
gp 20.7 Mit Java an eine Datenbank andocken
gp 20.7.1 Der Treibermanager
gp 20.7.2 Eine Aufzählung aller Treiber
gp 20.7.3 Log-Informationen
gp 20.7.4 Den Treiber laden
gp 20.7.5 Verbindung zur Datenbank
gp 20.8 Datenbankabfragen
gp 20.8.1 Abfragen über das Statement-Objekt
gp 20.8.2 Ergebnisse einer Abfrage in ResultSet
gp 20.8.3 Unicode in der Spalte korrekt auslesen
gp 20.8.4 wasNull() bei ResultSet
gp 20.8.5 Wie viele Zeilen hat ein ResultSet?
gp 20.9 Java und SQL-Datentypen
gp 20.9.1 Die getXXX()-Methoden
gp 20.10 Transaktionen
gp 20.11 Elemente einer Datenbank hinzufügen und aktualisieren
gp 20.11.1 Batch-Updates
gp 20.12 Vorbereitete Anweisungen (Prepared Statements)
gp 20.12.1 PreparedStatement-Objekte vorbereiten
gp 20.12.2 Werte für die Platzhalter eines PreparedStatement
gp 20.13 Metadaten
gp 20.13.1 Metadaten über die Tabelle
gp 20.13.2 Informationen über die Datenbank
gp 20.14 Die Ausnahmen bei JDBC
gp 20.15 Java Data Objects (JDO)
gp 20.16 XML-Datenbanken
gp 20.16.1 Apache Xindice
gp 20.16.2 eXist und Weitere


Galileo Computing

20.5 Datenbanken und ihre Treiberdowntop

Wir wollen uns im Folgenden mit einigen Datenbanken und ihren Treibern beschäftigen, die für den Zugriff unter Java geeignet sind. Sun veröffentlicht unter http://servlet.java.sun.com/products/jdbc/drivers Treiber zu allen möglichen Datenbanken. Eine Suchmaske erlaubt die Eingabe einer Datenbank und die Auswahl eines gewünschten Typs.


Galileo Computing

20.5.1 Die freie Datenbank MySQLdowntop

MySQLTM (http://www.mysql.com/) ist ein häufig eingesetzter freier und schneller Open-Source-Datenbank-Server. Er wird oft im Internet in Zusammenhang mit dynamischen Web-Seiten eingesetzt; das Zusammenspiel Linux, Apache, MySQL, PHP (LAMP-System) ist hoch gelobt. Herausragende Eigenschaften sind die Geschwindigkeit und die Bedienbarkeit; die hohe Geschwindigkeit beruht teilweise darauf, dass MySQL auf Transaktionen verzichtet. Seit der Version 4 kann eine alternative Datenbank-Engine (InnoDB, http://www.innodb.com/) aber auch Transaktionen ausführen.

Wie alles begann

Die Entwicklung vom MySQL hatte mSQL als Vorbild, und MySQL würde es auch nicht geben, wenn der finnische Entwickler Michael (Monty) Widenius nicht von der mSQL-Entwicklermannschaft enttäuscht worden wäre. Die schwedische Firma T. c. X. DataKonsultAB hatte mSQL ausgiebig für eine webbasierende Anwendung zur Verwaltung von Datenbanken genutzt. Das System hieß UNIREG. Nach ausführlichen Verbesserungsvorschlägen an die Mannschaft von mSQL geschah nichts. Nie. Keine Antwort. Daraufhin entwickelte die Firma (hauptsächlich eine Arbeit von Widenius, der 95% der Server-Codes schrieb) auf der Basis von UNIREG und mSQL die neue Datenbank MySQL. Sie wurde im Mai 1995 in der Version 1.0 der Öffentlichkeit vorgestellt. Die Firma T.c.X wurde dann in MySQL AB umbenannt und verdient heute viel Geld mit Support und Schulungen. Michael Widenius ist heute CTO (Chief Technology Officer, Technologischer Geschäftsführer). Die Firma ist in Uppsala - Hauptstadt der Provinz Uppland in Schweden - ansässig.

Seit Juni 2000 ist die MySQL als Open-Source-Software kostenlos verfügbar und steht unter der GNU General Public License (GPL). Lizenzgebühren fallen an, wenn MySQL als integraler Bestandteil der eigenen Anwendung vertrieben wird.


Hinweis Auch wenn bisweilen mit Open Source und GPL immer verbunden wird, dass die Software frei verfügbar ist, heißt es nicht, dass sie umsonst ist. Wer MySQL mit einer Software bündelt, die verkauft wird, muss eine MySQL-Lizenz für 395 $ erwerben. Ohne Lizenz lässt sich zum Beispiel PostgreSQL (http://www.postgresql.org/) einsetzen, eine weitere ausgezeichnete freie Datenbank.

Installation

Wir wollen MySQL in der Version 4 nutzen. Dazu entpacken wir das Zip-Archiv, welches unter http://www.mysql.com/downloads/mysql-4.0.html zum Download liegt. Das Archiv ist etwa 17 MB groß und enthüllt eine Datei install.exe, welche die Installation startet. MySQL schlägt den Pfad c:\mysql vor, den wir beibehalten sollten. (Andernfalls geht es gleich danach mit einer Konfigurationsdatei weiter, und das wollen wir uns ersparen.) Dann kann die Installation ohne weitere Besonderheiten weitergeführt werden.

Wechseln wir anschließend in das Unterverzeichnis bin der Installation. Dort existieren unterschiedlich optimierte Variablen des Servers (Näheres dazu unter http://www.mysql.com/doc/W/i/Windows_prepare_environment.html). Wir wollen mysqld-max-nt nutzen. Das Programm kann mit verschiedenen Optionen aufgerufen werden.

gp mysqldXXX.exe --standalone (startet den MySQL-Server)
gp mysqldXXX.exe --install (installiert den MySQL-Server als Dienst)
gp mysqldXXX.exe --remove (entfernt den MySQL-Server-Dienst)

Wir ziehen erst einmal einen normalen Start ohne Service vor:

C:\mysql\bin>mysqld-max-nt --standalone
InnoDB: The first specified data file .\ibdata1 did not exist:
InnoDB: a new database to be created!
InnoDB: Setting file .\ibdata1 size to 64 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Log file .\ib_logfile0 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile0 size to 5 MB
InnoDB: Log file .\ib_logfile1 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile1 size to 5 MB
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
020412 12:47:32  InnoDB: Started

MySQL legt einige Tabellen an, und dann läuft der Server.

Wir wollen jetzt eine Datenbank anlegen. Dazu gibt es den Msql-Client. Er existiert einmal als Kommandozeilenprogramm (msql.exe) und als Windows-GUI (MySqlManager.exe). Bleiben wir bei der Kommandozeile.

C:\mysql\bin>mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20 to server version: 4.0.1-alpha-max-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Geben wir help ein, bekommen wir eine Hilfe. Mit exit beenden wir den Client. Geben wir die Tabellen aus, die schon vorhanden sind:

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)
mysql>

Machen wir eine Anfrage. Das funktioniert gut, da MySQL selbst Informationen in Tabellen speichert.

SELECT * FROM mysql.user;

Natürlich sollten diese Informationen durch Passwort geschützt sein, doch das soll nicht unsere Aufgabe sein.

Die Datenbank test eignet sich sehr gut zum Spielen. Sie ist leer, und hier können zum Testen neue Tabellen angelegt und mit Daten gefüllt werden. Das grafische Tool bietet die gleichen Möglichkeiten, nur mit einer grafischen Schnittstelle. SQL-Kommandos zum Erstellen der Tabellen müssen immer noch von Hand eingegeben werden. Um davon wegzukommen, bietet sich Ansgars MySQL-Front an.

Für die Administration des Servers gibt es ebenfalls ein Kommandozeilenprogramm (mysqladmin.exe) und das Programm mit grafischer Oberfläche (WinMySQLAdmin.exe). Das Passwort ist am Anfang egal, es muss nur etwas dort stehen.

GUI-Frontends

Das kostenlose Backend MySQL lässt sich sehr gut mit der grafischen Microsoft Software (Access, Excel) verbinden, so dass hier Tabellendefinitionen und Anfragen über eine einfach zu bedienende Schnittstelle erfolgen können. Die englischsprachige Web-Seite http://www.washington.edu/computing/web/publishing/mysql-access.html gibt dazu eine kleine Information. Gleichzeitig zeigt sie, wie Daten anderer ODBC-Quellen in MySQL importiert werden können.

MySQL-Front (http://www.mysqlfront.de/) ist eine freie grafische Oberfläche von Ansgar Becker unter Windows für die MySQL-Datenbank.


Galileo Computing

20.5.2 JDBC-Treiber für MySQL: MySQL Connector/Jdowntop

MySQL kann einfach über den unter der LGPL stehenden Typ-4-JDBC-Treiber MySQL Connector/J1 bedient werden. Der Treiber liegt unter http://www.mysql.com/downloads/api-jdbc.html bereit. Nach dem Entpacken muss das Jar-Archiv des Treibers noch im Klassenpfad aufgenommen werden. Er unterstützt die JDBC-3.0-API.


Galileo Computing

20.5.3 Die Datenbank Microsoft Accessdowntop

Mit Microsoft Access lässt sich mit wenigen Handgriffen eine Datenbank zusammenbauen. Der folgende Ablauf gilt für Access 2000. Wird Access geöffnet, erscheint ein Dialog mit dem Eintrag Leere Access-Datenbank. (Alternativ lässt sich eine neue Datenbank unter dem Menüpunkt Datei, Neu ..., Einrichten.) Wir wählen den ersten Eintrag Datenbank und speichern dann die Datenbank unter einem aussagekräftigen Namen. Access benötigen wir nicht mehr direkt, da die Kommunikation mit der Datenbank anschließend über den ODBC-Manager läuft. Dieser setzt dann auf den SQL-Kern von Access auf. Im ODBC-Manager muss dafür die Datenquelle angemeldet werden. Dies beschreiben wir etwas später. Mit SQL können nun die Relationen eingetragen und darauf die Anfragen gestellt werden.

Access wird als Beispiel für die JDBC-ODBC-Brücke beschrieben. Viele Anwender haben das Office-Paket von Microsoft zu Hause installiert und so schon eine Datenbank wie Access in der Nähe. Der Nachteil bei der JDBC-ODBC-Brücke ist jedoch, dass diese erst seit Version 1.4 den neueren JDBC 2-Standard implementiert.


Galileo Computing

20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000downtop

Von der Firma Merant DataDirect (http://www.datadirect-technologies.com/) hat Microsoft einen JDBC-Typ-4-Treiber für den Microsoft SQL Server 2000 lizenziert. Er kann im Microsoft SQL Server Download Center unter http://www.microsoft.com/sql/downloads/default.asp heruntergeladen werden. Der Treiber unterstützt die Java-Versionen ab 1.1.8 und berücksichtigt die Betriebssysteme Windows, Linux, Solaris AIX und HP-UX.

Merant hat sich auf Datenbanktreiber spezialisiert. Ihr Produkt DataDirect Connect for JDBC unterstützt JDBC 3 für die Datenbanken Oracle, MSSQL, Informix, Sybase und DB2.


Galileo Computing

20.5.5 Die JDBC-ODBC-Bridgedowntop

Damit wir die JDBC-ODBC-Brücke nutzen können, brauchen wir einen ODBC-Treiber für die spezielle Datenbank. ODBC ist kein Teil eines Betriebssystems, sondern muss getrennt installiert werden, zum Beispiel vom Office-Paket oder vom MS SQL-Server. Auch bei Microsofts Web-Server, der Windows NT beiliegt, kann ein ODBC-Treiber installiert werden. Da ODBC von Microsoft ist, gibt es ODBC-Treiber nicht für alle Plattformen. Das heißt, die JDBC-ODBC-Bridge fällt für manche Systeme sofort flach. Microsoft liefert Versionen von ODBC für Windows, Windows 95, Windows NT und Macintosh aus. Von verschiedenen Herstellern gibt es Portierungen für einige Unix-Plattformen, unter anderem Solaris. Ein Projekt unter dem Namen FreeODBC (http://library.freeodbc.org/) hat sich zum Ziel gesetzt, ODBC auch für andere Plattformen zu verbreiten. Unter anderem gibt es eine freie JDBC-ODBC-Bridge unter den Systemen OS/2, Unix (auch Linux) und Win32.


Galileo Computing

20.5.6 ODBC einrichten und Access damit verwendendowntop

Die Installation von ODBC sieht bei jedem Datenbankanbieter anders aus. Benutzen wir Microsoft Access, so werden die ODBC-Treiber während der Installation automatisch mit installiert. Wenn wir eine Datenquelle unter ODBC hinzufügen wollen, müssen wir nur wenige Schritte unternehmen. In den Systemeinstellungen (Start, Einstellungen, Systemsteuerung) suchen wir nach dem Symbol ODBC-Datenquellen (32 Bit), unter Windows 2000 im zusätzlichen Verzeichnis Verwaltung, dort heißt es Datenquellen (ODBC). Nach dem Aktivieren öffnet sich ein Dialog mit dem Titel ODBC-Datenquellen-Administrator.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Wir gehen auf Hinzufügen, um eine neue Benutzer-Datenquelle hinzuzufügen. Im Dialog mit dem Titel Neue Datenquelle erstellen wählen wir den Microsoft Access-Treiber aus und gehen auf Fertigstellen. Ein Dialog öffnet sich, und wir tragen unter Datenquellenname einen Namen für die Datenquelle ein. Darunter können wir später in Java die Datenbank ansprechen. Der Name der Datei hat nichts mit dem Namen der Datenquelle gemeinsam. Optional können wir noch eine Beschreibung hinzufügen. Wichtig ist nun die Verbindung zur physikalischen Datenbank. Im umrandeten Bereich Datenbank aktivieren wir über die Schaltfläche Auswählen einen Datei-Selektor. Hier hangeln wir uns bis zur in Access erstellten Datei durch und tragen sie ein. Nun nur noch ein paar Mal OK drücken und wir sind fertig. Wenn der Administrator nicht meckert, können wir nun ein JDBC-Programm starten.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 20.1 Auswählen einer Datenbank

Die Geschwindigkeit der JDBC-ODBC-Brücke

Die Geschwindigkeit des Zugriffs über die JDBC-ODBC-Brücke hängt von vielen Faktoren ab, so dass eine pauschale Antwort nicht zu geben ist. Denn zwischen der Abfrage unter JDBC bis zur Datenbank hängen viele Schichten, an denen unter anderem zahlreiche Hersteller beteiligt sind:

gp Der JDBC-Treiber-Manager von JavaSoft
gp Der Treiber der JDBC-ODBC-Bridge von JavaSoft und Intersolv
gp Der ODBC-Treiber-Manager von Microsoft
gp Der ODBC-Treiber zum Beispiel vom Datenbankhersteller
gp Die Datenbank selbst

Jede der Schichten übersetzt nun die Anfragen an die Datenbank in möglicherweise völlig andere Anfragen. So muss zwischen JDBC und ODBC eine Übersetzung vorgenommen werden, dann muss das SQL-Kommando geparst werden und so weiter. Danach geht der Weg auch wieder zurück, von der Datenbank über die Treiber bis hin zum Java-Code. Dies dauert natürlich seine Zeit. Zusätzlich kommen zum Zeitaufwand und dem Speicher, den die Konvertierung benötigt, noch Inkompatibilitäten und Fehler hinzu. Somit hängt das Gelingen der JDBC-ODBC-Brücke von vielen Schichten ab und ist oft nicht so performant wie eine native Implementierung.


Galileo Computing

20.5.7 Oracle9i Enterprise Editiondowntop

Einer der bekanntesten Datenbanken stammt von Oracle. Um die Verbreitung weiter zu erhöhen, ist die Firma dazu übergegangen, eine vollwertige Version zum Download oder als CD freizugeben. Wer das Download nicht scheut, der kann unter http://otn.oracle.com/software/products/oracle9i/content.html die Version für Windows, Linux und weitere Unix-Systeme herunterladen.


Galileo Computing

20.5.8 JDBC-Treiber für mobile Endgerätetoptop

Mobile Endgeräte können nicht auf JDBC-Datenbanken zugreifen, da bisher keine JDBC-Schnittstelle in der J2ME vorgesehen ist. Künstliche Implementierungen kopieren daher die Schnittstellen von Sun. Für DB2 gibt es allerdings JdbcMe for DB2 (http://www.alphaworks.ibm.com/tech/jdbcme). Der Treiber besteht aus der kleinsten sinnvollsten Untermenge von JDBC 2.0. Der Treiber ist etwa 32 k groß.

Für die Connected Device Configuration (CDC) gibt es ein optionales Paket, welches in der JSR-169 die JDBC Optional Package for CDC/Foundation Profile API beschreibt.

Einen allgemeineren Weg geht ReqwirelessDB (http://www.reqwireless.com/products-db.html). Es arbeitet mit beliebigen Datenbanken zusammen, denn die Bibliothek implementiert die JDBC-Schnittstelle (die als Kopie dem Paket beiliegen) und delegiert die Anfragen zu einem Servlet. Jede Anfrage ist also entfernt, so dass nicht wirklich das mobile Endgerät die Datenverbindung zum Server aufnimmt. Der Server verbindet zum Datenbank-Server, holt von dort die Daten und schickt diese dem mobilen Endgerät zurück. Die Daten sind in XML (sic!), werden über kXML geparst und dann als ResultSet angeboten.

Das Fazit ist: JDBC ist bisher für mobile Endgeräte keine Lösung.






1 Früher hieß der Treiber noch MM.MySQL, doch der Entwickler Mark Matthews wird nun von der Firma MySQL AB bezahlt. Eine alte Version lässt sich jedoch noch unter>http://mmmysql.sourceforge.net/ beziehen.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de