Mises à jour par lots effectuées sur des objets de base de données uniques à l'aide de la méthode updateMany() de l'interface Data

Vous pouvez utiliser la méthode updateMany() de l'interface Data pour effectuer plusieurs mises à jour d'un objet de base de données.

Description

Dans l'interface Data, la méthode updateMany() indique qu'une instruction doit être exécutée plusieurs fois.

Même s'il est possible que votre code exécute une instruction DML unique de manière répétitive, en appelant la méthode update() avec la même instruction SQL et en transmettant différents paramètres à chaque fois, il est généralement plus efficace d'utiliser la méthode updateMany().

La méthode updateMany() vous permet de transmettre une collection (ou lot) de données pouvant faire l'objet d'une itération. Par exemple, avec la méthode update(), vous pouvez exécuter l'instruction SQL suivante :
INSERT INTO HR.EMPLOYEE VALUES(:id, :lastName, :firstName, :dept, :location);
Vous transmettez des valeurs à l'instruction SQL en utilisant un bean, peut-être appelé Employee, ou un objet Map. Avec la méthode updateMany(), vous pouvez utiliser la même instruction SQL. Cependant, vous transmettez des valeurs en utilisant un objet Iterable de même type que le bean ou un objet Map.

Le tableau int renvoyé indique, comme dans JDBC, le succès (et le nombre de mises à jour associé) ou l'échec de chaque exécution de l'instruction SQL. Cela comprend l'utilisation des comptes de mise à jour de JDBC Statement.EXECUTE_FAILED et SUCCESS_NO_INFO.

En cas d'échec, une exception com.ibm.pdq.runtime.exception.UpdateManyException est émise. Cette exception de l'exécution contient des informations que JDBC répertorie dans son exception java.sql.BatchUpdateException.

Si vous souhaitez exécuter un lot d'instructions SQL CALL, vous pouvez utiliser la méthode updateMany() uniquement si votre procédure mémorisée ne contient pas de paramètre OUT ou INOUT et ne renvoie aucun résultat de requête.

Exemple

Partez du principe que la société A achète la société B et doit insérer les employés de cette dernière dans le tableau HRDept.Employee. La classe que la société A utilise pour représenter ce tableau est définie comme suit :

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;
}

Il est peu probable que le format des enregistrements d'employés de la société B corresponde à celui utilisé par la société A. Si c'est le cas, les valeurs des colonnes EMPNO et WORKDEPT peuvent être en conflit. Il est alors nécessaire de traiter les enregistrements de la société B.

Dans cet exemple, ce traitement est supposé avoir lieu dans java.util.ArrayList<T>, où com.companyb.EmplData est la classe générique <T>, car il s'agit de la classe utilisée par le service des ressources humaines de la société B pour un employé.

Une fois que tous les employés de la société B ont reçu de nouveaux ID et que leurs informations au niveau du service ont été mises à jour pour correspondre aux ID de service de la société A, la modification pour mettre à jour le tableau HRDept.Employee peut être apportée avec une logique d'application comme celle-ci :

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 );

Cet exemple utilise cette définition de la méthode updateMany() : public <T> int[] updateMany(java.lang.String sql, Iterable<T> parameters)


Commentaires