Einzelne Aktualisierungen mit der Methode update() der Schnittstelle 'Data'

Mit der überladenen Methode update() der Schnittstelle Data können Sie null oder mehr Zeilen eines Datenbankobjekts aktualisieren.

Beispiel 1: Durch Übergabe von Werten in Bean eine Zeile in eine Tabelle einfügen

Angenommen, Sie wollen einen Datensatz in die Tabelle HRDept.Employee einfügen, die folgendermaßen definiert ist:

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

Die entsprechende Bean ist folgendermaßen definiert:

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;
}
Mit dieser Version der Methode update()
public int update(java.lang.String sql, Object... parameters)
sieht Ihre Anwendungslogik möglicherweise ähnlich wie der folgende Code aus:
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 );

Beispiel 2: Durch Übergabe von Werten in einer Bean eine Zeile einfügen und einen generierten Wert in dieser Bean abrufen

Sie wollen der Tabelle HRDept.PROJ ein neues Projekt "PAYROLL PROGRAMMING" hinzufügen. Sie haben jedoch nur Informationen zu den Eigenschaften projName, departNo, respEmp und majProj des Objekts DeptProject, die Sie für die Übergabe von Werten an die Anweisung INSERT in der Methode update() verwenden wollen.

Schlussendlich werden Sie die Information für den Rest der Eigenschaften im Objekt DeptProject haben. Um den Datensatz für das Projekt "PAYROLL PROGRAMMING" mit diesen verbleibenden Informationen zu aktualisieren, müssen Sie den Wert in der Spalte PROJID kennen, eine generierte Identitätsspalte, die als Primärschlüssel verwendet wird.

Wenn Sie den neuen Datensatz einfügen, benötigen Sie also ein Mittel, um den Wert, der in der Spalte PROJID generiert wurde, abzurufen und in der Eigenschaft projId des Objekts DeptProject zu speichern.

Dies ist die Definition der Tabelle 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))

Dies ist die Definition von DeptProject, der Bean, die dieser Tabelle entspricht:

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;
}
Bei Verwendung dieser Version der Methode update()
public int update (java.lang.String sql, Object... parameters)
könnte Ihr Code zum Einfügen einer Zeile in die Tabelle HRDept.PROJ wie folgt aussehen:
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);

Da die Eigenschaft projId im Objekt DeptProject mit einer Annotation @GeneratedKey definiert ist und die Spalte PROJID als Identitätsspalte, die immer eine ganze Zahl generiert, definiert ist, wird der Wert in der Spalte PROJID in die Eigenschaft projId übergeben, bevor die Steuerung vom Aufruf an die Methode update() zurückgegeben wird.

Wenn Sie später Informationen zu Personalausstattung, Startdatum und Enddatum des Projekts erhalten, können Sie den Wert für projId verwenden, wenn Sie die Zeile des Projekts in der Tabelle HRDept.PROJ aktualisieren.

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

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

Beispiel 3: Eine Zeile einfügen, die Werte in ein Objektarray übergibt, und einen generierten Wert in einem Objektarray oder einer einfachen Klasse abrufen

Wenn Werte ohne eine Bean übergeben und generierte Werte in einem anderen Objekt als einer Bean abgerufen werden sollen, können Sie die folgende Version der Methode update() verwenden:

<T> T update(java.lang.String sql, Class<T> returnClass, String[] columnNames,
             Object... parameters)
Diese Methode übergibt je nach angegebenem Rückgabetyp mindestens einen generierten Wert. Der Wert des Rückgabetyps Class<T> muss einer der folgenden sein:
  • Object[].class
  • Eine einfache Klasse, die direkt in JDBC zuordnungsfähig ist, wie Integer.class oder String.class

Wenn der Rückgabetyp Object[].class ist, sind die ersten n Elemente des Arrays die n generierten Werte aus den Spalten im Parameter generatedColNames. Das letzte Element des Arrays ist der Aktualisierungszähler.

Wenn der Rückgabetyp eine einfache, direkt zuordnungsfähige JDBC-Klasse ist, wird ein einzelner, generierter Wert des angegebenen Typs zurückgegeben. Der Aktualisierungszähler wird nicht zurückgegeben.

Ein Projekt könnte z. B. durch ein Objekt Object[], nicht durch eine Bean, dargestellt werden. Folgendermaßen kann die Tabelle HRDept.PROJ aktualisiert und der generierte Schlüssel für das neue Projekt abgerufen werden:

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

Feedback