20.11 Elemente einer Datenbank hinzufügen und aktualisieren
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
|
|
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. |
20.11.1 Batch-Updates
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();
}
|