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

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 16 Datenbankmanagement mit JDBC
Pfeil 16.1 Relationale Datenbanken
Pfeil 16.1.1 Das relationale Modell
Pfeil 16.2 Datenbanken und Tools
Pfeil 16.2.1 HSQLDB
Pfeil 16.2.2 Weitere Datenbanken *
Pfeil 16.2.3 Eclipse-Plugins zum Durchschauen von Datenbanken
Pfeil 16.3 JDBC und Datenbanktreiber
Pfeil 16.3.1 Treibertypen *
Pfeil 16.3.2 JDBC-Versionen *
Pfeil 16.4 Eine Beispielabfrage
Pfeil 16.4.1 Schritte zur Datenbankabfrage
Pfeil 16.4.2 Ein Client für die HSQLDB-Datenbank
Pfeil 16.4.3 Datenbankbrowser und eine Beispielabfrage unter NetBeans
Pfeil 16.5 Mit Java an eine Datenbank andocken
Pfeil 16.5.1 Der Treiber-Manager *
Pfeil 16.5.2 Den Treiber laden
Pfeil 16.5.3 Eine Aufzählung aller Treiber *
Pfeil 16.5.4 Log-Informationen *
Pfeil 16.5.5 Verbindung zur Datenbank auf- und abbauen
Pfeil 16.6 Datenbankabfragen
Pfeil 16.6.1 Abfragen über das Statement-Objekt
Pfeil 16.6.2 Ergebnisse einer Abfrage in ResultSet
Pfeil 16.6.3 Java und SQL-Datentypen
Pfeil 16.6.4 Date, Time und Timestamp
Pfeil 16.6.5 Unicode in der Spalte korrekt auslesen
Pfeil 16.6.6 Eine SQL-NULL und wasNull() bei ResultSet
Pfeil 16.6.7 Wie viele Zeilen hat ein ResultSet? *
Pfeil 16.7 Elemente einer Datenbank hinzufügen und aktualisieren
Pfeil 16.7.1 Batch-Updates
Pfeil 16.7.2 Die Ausnahmen bei JDBC, SQLException und Unterklassen
Pfeil 16.8 ResultSet und RowSet *
Pfeil 16.8.1 Die Schnittstelle RowSet
Pfeil 16.8.2 Implementierungen von RowSet
Pfeil 16.8.3 Der Typ CachedRowSet
Pfeil 16.8.4 Der Typ WebRowSet
Pfeil 16.9 Vorbereitete Anweisungen (Prepared Statements)
Pfeil 16.9.1 PreparedStatement-Objekte vorbereiten
Pfeil 16.9.2 Werte für die Platzhalter eines PreparedStatement
Pfeil 16.10 Transaktionen
Pfeil 16.11 Metadaten *
Pfeil 16.11.1 Metadaten über die Tabelle
Pfeil 16.11.2 Informationen über die Datenbank
Pfeil 16.12 Vorbereitete Datenbankverbindungen
Pfeil 16.12.1 DataSource
Pfeil 16.12.2 Gepoolte Verbindungen
Pfeil 16.13 JPA-Beispiel mit der NetBeans-IDE
Pfeil 16.13.1 Entity-Beans generieren
Pfeil 16.13.2 Die Quellen im Überblick
Pfeil 16.13.3 Persistence Unit
Pfeil 16.13.4 Ein JPA-Beispielprogramm
Pfeil 16.14 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

16.5 Mit Java an eine Datenbank andockenZur nächsten Überschrift

Zum Aufbau einer Datenbankverbindung und zur Herstellung einer Connection gibt es zwei Möglichkeiten:

  • Direkt über den DriverManager: Die Verbindungsdaten stehen im Quellcode (entweder direkt, oder sie werden über Konfigurationsdateien bestimmt). Diesen Weg zeigte das Beispiel bisher.
  • Über einen zentralen Namensdienst: Im JNDI ist eine vorkonfigurierte Datenquelle (DataSource) abgelegt, die wir entnehmen und über die wir eine Verbindung aufbauen.

Im Java-Enterprise-Bereich ist das übliche Vorgehen der zweite Weg über eine DataSource. Wir wollen uns doch zunächst mit dem DriverManager beschäftigen, bevor wir zur DataSource und zum JNDI kommen.

Alle verwendeten Klassen und Schnittstellen für den Datenbankteil liegen unter java.sql.*. Wenn wir mit einem Namensdienst arbeiten, sind Typen aus dem Paket javax.naming nötig.


Rheinwerk Computing - Zum Seitenanfang

16.5.1 Der Treiber-Manager *Zur nächsten ÜberschriftZur vorigen Überschrift

Alle Datenbanktreiber werden an einer zentralen Stelle, dem Treiber-Manager, gesammelt. Die Zentrale ist in Java durch die Klasse DriverManager gegeben. Die Methoden der Klasse sind statisch, da sich ein Exemplar dieser Klasse nicht erzeugen lässt; der Konstruktor ist privat. Die wichtigste Methode des Treiber-Managers ist statisch und heißt getConnection(). Mit ihr können wir eine Verbindung zur Datenbank aufbauen. Es lassen sich aber auch alle angemeldeten Treiber erfragen.


Rheinwerk Computing - Zum Seitenanfang

16.5.2 Den Treiber ladenZur nächsten ÜberschriftZur vorigen Überschrift

Vor der Ausführung der JDBC-Befehle muss ein passender Datenbanktreiber geladen werden. Der Datenbanktreiber ist eine Java-Klasse, die beim Treiber-Manager angemeldet sein muss.

Hinweis

Seit Java 6 werden die Treiberklassen – soweit das vom Treiberproduzenten vorbereitet ist – automatisch geladen. Der Entwickler muss den Namen der Treiberklassen nicht mehr kennen. Intern funktioniert das über Service Provider. Für eigene automatisch zu ladende Klassen ist java.util.ServiceLoader einen Blick wert.

Vor Java 6 und bei nicht vorbereiteten Datenbanken ist die Treiberklasse von Hand einzubinden. Zwei Möglichkeiten sind populär:

  • Die Property jdbc.drivers enthält den Namen des Datenbanktreibers. Auf der Kommandozeile lässt sich die Variable mit dem Schalter -D einfach setzen:
  • $ java -Djdbc.drivers=org.hsqldb.jdbcDriver <Javaklasse>

  • Die zweite Möglichkeit bietet der Aufruf von Class.forName(driverclassname), die eine Treiberklasse lädt. Sie trägt sich automatisch beim Treiber-Manager ein.
final class java.lang.Class<T>
implements Serializable, GenericDeclaration, Type, AnnotatedElement
  • static Class forName(String className) throws ClassNotFoundException
    Sucht, lädt und bindet die Klasse mit dem qualifizierten Namen className ins Laufzeitsystem ein. Die statische Methode liefert ein Class-Objekt zurück, falls sie die Klasse laden kann, andernfalls quittiert sie einen Fehler mit einer ClassNotFoundException.

Die Programmzeilen für das manuelle Laden der Klasse org.hsqldb.jdbcDriver sind somit:

Listing 16.3: com/tutego/insel/jdbc/DriverManagerDemo.java, Ausschnitt

try
{
Class.forName( "org.hsqldb.jdbcDriver" );
}
catch ( ClassNotFoundException e )
{
// Blöd: Treiber konnte nicht geladen werden.
e.printStackTrace();
}

Da wir die Klasse nur laden, aber die Referenz auf den Klassen-Deskriptor nicht benötigen, belassen wir es bei einem Aufruf und beachten den Rückgabewert nicht. Diese Class.forName() löst eine ClassNotFoundException aus, falls die Klasse nicht gefunden wurde, der Treiber also nicht geladen werden konnte.

Hinweis

Ein Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ist zum Laden des JDBC-ODBC-Treibers nicht nötig, da er schon initialisiert ist.

Tabelle 16.2: Übersicht der jeweiligen voll qualifizierten Klassennamen für den JDBC-Treiber

Datenbank Klassenname für den JDBC-Treiber

Adabas D

de.sag.jdbc.adabasd.Adriver

Borland JDataStore

com.borland.datastore.jdbc.DataStoreDriver

Borland Interbase

interbase.interclient.Driver

DB2/Derby

com.ibm.db2.jcc.DB2Driver

Informix

com.informix.jdbc.IfxDriver

IDS Server

ids.sql.IDSDriver

Microsoft SQL Server

com.microsoft.jdbc.sqlserver.SQLServerDriver

mSQL

COM.imaginary.sql.msql.MsqlDriver

MySQL

com.mysql.jdbc.Driver

Oracle

oracle.jdbc.driver.OracleDriver

Pointbase

com.pointbase.jdbc.jdbcUniversalDriver

PostgreSQL

org.postgresql.Driver

Sybase

com.sybase.jdbc2.jdbc.SybDriver


Rheinwerk Computing - Zum Seitenanfang

16.5.3 Eine Aufzählung aller Treiber *Zur nächsten ÜberschriftZur vorigen Überschrift

Die statische Methode DriverManager.getDrivers() liefert eine Aufzählung der angemeldeten Treiber. Die folgenden Zeilen geben einfach den Klassennamen aus – die Treiber implementieren nicht unbedingt eine sinnvolle toString()-Methode, sodass wir uns mit dem Klassennamen begnügen:

Listing 16.4: com/tutego/insel/jdbc/DriverManagerDemo.java, Ausschnitt

for ( Enumeration<Driver> e = DriverManager.getDrivers(); e.hasMoreElements(); )
System.out.println( e.nextElement().getClass().getName() );

Die Elemente, die durch die Enumeration ausgelesen werden, sind Treiberobjekte vom Typ Driver. Jeder Datenbanktreiber implementiert diese Schnittstelle. Mit dem manuell geladenen Treiber org.hsqldb.jdbcDriver und dem Standard-JDBC-ODBC-Treiber verbunden ist die Ausgabe:

sun.jdbc.odbc.JdbcOdbcDriver
org.hsqldb.jdbcDriver

Rheinwerk Computing - Zum Seitenanfang

16.5.4 Log-Informationen *Zur nächsten ÜberschriftZur vorigen Überschrift

Zu Testzwecken bietet es sich an, Informationen des Treibers und der Datenbank in einen speziellen Ausgabekanal zu schreiben. Wir können die Log-Informationen so umlenken, dass sie in den Standardausgabestrom geschrieben werden. Das macht die statische Methode setLogWriter(), die einen PrintWriter als Parameter erwartet:

Listing 16.5: com/tutego/insel/jdbc/DriverManagerDemo.java, Ausschnitt

DriverManager.setLogWriter( new PrintWriter( System.out ) );
Class.forName( "org.hsqldb.jdbcDriver" );

Da damit die Log-Ausgaben in den Standard-Ausgabekanal kommen, ist die Ausgabe für das Laden des HSQLDB-Treibers:

JdbcOdbcDriver class loaded
registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.Zeilenumbruch
JdbcOdbcDriver@173a10f]
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
registerDriver: driver[className=org.hsqldb.jdbcDriver,org.hsqldb.jdbcDriver@530daa]

Nicht nur Treiber und SQL-Klassen nutzen den Log-Stream, auch wir können Zeichenketten ausgeben. Dazu dient die statische Methode println(), die als Parameter nur einen String annimmt. println() ist so implementiert, dass bei einem nicht gesetzten Log-Stream die Ausgabe unterbleibt.

class java.sql.DriverManager
  • static void setLogWriter(PrintWriter out)
    Setzt den Log-Writer und startet damit das Logging. Mit dem Argument null wird das Logging wieder ausgeschaltet.
  • static PrintWriter getLogWriter()
    Liefert den angemeldeten Log-Writer.
  • static void println(String message)
    Schreibt eine Meldung in den Log-Stream.

Rheinwerk Computing - Zum Seitenanfang

16.5.5 Verbindung zur Datenbank auf- und abbauenZur nächsten ÜberschriftZur vorigen Überschrift

Nach dem Laden des Treibers können wir eine Verbindung zur Datenbank mithilfe des Connection-Objekts aufbauen, das DriverManager.getConnection() zurückgibt. Der Methode wird eine Datenbank-URL mitgegeben und optional Benutzername und Passwort.

Die Datenquelle angeben

Alle Datenquellen sind durch eine besondere URL qualifiziert, die folgendes Format besitzt:

jdbc:Subprotokoll:Datenquellenname

Die Datenbank definieren jeweils unterschiedliche Subprotokolle, und die Angabe des Servernamens ist auch immer individuell:

Tabelle 16.3: Protokoll-URLs einiger Datenbanken

Datenbank Subprotokoll Beispiel

Derby

derby:net

jdbc:derby:net://host:1527/

IBM DB2

db2

jdbc:db2://database

HSQLDB

hsqldb

jdbc:hsqldb:file:database

Interbase

interbase

jdbc:interbase://host/dabase.gdb

MySQL

Mysql

jdbc:mysql://host/database

ODBC-Datenquellen

Odbc

jdbc:odbc:database

Oracle Thin

oracle:thin

jdbc:oracle:thin:@host:1243:database

Sybase

sybase:Tds

jdbc:sybase:Tds:host:1234/database

Verbindung aufnehmen

Der Aufruf von DriverManager.getConnection() liefert – wenn alles gut geht – ein Connection-Objekt, das die Verbindung mit der Datenbank repräsentiert.

Beispiel

Verbinde mit einer Datenbank, die den Namen »TutegoDB« trägt (im Fall von ODBC wurde der Name im Datenquellen-Administrator festgelegt und hat nichts mit dem Dateinamen zu tun):

con = DriverManager.getConnection( "jdbc:hsqldb:file:TutegoDB;shutdown=true",
"sa", "" );

Die statische Methode getConnection() erwartet bis zu drei Parameter: Die URL der Datenbank, zu der die Verbindung aufgenommen werden soll, ist der Pflichtparameter. Der Anmeldename und das Passwort sind optional und können auch leere Strings ("") sein, wenn eine Authentifizierung keine Rolle spielt.

Meldet getConnection() keinen Fehler, so liefert sie uns eine geöffnete Datenbankverbindung.

class java.sql.DriverManager
  • static Connection getConnection(String url) throws SQLException
    Versucht, eine Verbindung zur Datenbank aufzubauen. Die Klasse DriverManager sucht dabei einen passenden Treiber aus der Liste der registrierten JDBC-Treiber für die Datenbank.
  • static Connection getConnection(String url, String user, String password)
    throws SQLException
    Versucht, eine Verbindung zur Datenbank aufzubauen. user und password werden für die Verbindung zur Datenbank verwendet.
  • static Connection getConnection(String url, Properties info)
    throws SQLException
    Versucht, eine Verbindung zur Datenbank aufzubauen. Im Properties-Objekt können die Felder user und password sowie weitere Informationen vorhanden sein.

Abbildung

Abbildung 16.15: Klassendiagramm für DriverManager

Verbindung beenden

Da eine Verbindung zu schließen ist (und nicht der DriverManager), finden wir eine Methode close() beim Connection-Objekt. Verbindungen zu schließen ist immens wichtig, sodass dieser Teil im Allgemeinen im finally-Block steht:

Listing 16.6: com/tutego/insel/jdbc/FirstSqlAccess.java, Ausschnitt

Connection con = null;

try
{
con = DriverManager.getConnection( ... );
...
}
catch ( SQLException e )
{
e.printStackTrace();
}
finally
{

if ( con != null )
try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); }
}

interface java.sql.Connection
extends Wrapper, AutoCloseable
  • void close() throws SQLException
    Schließt die Verbindung zur Datenbank. Auch hier kann eine SQLException auftauchen.

Wartezeit einstellen

Wenn wir uns mit der Datenbank verbinden, lässt sich noch eine Wartezeit in Sekunden einstellen, die angibt, wie lange der Treiber für die Verbindung mit der Datenbank warten darf. Gesetzt wird dieser Wert mit setLoginTimeout(), und entsprechend wird er mit getLoginTimeout() ausgelesen. Standardmäßig ist dieser Wert 0.

class java.sql.DriverManager
  • static void setLoginTimeout(int seconds)
    Setzt die Zeit, die maximal gewartet wird, wenn der Treiber sich mit einer Datenbank verbindet.
  • static int getLoginTimeout()
    Liefert die Wartezeit in Sekunden.

Wie der Treiber gefunden wird – hinter den Kulissen von getConnection() *

Es lohnt sich, einmal hinter die Kulissen der Methode getConnection() zu blicken. Das DriverManager-Objekt wird veranlasst, die Verbindung zu öffnen. Dabei versucht es, einen passenden Treiber aus der Liste der JDBC-Treiber auszuwählen. Sein Treiber verwaltet die Klasse DriverManager in einem privaten Objekt DriverInfo. Dieses enthält ein Treiber-Objekt (Driver), ein Objekt (securityContext) und den Klassennamen (className).

Bei getConnection() geht der DriverManager die Liste der DriverInfo-Objekte ab und versucht, sich über die connect()-Methode anzumelden. Bemerkt der Treiber, dass er mit der URL nicht viel anfangen kann, gibt er null zurück, und getConnection() versucht es mit dem nächsten Treiber. Ging alles daneben und konnte keiner der angemeldeten Treiber etwas mit dem Subprotokoll anfangen, so bekommen wir eine SQLException("No suitable driver", "08001").



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Neuauflage: Java SE 8 Standard-Bibliothek
Neuauflage: Java SE 8 Standard-Bibliothek
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Einstieg in Eclipse






 Einstieg in Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das 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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de