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

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
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 Die freie Datenbank MySQL
    gp 20.5.2 JDBC-Treiber für MySQL: MySQL Connector/J
    gp 20.5.3 Die Datenbank Microsoft Access
    gp 20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000
    gp 20.5.5 Die JDBC-ODBC-Bridge
    gp 20.5.6 ODBC einrichten und Access damit verwenden
    gp 20.5.7 Oracle9i Enterprise Edition
    gp 20.5.8 JDBC-Treiber für mobile Endgeräte
  gp 20.6 Eine Beispielabfrage
  gp 20.7 Mit Java an eine Datenbank andocken
    gp 20.7.1 Der Treibermanager
    gp 20.7.2 Eine Aufzählung aller Treiber
    gp 20.7.3 Log-Informationen
    gp 20.7.4 Den Treiber laden
    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
  gp 20.17 Java Data Objects (JDO)
  gp 20.18 XML-Datenbanken
    gp 20.18.1 Apache Xindice
    gp 20.18.2 eXist und Weitere


Galileo Computing

20.11 Elemente einer Datenbank hinzufügen und aktualisieredowntop

Aus einer geglückten Datenbankverbindung mit DriverManager.getConnection() lassen sich SQL-Befehle wie INSERT, UPDATE oder DELETE verwenden. Bisher haben wir executeQuery() benutzt, um Abfragen zu verfassen. Es lassen sich jedoch auch Einfüge-Operationen vornehmen, denn Tabelleninhalte bleiben nicht unveränderlich.

Das SQL-Kommando INSERT dient dem Einfügen und UPDATE dem Aktualisieren von Daten. Damit Spalten verändert werden können, müssen wir in zwei Schritten vorgehen: eine SQL-Anweisung mit einem UPDATE aufbauen und anschließend executeUpdate() aufrufen. Damit wird die Änderung wirksam. Dies ist eine andere Statement-Methode, bisher kannten wir nur executeQuery(). Neben den Methodennamen gibt es aber noch einen anderen Unterschied. executeUpdate() liefert als Rückgabewert ein int, welcher angibt, wie viele Zeilen von der Änderung betroffen sind.


Beispiel   Folgende SQL-Anweisung ändert die Adresse eines Lieferanten:

String updateString = "UPDATE Lieferanten SET Adresse =
  ’Uferstraße 80’ WHERE Adresse LIKE ’Uferstrasse 78’";
stmt.executeUpdate( updateString );

Die Methode gibt uns immer zurück, wie viele Zeilen von den Änderungen betroffen sind. Sie ist null, falls das SQL-Statement nichts bewirkt.



interface java.sql.  Statement  

gp  int executeUpdate( String sql ) throws SQLException
Führt eine SQL-Anweisung aus, die Manipulationen an der Datenbank vornimmt. Die SQL-Anweisungen sind in der Regel INSERT-, UPDATE- oder DELETE-Anweisungen. Zurückgegeben wird die Anzahl der veränderten Zeilen: null, falls eine SQL-Anweisung nichts verändert hat.

Galileo Computing

20.11.1 Batch-Updates  toptop

Das Einfügen und Ändern großer Mengen von Daten kostet viel Zeit, da für jede Modifikation ein INSERT oder UPDATE über ein Statement-Objekt abgewickelt werden muss. Eine Verbesserung stellen Batch-Updates dar, die in einem Rutsch gleich eine ganze Reihe von Daten zur Datenbank transferieren. Anstatt mit execute() und deren Varianten zu arbeiten, nutzen wir die Methode executeBatch(). Damit zuvor die einzelnen Aktionen dem Statement-Objekt mitgeteilt werden können, bietet die Klasse die Methoden addBatch() und clearBatch() an. Die Datenbank führt die Anweisungen in der Reihenfolge aus, wie sie im Batch-Prozess eingefügt wurden. Ein Fehler wird über eine BatchUpdate Exception angezeigt.


Beispiel   Wir fügen einige Einträge der Datenbank als Batch hinzu. con sei unser Connection-Objekt.

int updateCounts[] = null;

try
{
  Statement s = con.createStatement();
  s.addBatch( "INSERT INTO Lieferanten VALUES (x,y,z)" );
  s.addBatch( "INSERT INTO Lieferanten VALUES (a,b,c)" );
  s.addBatch( "INSERT INTO Lieferanten VALUES (d,e,f)" );

  updateCounts = s.executeBatch();
}
catch ( BatchUpdateException e ) { }
catch ( SQLException e ) { }

Nach dem Abarbeiten von executeBatch() erhalten wir als Rückgabewert ein int-Feld mit den Ergebnissen der Ausführung. Dies liegt daran, dass in der Batch-Verarbeitung ganz unterschiedliche Anweisungen vorgenommen werden können und jede davon einen unterschiedlichen Rückgabewert verwendet.

Soll der gesamte Ablauf als Transaktion gewürdigt werden, so setzen wir im try-Block den AutoCommit-Modus auf false, damit nicht jede SQL-Anweisung als einzelne Transaktion gewertet wird. Im Fall eines Fehlers müssen wir im catch-Block ein Rollback ausführen. Übertragen wir dies auf das obere Beispiel, dann müssen nur die beiden Anweisungen für die Transaktion eingesetzt werden.


try
{
  con.setAutoCommit( false );

  Statement s .....
  ...
}


catch ( BatchUpdateException e )
{
  con.rollback();
}




Copyright © Galileo Press GmbH 2004
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, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de