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

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 23 Datenbankmanagement mit JDBC
Pfeil 23.1 Das relationale Modell
Pfeil 23.2 Datenbanken und Tools
Pfeil 23.2.1 HSQLDB
Pfeil 23.2.2 Weitere Datenbanken
Pfeil 23.2.3 Eclipse-Plugins zum Durchschauen von Datenbanken
Pfeil 23.3 JDBC und Datenbanktreiber
Pfeil 23.3.1 Treibertypen
Pfeil 23.3.2 JDBC-Versionen
Pfeil 23.4 Eine Beispielabfrage
Pfeil 23.4.1 Schritte zur Datenbankabfrage
Pfeil 23.4.2 Client für HSQLDB-Datenbank
Pfeil 23.5 Mit Java an eine Datenbank andocken
Pfeil 23.5.1 Der Treiber-Manager
Pfeil 23.5.2 Den Treiber laden
Pfeil 23.5.3 Eine Aufzählung aller Treiber
Pfeil 23.5.4 Log-Informationen
Pfeil 23.5.5 Verbindung zur Datenbank auf- und abbauen
Pfeil 23.5.6 DataSource
Pfeil 23.5.7 Gepoolte Verbindungen
Pfeil 23.6 Datenbankabfragen
Pfeil 23.6.1 Abfragen über das Statement-Objekt
Pfeil 23.6.2 Ergebnisse einer Abfrage in ResultSet
Pfeil 23.6.3 Java und SQL-Datentypen
Pfeil 23.6.4 Unicode in der Spalte korrekt auslesen
Pfeil 23.6.5 Eine SQL-NULL und wasNull() bei ResultSet
Pfeil 23.6.6 Wie viele Zeilen hat ein ResultSet?
Pfeil 23.7 Die Ausnahmen bei JDBC
Pfeil 23.8 Elemente einer Datenbank hinzufügen und aktualisieren
Pfeil 23.8.1 Batch-Updates
Pfeil 23.9 ResultSets in Bohnen durch RowSet
Pfeil 23.9.1 Die Schnittstelle RowSet
Pfeil 23.9.2 Implementierungen von RowSet
Pfeil 23.9.3 Der Typ CachedRowSet
Pfeil 23.9.4 Der Typ WebRowSet
Pfeil 23.10 Vorbereitete Anweisungen (Prepared Statements)
Pfeil 23.10.1 PreparedStatement-Objekte vorbereiten
Pfeil 23.10.2 Werte für die Platzhalter eines PreparedStatement
Pfeil 23.11 Transaktionen
Pfeil 23.12 Metadaten
Pfeil 23.12.1 Metadaten über die Tabelle
Pfeil 23.12.2 Informationen über die Datenbank
Pfeil 23.13 Einführung in SQL
Pfeil 23.13.1 Ein Rundgang durch SQL-Abfragen
Pfeil 23.13.2 Datenabfrage mit der Data Query Language (DQL)
Pfeil 23.13.3 Tabellen mit der Data Definition Language (DDL) anlegen
Pfeil 23.14 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

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

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

  • Direkt über den DriverManager: Die Verbindungsdaten stehen im Quellcode (direkt oder sie werden über Konfigurationsdateien bestimmt).
  • Ü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 ü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.*. Im Fall des Namensdienstes sind Klassen/Schnittstellen aus dem Paket javax.naming nötig.


Galileo Computing - Zum Seitenanfang

23.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 Funktion des Treiber-Managers ist getConnection(), mit der wir eine Verbindung zur Datenbank aufbauen können. Es lassen sich aber auch alle angemeldeten Treiber erfragen.


Galileo Computing - Zum Seitenanfang

23.5.2 Den Treiber laden Zur 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 vom Treiberproduzenten vorbereitet – 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 die Funktion Class.forName(), 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 Laufzeit-system ein. Die Funktion 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 23.2 com/tutego/insel/jdbc/DriverManagerDemo.java, Ausschnitt

try 
{ 
  Class.forName( "org.hsqldb.jdbcDriver" ); 
} 
catch ( ClassNotFoundException e ) 
{ 
  // OO! 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 Der JDBC-ODBC-Treiber ist schon initialisiert und muss nicht mit Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); geladen werden.



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



Galileo Computing - Zum Seitenanfang

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

Die statische Funktion getDrivers() der Klasse DriverManager 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 23.3 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

Galileo Computing - Zum Seitenanfang

23.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. Folgende Zeile gibt alle Informationen auf dem Bildschirm aus, die in das Logbuch geschrieben werden:

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

Galileo Computing - Zum Seitenanfang

23.5.5 Verbindung zur Datenbank auf- und abbauen Zur nächsten ÜberschriftZur vorigen Überschrift

Nach dem Laden des Treibers können wir eine Verbindung zur Datenbank mit Hilfe des Connection-Objekts aufbauen, das DriverManager.getConnection() zurückgibt. Der Funktion 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 23.2 Protokolle 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

Die Funktion getConnection() liefert 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 Funktion 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.

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 23.4 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

  • 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 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.

Galileo Computing - Zum Seitenanfang

23.5.6 DataSource Zur nächsten ÜberschriftZur vorigen Überschrift

Die Arbeit mit dem DriverManager sah bisher so aus, dass wir ihn mit der genauen Datenquelle parametrisiert haben. Wir mussten also immer den Namen der Datenbank sowie (optional) den Benutzernamen und das Passwort angeben. Diese feste Verdrahtung im Quellcode ist allerdings nicht so toll, weil Änderungen zwangsläufig zu einer neuen Übersetzung führen (was sich allerdings mit Konfigurationsdateien verändern ließe), doch die Daten stehen auf der Clientseite, wo sie nicht immer gut aufgehoben sind. Besser ist eine zentrale Stelle für die Konfigurationsdaten und auch für die Datenbank. Nehmen wir an, ein Unternehmen rüstet spontan von Oracle auf DB2 um, so müsste ein Clientprogramm an allen Stellen, an denen der Datenbanktreiber geladen und die URL für die Datenbank aufgebaut wird, im Quellcode geändert werden. Das ist unflexibel.

So gibt es in Java eine weitere Möglichkeit, nämlich die Konfigurationsdaten an einer zentralen Stelle zu hinterlegen – und das heißt in Java Zugriff über JNDI. Im zentralen Namensdienst werden Informationen über Treibername, Datenbankname und so weiter als DataSource abgelegt und dann zum nötigen Zeitpunkt erfragt. Wenn sich die Datenbank einmal ändern sollte, muss nur an dieser zentralen Stelle eine Änderung eingespielt werden, und alle, die anschließend den JNDI-Dienst erfragen, bekommen die neue Information.

Die DataSource-Trilogie

Die Verbindung zu einem Datengeber (es muss nicht unbedingt eine Datenbank sein) realisieren Objekte vom Typ DataSource-Objekt. Von der Schnittstelle DataSource gibt es drei unterschiedliche Ausführungen:

1. Ein Standard-DataSource-Objekt. Mindestens das muss ein JDBC-2.0-kompatibler Treiber anbieten.
2. Ein DataSource-Objekt, das gepoolte Datenbankverbindungen zulässt (ConnectionPoolDataSource), sodass eine beendete Verbindung nicht wirklich beendet, sondern nur in einen Pool zur Wiederverwendung gelegt wird. Damit die Verbindung zurückgelegt werden kann, muss die Verbindung einfach nur geschlossen werden – ein Vorgang, der in jedem Programm mit Verbindungen zu finden sein sollte.
3. Ein DataSource-Objekt für verteilte Transaktionen (XADataSource).

Das Schöne daran ist, dass der konkrete Typ verborgen bleiben kann und der Server ohne Änderung des Clients statt einer einfachen DataSource etwa eine ConnectionPoolDataSource in den Namensdienst ablegen kann.

Verbindung über JNDI

Das DataSource-Objekt ist über JNDI zu erfragen. Mit getConnection() wird anschließend das Connection-Objekt besorgt, und wir sind an der gleichen Stelle, an die uns auch der DriverManager führte.

Context ctx = new InitialContext(); 
DataSource ds = (DataSource) ctx.lookup( "jdbc/database" ); 
Connection con = ds.getConnection( "username", "password" );

Das javax.naming.Context-Objekt und dessen Methode lookup() erfragen das mit dem Namen assoziierte Objekt vom Verzeichnisdienst. Vorher muss natürlich irgendjemand dieses Objekt dort abgelegt – auf Neudeutsch »deployed« – haben, doch das sehen wir uns später an. Mit dem Verweis auf das DataSource-Objekt können wir getConnection() aufrufen und Benutzername und Passwort angeben.


interface javax.sql.DataSource

  • Connection getConnection( String username, String password )
    Versucht, unter Angabe des Benutzernamens und Passworts eine Verbindung aufzubauen.
  • Connection getConnection()
    Versucht, eine Verbindung ohne Angabe von Benutzername und Passwort aufzubauen.

Eine DataSource im JNDI-Kontext deployen

Der Administrator ist nun dafür verantwortlich, dass das DataSource-Objekt, also die Beschreibung der Datenbank-Parameter, im Namensdienst eingetragen ist. Im Allgemeinen macht das der Container über eine XML-Beschreibungsdatei oder über eine GUI, sodass kein Programmieraufwand von Hand nötig ist. Wie die JNDI-DataSource im Web-Container Tomcat integriert werden kann, zeigt die Webseite http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html.

Zum Testen wollen wir den einfachen Namensdienst Simple-JNDI (http://www.osjava.org/simple-jndi/) nutzen, der die Daten im Speicher hält und keinen Server startet. Das Java-Archiv simple-jndi.jar von der Webseite muss dafür zusätzlich zum Datenbanktreiber in den Klassenpfad aufgenommen werden. In den Klassenpfad setzen wir auch die Datei jndi.properties, die Java bei Bildung eines Exemplars von InitialContext automatisch lädt.

Listing 23.5 src/jndi.properties

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory 
org.osjava.sj.root=config/

In das Projektverzeichnis legen wir unter einem neuen Verzeichnis config die Datei Tute-goDS.properties. Damit kann Simple-JNDI die Datenquelle automatisch initialisieren.

Listing 23.6 config/TutegoDS.properties

type=javax.sql.DataSource 
driver=org.hsqldb.jdbcDriver 
url=jdbc:hsqldb:file:TutegoDB;shutdown=true 
user=sa 
password=

Wir könnten den Namensdienst zwar dank der Implementierung der JNDI-API auch selbst konfigurieren, aber eine passende Datei macht das automatisch. Auf Grund des Dateinamens legt Simple-JNDI automatisch für uns eine Datenquelle »TutegoDS« im Namenskontext an. Der Zugriff gestaltet sich einfach:

Listing 23.7 com/tutego/insel/jdbc/JdbcWithDS.java

package com.tutego.insel.jdbc; 
 
import java.sql.*; 
import javax.naming.InitialContext; 
import javax.sql.DataSource; 
 
public class JdbcWithDS 
{ 
  public static void main( String[] args ) throws Exception 
  { 
    Connection con = null; 
 
    try 
    { 
      DataSource ds = (DataSource) new InitialContext().lookup( "TutegoDS" ); 
      con = ds.getConnection(); 
      ResultSet rs = con.createStatement().executeQuery( "SELECT * FROM Customer" ); 
 
      while ( rs.next() ) 
        System.out.printf( "%s, %s %s%n", rs.getString( 1 ), rs.getString( 2 ), 
                           rs.getString( 3 ) ); 
    } 
    finally 
    { 
      if ( con != null ) 
        try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); } 
    } 
  } 
}

An diesem Beispiel ist gut abzulesen, dass die Konfiguration nun extern ist. Der Datenbank-treiber muss nun nicht mehr von uns geladen werden, und die Verbindungsdaten sind auch nicht mehr sichtbar.


Hinweis Eine Alternative ist, über die rmiregistry zu gehen, die ebenfalls einen kleinen JNDI-Server enthält. Der Schlüssel für java.naming.factory.initial ist dann com. sun.jndi.rmi.registry.RegistryContextFactory und die java.naming.provider.url entsprechend dem Rechner mit dem Namensdienst, etwa rmi://localhost:1099. Der Server muss nur noch die Datasource aufbauen und in den Namenskontext legen.



Galileo Computing - Zum Seitenanfang

23.5.7 Gepoolte Verbindungen topZur vorigen Überschrift

Da der Auf- und Abbau von Datenbankverbindungen relativ teuer ist, soll eine Java-Applikation die Verbindung nur vordergründig schließen, ein spezieller pooling-fähiger Datenbank-treiber die Verbindung allerdings für die nächste Operation offen halten. Für gepoolte Datenbankverbindungen gibt es eine Reihe quelloffener Implementierungen; zu ihnen zählen Apache Commons DBCP (http://jakarta.apache.org/commons/dbcp/) oder Proxool (http://proxool.sourceforge.net/). DBCP wird direkt von Simple-JNDI unterstützt, sodass wir es an dieser Stelle einsetzen wollen. Dazu sind in den Klassenpfad die – auch auf der Webseite von Simple-JNDI aufgeführten – zusätzlichen Java-Archive commons-collections-3.1.jar, commons-pool-1.3.jar und commons-dbcp-1.2.1.jar in den Klassenpfad mit aufzunehmen. Die Zeile pool=true veranlasst Simple-JNDI, automatisch auf DBCP zurückzugreifen.

Listing 23.8 TutegoDS.properties

type=javax.sql.DataSource 
driver=org.hsqldb.jdbcDriver 
url=jdbc:hsqldb:file:TutegoDB;shutdown=true 
user=sa 
password= 
pool=true


Ihr Kommentar

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






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


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

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




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