Mises à jour uniques effectuées à l'aide de la méthode update() de l'interface Data

Vous pouvez utiliser la méthode update() surchargée de l'interface Data pour mettre à jour les lignes d'un objet de base de données.

Exemple 1 : insertion d'une ligne dans une table en transmettant des valeurs dans un bean

Supposez que vous souhaitiez insérer un enregistrement dans la table HRDept.Employee définie de cette manière :

CREATE TABLE HRDept.Employee(
  EMPNO CHAR(6) NOT NULL,
  FIRSTNME VARCHAR(12) NOT NULL,
  MIDINIT CHAR(1),
  LASTNAME VARCHAR(15), 
  WORKDEPT CHAR(2), 
  PHONENO CHAR(4),
  HIREDATE DATE,
  PRIMARY KEY(EMPNO))

Le bean correspondant est défini de la manière suivante :

public Employee {
  @Column(name="EMPNO") 
   public String employeeId;
  @Column(name = "FIRSTNME") 
   public String firstName;
  @Column(name = "MIDINIT") 
   public String middleInitial;
  public String lastName;
  @Column(name = "WORKDEPT") 
   public String departmentId;
  @Column(name = "PHONENO") 
   public String extension;
  public Date hireDate;
}
Avec cette version de la méthode update()
public int update(java.lang.String sql, Object... parameters)
votre logique d'application peut être similaire au code suivant :
Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);

Employee newCollegeHire = 
   new Employee("000010", "CHRISTINE", "I", "HAAS", "A00", 
      "3978", new java.sql.Date(System.currentTimeMillis()));

int oneCount = db.update(
 "INSERT INTO HRDept.Employee(EMPNO, FIRSTNME," +
   " MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE) " +
 "VALUES(:employeeId, :firstName, :middleInitial," +     
     " :lastName, :departmentId, :extension," +
    " :hireDate )", newCollegeHire );

Exemple 2 : insertion d'une ligne en transmettant des valeurs dans un bean et en récupérant une valeur générée dans ce bean

Vous souhaitez ajouter un nouveau projet "PAYROLL PROGRAMMING" à la table HRDept.PROJ. Cependant, vous disposez d'informations uniquement sur les propriétés projName, departNo, respEmp, et majProj de l'objet DeptProject que vous prévoyez d'utiliser pour transmettre les valeurs à l'instruction INSERT dans la méthode update().

Eventuellement, vous disposerez d'informations pour le reste des propriétés de l'objet DeptProject. Pour mettre à jour l'enregistrement du projet "PAYROLL PROGRAMMING" avec ces informations restantes, vous devrez connaître la valeur de la colonne PROJID qui est une colonne d'identité générée utilisée comme une clé primaire.

Ainsi, lorsque vous insérez le nouvel enregistrement, vous avez besoin d'un moyen permettant de récupérer la valeur générée dans la colonnePROJID et de placer cette valeur dans la propriété projId de l'objet DeptProject.

Voici la définition de la table HRDept.PROJ :

CREATE TABLE HRDept.PROJ
  (PROJID INTEGER GENERATED ALWAYS AS IDENTITY NOT NULL,
   PROJNAME VARCHAR(24),
   DEPTNO CHAR(3),
   RESPEMP CHAR(6),
   PRSTAFF DECIMAL(5, 2),
   PRSTDATE DATE,
   PRENDATE DATE,
   MAJPROJ INTEGER,
   PRIMARY KEY(PROJID))

Voici la définition de DeptProject, le bean correspondant à cette table :

public class DeptProject {
  @GeneratedKey
  public Integer projId;
  public String projName;
  public String departNo;
  public String respEmp;
  public BigDecimal prStaff;
  public Date prStDate;
  public Date prEnDate;
  public String majProj;
}
Avec cette version de la méthode update()
public int update(java.lang.String sql, Object... parameters)
votre code pour insérer une ligne dans la table HRDept.PROJ peut se présenter comme suit :
Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);
DeptProject newProject = 
  new DeptProject ("PAYROLL PROGRAMMING", "A00",
   "000010", 319);  // 319: GENERAL AD SYSTEMS

int updateCount = db.update( "INSERT INTO " +
  "HRDept.PROJ(PROJNAME, DEPTNO, RESPEMP, MAJPROJ) " +
  "VALUES(:projName, :departNo, :respEmp, :majProj)", 
  newProject);

Etant donné que la propriété projId de l'objetDeptProject est définie avec une annotation @GeneratedKey et que la colonne PROJID est définie comme une colonne d'identité générant toujours un entier, la valeur de la colonne PROJID est transmise à la propriété projId avant que la commande ne soit renvoyée de l'appel vers la méthode update().

Lorsque vous obtenez ensuite des informations sur le nombre de membres du personnel du projet, sur la date de début et la date de fin, vous pouvez utiliser la valeur de projId lors de la mise à jour de la ligne du projet dans la table HRDept.PROJ.

newProject.prStaff = ...;
newProject.prStDate = ...;
newProject.prEnDate = ...;

oneCount = db.update("UPDATE HRDept.PROJ SET " +   
    "PRSTAFF=:prStaff, PRSTDATE=:prStDate, " +
    "PRENDATE=:prEnDate WHERE PROJID=:projId ", 
    newProject);

Exemple 3 : insertion d'une ligne en transmettant des valeurs dans un tableau Object et en récupérant une valeur générée dans un tableau Object ou une classe simple

Si vous souhaitez transmettre des valeurs sans bean et récupérer les valeurs générées dans un objet autre qu'un bean, vous pouvez utiliser la version suivante de la méthode update() :

<T> T update(java.lang.String sql, Class<T> returnClass, String[] columnNames,
             Object... parameters)
Cette méthode renvoie une ou plusieurs valeurs générées en fonction du type de renvoi indiqué. La valeur du type de renvoi Class<T> doit être :
  • Object[].class
  • Une classe simple pouvant être directement attribuée à partir de JDBC, telle que Integer.class ou String.class

Lorsque le type de renvoi est Object[].class, les premiers éléments n du tableau sont les valeurs n générées à partir des colonnes du paramètre generatedColNames. Le dernier élément du tableau est le nombre de mises à jour.

Lorsque le type de renvoi est une classe JDBC simple et pouvant être directement attribuée, une valeur générée unique de type donnée est renvoyée. Le nombre de mises à jour n'est pas renvoyé.

Par exemple, un projet peut être représenté par Object[] et non par un bean. La table HRDept.PROJ peut être mise à jour et le clé générée pour le nouveau projet est récupérée comme suit :

Object[] myProj = new Object[4];
myProj[0] = ...;
myProj[1] = ...;
myProj[2] = ...; 
myProj[3] = ...;

String[] generatedColNames = new String[] {"PROJID"};

Integer generatedProjID;

String sql = "INSERT INTO HRDept.PROJ(PROJNAME, DEPTNO, "  
             + "RESPEMP, MAJPROJ) values (?, ?, ?, ?)";
generatedProjID = db.update( sql, Integer.class,
                             generatedColNames, myProj);

Commentaires