Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
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 Derby
    gp 20.5.2 MySQL
    gp 20.5.3 Microsoft Access
    gp 20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000
    gp 20.5.5 Oracle10g
    gp 20.5.6 Eclipse-Plugins zum Durchschauen von Datenbanken
  gp 20.6 Eine Beispielabfrage
  gp 20.7 Mit Java an eine Datenbank andocken
    gp 20.7.1 Der Treibermanager
    gp 20.7.2 Den Treiber laden
    gp 20.7.3 Eine Aufzählung aller Treiber
    gp 20.7.4 Log-Informationen
    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 Java und SQL-Datentypen
    gp 20.8.4 Unicode in der Spalte korrekt auslesen
    gp 20.8.5 wasNull() bei ResultSet
    gp 20.8.6 Wie viele Zeilen hat ein ResultSet?
  gp 20.9 Die Ausnahmen bei JDBC
  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 Die LOBs (Large Objects)
    gp 20.13.1 Einen BLOB besorgen
  gp 20.14 Die SQL3-Datentypen ARRAY, STRUCT und REF
  gp 20.15 Metadaten
    gp 20.15.1 Metadaten über die Tabelle
    gp 20.15.2 Informationen über die Datenbank
  gp 20.16 DataSource
    gp 20.16.1 Die Schnittstelle DataSource


Galileo Computing

20.5 Datenbanken und ihre Treibedowntop

Vor dem Glück, eine Datenbank in Java ansprechen zu können, steht die Inbetriebnahme des Datenbanksystems. (Für dieses Kapitel ist das der schwierigste Teil.) Nun gibt es eine große Anzahl von Datenbanken – manche frei und Open Source, manche sehr teuer –, sodass die Auswahl einer Demo-Datenbank für das Buch immer wieder neu überlegt wird. Das Rennen macht in dieser Buchauflage die pure Java-Datenbank Derby, die sehr leicht auch ohne Administratorrechte zum Laufen gebracht wird, aber dennoch genügend leistungsfähig ist.

Für jede Datenbank werden Treiber benötigt. Ein Datenbanktreiber implementiert die Schnittstellen der JDBC-API. Sun veröffentlicht unter http://developers.sun.com/product/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 Derby  downtop

Derby (http://db.apache.org/derby/) ist ein pures Java-RDBMS unter der freien Apache-Lizenz. Die Datenbank geht auf Cloudscape zurückgeht, was IBM Mitte 2004 auf der LinuxWorld in San Francisco der Apache Software Foundation übergeben hat. (1999 übernahm Informix Software Inc. die Datenbank Cloudscape von Cloudscape Inc., doch IBM übernahm die Datenbanktechnologien von Informix im Jahre 2001.) Ein großer Vorteil von Derby sind neben dem geringen Speicherbedarf die Transaktionsunterstützung, Trigger und SQL-Kompatibilität mit DB2.

Download und Vorbereitung

Auf der Download-Seite befinden sich drei Archive, wovon wir eine Datei mit der Endung -bin beziehen (etwa db-derby-10.1.1.0-bin.zip) und auspacken. Wir nehmen zu Testzwecken c:\Programme\derby an, sodass in C:\Programme\derby\frameworks\NetworkServer\bin die Skripte zum Starten und Stoppen des Servers zu finden sein sollten.

Derby lässt sich in zwei Modi fahren: als eingebettetes Datenbanksystem und als Netzwerkserver. Im Fall eines eingebauten Datenbanksystems ist lediglich die Klasse für den eingebetteten Treiber zu laden und die Datenbank zu bestimmen, schon geht’s los:

Class.forName( "org.apache.derby.jdbc.EmbeddedDriver" );
Connection con = DriverManager.getConnection( "jdbc:derby:OpenGeoDB;create=true" );

Wir wollen Derby als Netzwerkserver starten, um mit unterschiedlichen Clients – etwa einem Eclipse-Plugin – auf die Datenbank zugreifen zu können. In diesem Modus horcht Derby über TCP/IP an einem Port (standardmäßig 1527) auf eingehende Verbindungen.

Vor dem Start muss die Umgebungsvariable JAVA_HOME gesetzt sein, und DERBY_INSTALL auf das Installationsverzeichnis zeigen. Zunächst gehen wir in startNetworkServer.bat und setzen dort die nötigen Umgebungsvariablen:

Listing 20.1   startNetworkServer.bat

...
@REM -- This file for use on Windows systems
@REM ---------------------------------------------------------
@echo off
  set JAVA_HOME=C:\Programme\Java\jdk1.5.0
set DERBY_INSTALL=C:\Programme\derby\
  ...

Ebenso setzen wir in startNetworkServer.bat die Umgebungsvariablen passend, da wir den Server auch wieder stoppen wollen.

Server-Start und weitere Tools

Nun lässt sich – etwa mit Doppelklick – das Skript startNetworkServer.bat starten, und die Datenbank quittiert freundlich:

Der Server ist bereitam Port 1527 Verbindungen zu akzeptieren.

Das Programm sysinfo zeigt Versionsnummer und Klassenpfad an. Mit dem interaktiven Werkzeug ij lassen sich SQL-Anweisungen abschicken und so die ersten Versuche mit der Datenbank aufnehmen. dblook extrahiert das Datenbankschema.

JDBC-Treiber

Für einen JDBC-Zugriff ist ein JDBC-Treiber nötig, der bei Derby für eine Client-/Server-Kommunikation nicht dabei ist, denn Derby nutzt die Distributed Relational Database Architecture (DRDA), die auch DB2 verwendet. DRDA ist eine von der Open Group definierte Möglichkeit, von einem Client eine entfernte relationale Datenbank anzusteuern. Auf http://www-128.ibm.com/developerworks/db2/downloads/jcc/ ist die Datei db2jcc_for_derby.zip aufgeführt, die – nach einer Registrierung – auf der nächsten Seite unter »Released product: IBM Cloudscape (IBM DB2 JDBC Universal Driver, for Cloudscape/Derby)« heruntergeladen werden kann. Die beiden Jar-Dateien aus dem Archiv, db2jcc.jar und db2jcc_license_c.jar, sind in den Klassenpfad aufzunehmen. Für den Client-/Server- Modus von Derby benötigen wir keine weiteren Jar-Dateien, insbesondere keine aus dem lib-Verzeichnis von Derby.


Galileo Computing

20.5.2 MySQL  downtop

MySQL (http://www.mysql.de/) 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.

JDBC-Treiber für MySQL: MySQL Connector/J

MySQL kann einfach über den unter der LGPL stehenden Typ-4-JDBC-Treiber MySQL Connector/J bedient werden. Der Treiber liegt unter http://dev.mysql.com/downloads/connector/j/ bereit. Nach dem Entpacken muss das Jar-Archiv des Treibers in den Klassenpfad aufgenommen werden. Er unterstützt die JDBC-3.0-API.


Galileo Computing

20.5.3 Microsoft Access  downtop

Mit Microsoft Access lässt sich mit wenigen Handgriffen eine Datenbank zusammenbauen, die dann anschließend über die JDBC-ODBC-Bridge aus Java zugänglich ist. Viele Anwender haben das Office-Paket von Microsoft zu Hause installiert und so schon eine Datenbank in der Nähe.

Eine einfache Datenbank ist schnell gebaut: 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 die Datenbank unter einem aussagekräftigen Namen. Access benötigen wir nicht mehr direkt, weil die Kommunikation mit der Datenbank anschließend über den ODBC-Manager läuft. Dieser setzt dann auf dem 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.

ODBC einrichten und Access damit verwenden

Eine ODBC- Datenquelle muss bei einer Zentrale angemeldet werden. Dazu gehen wir zunächst in die Systemeinstellungen (Start, Einstellungen, Systemsteuerung) und suchen ab Windows 2000 im Verzeichnis Verwaltung nach dem Symbol Datenquellen (ODBC). Nach dem Start öffnet sich ein Dialog mit dem Titel ODBC-Datenquellen-Administrator.

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 in Java später 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 einige Male 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, sodass wir keine pauschale Antwort geben können. 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.

Die JDBC-ODBC-Brücke implementiert seit Version 1.4 den JDBC 2-Standard.


Galileo Computing

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

Microsoft bietet unter http://www.microsoft.com/sql/downloads/2005/jdbc.mspx einen Typ4 JDBC-Treiber für seinen SQL Server 2000 und SQL Server 2005 an. Der Treiber stammt ursprünglich von der Firma Merant DataDirect. Der Treiber benötigt Java SE 1.4 und ist lauffähig auf den üblichen Betriebssystemen Windows, Linux, Solaris AIX und HP-UX. Er implementiert den zeitgemäßen JDBC 3.0 Standard und lässt sich für Java EE-Applikationen einsetzen.


Galileo Computing

20.5.5 Oracle10g  downtop

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 den Download nicht scheut, der kann unter http://www.oracle.com/technology/software/products/database/oracle10g/index.html die Version für Windows, Mac OS X, Linux und weitere Unix-Systeme herunterladen.


Galileo Computing

20.5.6 Eclipse-Plugins zum Durchschauen von Datenbanken  toptop

Fast genauso viele Eclipse-Plugins zum Administrieren von Datenbanken gibt es wie Datenbanken selbst. Relativ beliebt ist das Open-Source-Plugin QuantumDB (http://quantum.sourceforge.net/) und das Eclipse WTP (http://www.eclipse.org/webtools/).

Eclipse WTP

Nach der Installation vom WTP (wie im Ende Kapitel 1 vorgestellt) öffnen wir den Dialog unter File | New | Other… | Data | SQL Scrapbook Page und geben einen Dateinamen (test) für eine Skriptdatei an.

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

Finish schließt den Dialog, legt eine Datei test.sqlpage an und öffnet diese in einem neuen Editor für SQL-Anweisungen. Zusätzlich aktiviert Eclipse eine neue View Database Explorer. In der View ist unter Connections das Kontextmenü zu bemühen und New Connection… auszuwählen. Im nachfolgenden Dialog ist links bei den Datenbank-Managern Derby 10.0 auszuwählen, als JDBC-driver wählen wir aus der Liste IBM DB2 Universal und als Database tragen wir »OpenGeoDB« ein. Die beiden Java-Archive db2jcc_license_c.jar und db2jcc.jar für den JDBC-Treiber sind unter Browse bei Class location auszuwählen und Benutzername/Passwort setzen wir »user« und »pass«. Mit einem Druck auf die Schaltfläche Test Connection bekommen wir die Information, ob alles gut geht, oder es Probleme mit den Parametern gibt.

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

Finish schließt den Dialog ab, und nach einer erfolgreichen Verbindung sind in der View die Datenbank sowie ihre Schemas zu sehen.

Grundlegende Schemata mit der Scrapbook-Seite aufbauen

In der Scrapbook-Seite wollen wir unsere Datenbank mit Leben füllen. Die Daten und Schemata für das Beispiel stammen von der Open-Source Datenbank OpenGeoDB (http://opengeodb.sourceforge.net/).

Listing 20.2   01_create_tables.sql

-- DROP TABLE geodb_typ;
-- DROP TABLE geodb_adm0;
-- DROP TABLE geodb_adm1;
-- DROP TABLE geodb_locations;
-- DROP TABLE geodb_population;
CREATE TABLE geodb_typ (
  type                 integer not null primary key,
  fld                  varchar(10) not null default '',
  name                 varchar(250) not null default ''
);
INSERT INTO geodb_typ VALUES (1,'adm0','Staat');
INSERT INTO geodb_typ VALUES (2,'adm1','Bundesland / Kanton');
INSERT INTO geodb_typ VALUES (3,'adm2','Regierungsbezirk / Bezirk');
INSERT INTO geodb_typ VALUES (4,'adm3','Landkreis');
INSERT INTO geodb_typ VALUES (5,'adm4','Verwaltungszusammenschluss');
INSERT INTO geodb_typ VALUES (6,'ort','Stadt / Gemeinde');
INSERT INTO geodb_typ VALUES (7,'ortsteil','Orts- / Stadtteil');
INSERT INTO geodb_typ VALUES (8,'gemteil','unspezifizierter Gemeindeteil');
INSERT INTO geodb_typ VALUES (9,'wohnplatz','Wohnplatz');
CREATE TABLE geodb_adm0 (
  adm0                 char(2) NOT NULL default '',
  name                 varchar(50) NOT NULL default '',
  PRIMARY KEY (adm0)
);
INSERT INTO geodb_adm0 VALUES ('DE','Deutschland');
CREATE TABLE geodb_adm1 (
  adm0                 char(2) NOT NULL default '',
  adm1                 char(2) NOT NULL default '',
  gs                   char(2) NOT NULL default '',
  name                 varchar(50) NOT NULL default '',
  PRIMARY KEY (adm0,adm1)
);
INSERT INTO geodb_adm1 VALUES('DE','BB','','Brandenburg');
INSERT INTO geodb_adm1 VALUES('DE','BE','','Berlin');
INSERT INTO geodb_adm1 VALUES('DE','BW','','Baden-Württemberg');
INSERT INTO geodb_adm1 VALUES('DE','BY','','Bayern');
INSERT INTO geodb_adm1 VALUES('DE','HB','','Bremen');
INSERT INTO geodb_adm1 VALUES('DE','HE','','Hessen');
INSERT INTO geodb_adm1 VALUES('DE','HH','','Hamburg');
INSERT INTO geodb_adm1 VALUES('DE','MV','','Mecklenburg-Vorpommern');
INSERT INTO geodb_adm1 VALUES('DE','NI','','Niedersachsen');
INSERT INTO geodb_adm1 VALUES('DE','NW','','Nordrhein-Westfalen');
INSERT INTO geodb_adm1 VALUES('DE','RP','','Rheinland-Pfalz');
INSERT INTO geodb_adm1 VALUES('DE','SH','','Schleswig-Holstein');
INSERT INTO geodb_adm1 VALUES('DE','SL','','Saarland');
INSERT INTO geodb_adm1 VALUES('DE','SN','','Sachsen');
INSERT INTO geodb_adm1 VALUES('DE','ST','','Sachsen-Anhalt');
INSERT INTO geodb_adm1 VALUES('DE','TH','','Thüringen');
CREATE TABLE geodb_locations (
  id                   integer not null primary key,
  typ                  integer default NULL,
  name                 varchar(250) default NULL,
  name_int             varchar(250) default NULL,
  gs                   varchar(8) default NULL,
  adm0                 char(2) default NULL,
  adm1                 char(2) default NULL,
  adm2                 varchar(250) default NULL,
  adm3                 varchar(250) default NULL,
  adm4                 varchar(250) default NULL,
  ort                  varchar(250) default NULL,
  ortsteil             varchar(250) default NULL,
  gemteil              varchar(250) default NULL,
  wohnplatz            varchar(250) default NULL,
  breite               float default NULL,
  laenge               float default NULL,
  kfz                  char(3) default NULL,
  plz                  varchar(250) default NULL
);
CREATE TABLE geodb_population (
  id                   integer not null primary key,
  population_min       integer default NULL,
  population_max       integer default NULL,
  due_date             date default NULL
);

Die rechte Maustaste, im Scrapbook-Editor gedrückt, offenbart im Kontextmenü ein das Skript anstoßendes Run SQL. (Im nachfolgenden Dialog wählen wir Use existing connection.) Das Skript legt nun die Tabellen an und fügt Zeilen ein. Wenn wir unsere Beispiele beendet haben, sollten wir im Database Explorer die Verbindung wieder schließen; dazu ist auf OpenGeoDb im Kontextmenü Disconnect zu wählen.

 << zurück




Copyright © Galileo Press GmbH 2005
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de