Aktualisierungen einzelner Datenbankobjekte im Stapelbetrieb mit der Methode updateMany() der Schnittstelle Data

Sie können mit der Methode updateMany() der Schnittstelle Data mehrere Aktualisierungen eines Datenbankobjekts ausführen.

Beschreibung

In der Schnittstelle Data zeigt die Methode updateMany() an, dass eine Anweisung mehrmals ausgeführt werden soll.

Obwohl Ihr Code eine einzelne DML-Anweisung (DML - Data Manipulation Language) mehrfach ausführen kann, wobei die Methode update() mit derselben SQL-Anweisung aufgerufen wird und jeweils verschiedene Parameter übergeben werden, ist die Verwendung der Methode updateMany() in der Regel effizienter.

Die Methode updateMany() ermöglicht das Übergeben einer Objektgruppe oder eines Stapels von Daten, den oder die Sie durchlaufen können. Beispielsweise können Sie mit der Methode update() folgende SQL-Anweisung ausführen:
INSERT INTO HR.EMPLOYEE VALUES(:id, :lastName, :firstName, :dept, :location);
Sie würden Werte in die SQL-Anweisung übergeben, und zwar durch Verwendung einer Bean, etwa mit dem Namen Employee, oder einem Objekt Map. Mit der Methode updateMany() könnten Sie dieselbe SQL-Anweisung verwenden. Sie würden Werte allerdings über ein Objekt Iterable desselben Typs wie die Bean oder eines Objekts Map übergeben.

Das zurückgegebene Array int zeigt, wie in JDBC, das Gelingen (und der entsprechende Aktualisierungszähler) oder das Fehlschlagen jeder Ausführung der SQL-Anweisung an. Hierzu gehört auch die Verwendung der JDBC-Aktualisierungsangaben Statement.EXECUTE_FAILED und SUCCESS_NO_INFO.

Wenn Fehler auftreten, tritt eine Ausnahmebedingung com.ibm.pdq.runtime.exception.UpdateManyException ein. Diese Laufzeitausnahmebedingung enthält Informationen, die JDBC in seiner Ausnahmebedingung java.sql.BatchUpdateException auflistet.

Wenn Sie einen Stapel von CALL-Anweisungen von SQL ausführen wollen, können Sie die Methode updateMany() nur dann verwenden, wenn Ihre gespeicherte Prozedur keine Parameter OUT oder INOUT hat und keine Abfrageergebnisse zurückgibt.

Beispiel

Angenommen, ein Unternehmen A kauft Unternehmen B und muss dessen Mitarbeiter der Tabelle HRDept.Employee hinzufügen. Die Klasse, die Unternehmen A zur Darstellung dieser Tabelle verwendet, ist wie folgt definiert:

public EmplData {
  public String empId;
  public String firstName;
  public String middleName;
  public String lastName;
  public String deptId;
  public BigDecimal baseSalary;
  public BigDecimal bonus;
  public String extension;
  public Date hireDate;
  public String status;
}

Es ist unwahrscheinlich, dass das Format der Mitarbeiterdatensätze von Unternehmen B dem von Unternehmen A verwendeten entspricht. Wenn dies jedoch der Fall ist, können Werte in der Spalte EMPNO und WORKDEPT unstimmig sein. Daher muss eine Verarbeitung der Datensätze des Unternehmens B ausgeführt werden.

In diesem Beispiel wird angenommen, dass die Verarbeitung in einem java.util.ArrayList<T> erfolgt, wobei com.companyb.EmplData das generische <T>, darstellt, weil es die Klasse ist, die von der Personalabteilung des Unternehmens B für einen Mitarbeiter verwendet wird.

Nachdem allen Mitarbeitern des Unternehmens B neue Mitarbeiter-IDs zugeordnet wurden und ihre Abteilungsinformationen aktualisiert wurden, sodass sie die Abteilungs-IDs für Firma A spiegeln, könnte die Änderung zur Aktualisierung der Tabelle HRDept.Employee mit Anwendungslogik wie der folgenden vorgenommen werden:

ArrayList<EmplData> transferHires = new ArrayList<EmplData>();

EmplData transferHire1 = new EmplData (...);
EmplData transferHire2 = new EmplData (...);
EmplData transferHire3 = new EmplData (...);

transferHires.add (transferHire1);
transferHires.add (transferHire2);
transferHires.add (transferHire3);

Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);

int[] manyCount = db.updateMany(
 "INSERT INTO HRDept.Employee(EMPNO, FIRSTNME," +       
 " MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE) " +
 "VALUES(:empId, :firstName, SUBSTR(:middleName,1,1), " +   
 ":lastName, :deptId, :extension, :hireDate)", transferHires );

Das Beispiel verwendet diese Definition der Methode updateMany(): public <T> int[] updateMany(java.lang.String sql, Iterable<T> parameters)


Feedback