Java SE 8 Standard-Bibliothek  
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis

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

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 21 Datenbankmanagement mit JDBC
Pfeil 21.1 Relationale Datenbanken
Pfeil 21.1.1 Das relationale Modell
Pfeil 21.2 Datenbanken und Tools
Pfeil 21.2.1 HSQLDB
Pfeil 21.2.2 Weitere Datenbanken *
Pfeil 21.2.3 Eclipse Data Tools Platform (DTP) zum Durchschauen von Datenbanken
Pfeil 21.3 JDBC und Datenbanktreiber
Pfeil 21.3.1 Treibertypen *
Pfeil 21.3.2 JDBC-Versionen *
Pfeil 21.4 Eine Beispielabfrage
Pfeil 21.4.1 Schritte zur Datenbankabfrage
Pfeil 21.4.2 Ein Client für die HSQLDB-Datenbank
Pfeil 21.5 Mit Java an eine Datenbank andocken
Pfeil 21.5.1 Der Treiber-Manager *
Pfeil 21.5.2 Den Treiber laden
Pfeil 21.5.3 Eine Aufzählung aller Treiber *
Pfeil 21.5.4 Log-Informationen *
Pfeil 21.5.5 Verbindung zur Datenbank auf- und abbauen
Pfeil 21.6 Datenbankabfragen
Pfeil 21.6.1 Abfragen über das Statement-Objekt
Pfeil 21.6.2 Ergebnisse einer Abfrage in ResultSet
Pfeil 21.6.3 Java und SQL-Datentypen
Pfeil 21.6.4 Date, Time und Timestamp
Pfeil 21.6.5 Unicode in der Spalte korrekt auslesen
Pfeil 21.6.6 Eine SQL-NULL und wasNull() bei ResultSet
Pfeil 21.6.7 Wie viele Zeilen hat ein ResultSet? *
Pfeil 21.7 Elemente einer Datenbank ändern
Pfeil 21.7.1 Einzelne INSERT-, UPDATE- oder DELETE-Anweisungen senden
Pfeil 21.7.2 Aktualisierbares ResultSet
Pfeil 21.7.3 Batch-Updates
Pfeil 21.8 Die Ausnahmen bei JDBC, SQLException und Unterklassen
Pfeil 21.8.1 JDBC-Fehlerbasisklasse SQLException
Pfeil 21.8.2 SQLWarning
Pfeil 21.9 ResultSet und RowSet *
Pfeil 21.9.1 Die Schnittstelle RowSet
Pfeil 21.9.2 Implementierungen von RowSet
Pfeil 21.9.3 Der Typ CachedRowSet
Pfeil 21.9.4 Der Typ WebRowSet
Pfeil 21.10 Vorbereitete Anweisungen (Prepared Statements)
Pfeil 21.10.1 PreparedStatement-Objekte vorbereiten
Pfeil 21.10.2 Werte für die Platzhalter eines PreparedStatement
Pfeil 21.11 Transaktionen
Pfeil 21.13 Vorbereitete Datenbankverbindungen
Pfeil 21.13.1 DataSource
Pfeil 21.13.2 Gepoolte Datenbankverbindungen
Pfeil 21.14 Zum Weiterlesen
 
Zum Seitenanfang

21.5Mit Java an eine Datenbank andocken Zur vorigen ÜberschriftZur nächsten Überschrift

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

  • Direkt über denDriverManager: 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.

 
Zum Seitenanfang

21.5.1Der Treiber-Manager * Zur vorigen ÜberschriftZur nächsten Ü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.

 
Zum Seitenanfang

21.5.2Den Treiber laden Zur vorigen ÜberschriftZur nächsten Ü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

Treiberklassen können im Prinzip – soweit das vom Treiberproduzenten vorbereitet ist – automatisch geladen werden. 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. Bei unserer HSQLDB kann das Class.forName(…) daher entfallen.

Ist das automatische Laden der Treiberklasse nicht vorbereitet, muss sie von Hand eingebunden werden. 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 21.2com/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(String) löst eine ClassNotFoundException aus, falls die Klasse nicht gefunden wurde, der Treiber also nicht geladen werden konnte.

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

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

 
Zum Seitenanfang

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

Die statische Methode DriverManager.getDrivers() liefert eine Enumeration<Driver> 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:

for ( Driver driver : Collections.list( DriverManager.getDrivers() ) )
System.out.println( driver.getClass().getName() );

Die Elemente, die durch die Enumeration ausgelesen werden, sind Treiberobjekte vom Typ Driver. Jeder Datenbanktreiber implementiert diese Schnittstelle. Mit dem Treiber für HSQLDB im Klassenpfad ist die Ausgabe:

org.hsqldb.jdbc.JDBCDriver

Vor Java 8 tauchte auch der Standard-JDBC-ODBC-Treiber auf.

 
Zum Seitenanfang

21.5.4Log-Informationen * Zur vorigen ÜberschriftZur nächsten Ü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(PrintWriter):

DriverManager.setLogWriter( new PrintWriter( System.out ) );

Nicht nur Treiber und SQL-Klassen nutzen den Log-Stream, auch wir können Zeichenketten ausgeben. Dazu dient die statische Methode println(String), die als Parameter nur einen Zeichenfolge annimmt. println(String) 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.

 
Zum Seitenanfang

21.5.5Verbindung zur Datenbank auf- und abbauen Zur vorigen ÜberschriftZur nächsten Ü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:

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

MS SQL-Server

sqlserver

jdbc:sqlserver://localhost;integratedSecurity=true;

Tabelle 21.3Protokoll-URLs einiger Datenbanken

Verbindung aufnehmen

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

[zB]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.

Klassendiagramm für DriverManager

Abbildung 21.4Klassendiagramm für DriverManager

Verbindung beenden

Eine offene Verbindung ist nach der Nutzung immer zu schließen. Daher ist der Aufruf der close()-Methode vom Connection-Objekt zwingend. Am besten wird der Aufbau der Verbindung gleich in einen try mit Ressourcen-Block gesetzt, denn Connection implementiert AutoCloseable:

Listing 21.3com/tutego/insel/jdbc/FirstSqlAccess.java, Ausschnitt

try ( Connection con = DriverManager.getConnection( … ); … ) {

}
catch ( SQLException e ) {

}
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(int), 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").

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018. Original - https://www.rheinwerk-verlag.de/openbook/
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.

 

 
 


21.12.2024 - Sitemap.xml