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
Download: - openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Java 7 - Mehr als eine Insel | vor >>
Java 7 - Mehr als eine Insel von Christian Ullenboom Das Handbuch zu den Java SE-Bibliotheken
Java 7 - Mehr als eine Insel Galileo Computing 1433 S., 2012, geb. 49,90 Euro, ISBN 978-3-8362-1507-7 |
| 16 Datenbankmanagement mit JDBC
|  | 16.1 Relationale Datenbanken
|  |  | 16.1.1 Das relationale Modell
|  | 16.2 Datenbanken und Tools
|  |  | 16.2.1 HSQLDB
|  |  | 16.2.2 Weitere Datenbanken *
|  |  | 16.2.3 Eclipse-Plugins zum Durchschauen von Datenbanken
|  | 16.3 JDBC und Datenbanktreiber
|  |  | 16.3.1 Treibertypen *
|  |  | 16.3.2 JDBC-Versionen *
|  | 16.4 Eine Beispielabfrage
|  |  | 16.4.1 Schritte zur Datenbankabfrage
|  |  | 16.4.2 Ein Client für die HSQLDB-Datenbank
|  |  | 16.4.3 Datenbankbrowser und eine Beispielabfrage unter NetBeans
|  | 16.5 Mit Java an eine Datenbank andocken
|  |  | 16.5.1 Der Treiber-Manager *
|  |  | 16.5.2 Den Treiber laden
|  |  | 16.5.3 Eine Aufzählung aller Treiber *
|  |  | 16.5.4 Log-Informationen *
|  |  | 16.5.5 Verbindung zur Datenbank auf- und abbauen
|  | 16.6 Datenbankabfragen
|  |  | 16.6.1 Abfragen über das Statement-Objekt
|  |  | 16.6.2 Ergebnisse einer Abfrage in ResultSet
|  |  | 16.6.3 Java und SQL-Datentypen
|  |  | 16.6.4 Date, Time und Timestamp
|  |  | 16.6.5 Unicode in der Spalte korrekt auslesen
|  |  | 16.6.6 Eine SQL-NULL und wasNull() bei ResultSet
|  |  | 16.6.7 Wie viele Zeilen hat ein ResultSet? *
|  | 16.7 Elemente einer Datenbank hinzufügen und aktualisieren
|  |  | 16.7.1 Batch-Updates
|  |  | 16.7.2 Die Ausnahmen bei JDBC, SQLException und Unterklassen
|  | 16.8 ResultSet und RowSet *
|  |  | 16.8.1 Die Schnittstelle RowSet
|  |  | 16.8.2 Implementierungen von RowSet
|  |  | 16.8.3 Der Typ CachedRowSet
|  |  | 16.8.4 Der Typ WebRowSet
|  | 16.9 Vorbereitete Anweisungen (Prepared Statements)
|  |  | 16.9.1 PreparedStatement-Objekte vorbereiten
|  |  | 16.9.2 Werte für die Platzhalter eines PreparedStatement
|  | 16.10 Transaktionen
|  | 16.11 Metadaten *
|  |  | 16.11.1 Metadaten über die Tabelle
|  |  | 16.11.2 Informationen über die Datenbank
|  | 16.12 Vorbereitete Datenbankverbindungen
|  |  | 16.12.1 DataSource
|  |  | 16.12.2 Gepoolte Verbindungen
|  | 16.13 JPA-Beispiel mit der NetBeans-IDE
|  |  | 16.13.1 Entity-Beans generieren
|  |  | 16.13.2 Die Quellen im Überblick
|  |  | 16.13.3 Persistence Unit
|  |  | 16.13.4 Ein JPA-Beispielprogramm
|  | 16.14 Zum Weiterlesen
## 16.5 Mit Java an eine Datenbank andocken 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. ### 16.5.1 Der Treiber-Manager * 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. ### 16.5.2 Den Treiber laden 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
### 16.5.3 Eine Aufzählung aller Treiber * 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
### 16.5.4 Log-Informationen * 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.
    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. ### 16.5.5 Verbindung zur Datenbank auf- und abbauen 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 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 | <top> | vor >>
Zum Katalog
Java 7 – Mehr als eine Insel Jetzt bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchempfehlungen
| Java und XML
| Einstieg in Eclipse 3.7
| Android 3
| NetBeans Platform 7
| Java ist auch eine Insel
| Apps entwickeln für Android 4
| Java 7
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 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.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de