Die Schnittstelle ParameterHandler<T> hat nur eine Methode: handleParameters(). Wenn pureQuery diese Methode aufruft, wird zusammen mit den Parametern, die Sie an die mit Annotationen versehene Methode übergeben haben, ein Objekt PreparedStatement übergeben, das zur Ausführung der SQL-Anweisung verwendet wurde.
Verwenden Sie ParameterHandler<T>-Objekte, um die Werte der Parameter in der SQL-Anweisung zu setzen und die Parameter OUT oder INOUT zu setzen. Informationen zur Schnittstelle java.sql.PreparedStatement finden Sie im Javadoc für Ihr Java SDK.
Der Zweck dieses Beispiels wird in Kommentaren im Code erläutert.
package com.samplePackage; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import com.ibm.pdq.runtime.generator.ParameterHandler; // Dies ist ein Beispiel für eine angepassten ParameterHandler, der: // (1) einen Methodenparameter prüft und // (2) einen Methodenparameter verarbeitet, // bevor der Methodenparameter als Anweisungsparameter festgelegt wird. // Dieser angepasste ParameterHandler // (3) legt auch einen der Anweisungsparameter mit einem fest codierten Wert fest. // // Dieser erste Anweisungsparameter ist bonusFactor. Der festgelegte Wert ist eine Zahl zwischen // 1 und 2. Der als Methodenparameter übergebene Wert liegt zwischen 100% und 200%. // Daher prüft der Parameterhandler, ob der übergebene Wert zwischen // 100 und 200 liegt und teilt den Wert durch 100, bevor er ihn als den // Anweisungsparameter bonusFactor festlegt. // // Der zweite Anweisungsparameter ist bonusMaxSumForDept. Er wird mit einem Wert festgelegt, // der im Parameterhandler fest codiert ist -- $20,000.00. public class BonusIncreaseParameterHandler implements ParameterHandler { // ?1 ist der Rückgabewert // Der IN-Parameters ?2 wird über den übergebenen Methodenparameter newBonusPercentageOfOldBonus festgelegt // Der IN-Parameters ?3 wird über eine festen Zahl in der Schnittstelle ParameterHandler festgelegt // Es gibt vier OUT-Parameter für die SQL-Anweisung CALL: // (1) ?4 => deptsWithoutNewBonuses // (2) ?5 => countDeptsViewed // (3) ?6 => countDeptsBonusChanged // (5) ?7 => errorMsg public void handleParameters (PreparedStatement stmt, Object... parameters) throws SQLException { CallableStatement cstmt = (CallableStatement) stmt; double newBonusPercentageOfOldBonus = (Double) parameters[1]; // Prüfen, ob der Wert des Parameters sinnvoll ist if (100 > newBonusPercentageOfOldBonus || 200 < newBonusPercentageOfOldBonus) { throw new RuntimeException ( "The bonusFactorPercentage must be between 100 and 200 inclusive. The new bonus will be this percentage of the old bonus. (So, for example, if bonusFactorPercentage=100, then the bonus will not change.)"); } // Anweisungsparameter bonusFactor berechnen, der in cstmt gesetzt wird double bonusFactor = newBonusPercentageOfOldBonus / 100.0; // Der Wert für diesen Parameter cstmt wird festgelegt double bonusMaxSumForDept = 20000.00; // OUT-Parameter registrieren und IN-Parameter festlegen cstmt.registerOutParameter (1, Types.INTEGER); stmt.setDouble (2, bonusFactor); stmt.setDouble (3, bonusMaxSumForDept); cstmt.registerOutParameter (4, Types.VARCHAR); cstmt.registerOutParameter (5, Types.INTEGER); cstmt.registerOutParameter (6, Types.INTEGER); cstmt.registerOutParameter (7, Types.VARCHAR); } }
Der Zweck dieses Beispiels wird in Kommentaren im Code erläutert.
package com.samplePackage; import java.sql.PreparedStatement; import java.sql.SQLException; import com.ibm.pdq.runtime.generator.ParameterHandler; // Dies ist ein Beispiel für einen angepassten ParameterHandler, mit dem eine aus einer früheren // Version übernommene Benutzer-Bean unverändert verwendet werden kann. Siehe CustomDepartment-Klasse // für Details zur Bean-Implementierung und zu den Gründen, warum sie unverändert verwendet wird. public class CustomDepartmentParameterHandler implements ParameterHandler { public void handleParameters (PreparedStatement stmt, Object... parameters) throws SQLException { CustomDepartment department = (CustomDepartment) parameters[0]; stmt.setString (1, department.getDepartmentCode ()); } }
Definition der Bean CustomDepartment.
package com.samplePackage; // Dies ist ein Beispiel für eine aus einer früheren Version übernommene Bean, die ein Benutzer // möglicherweise nicht ändern will. Änderungen, die er vornehmen müsste, damit diese Bean kompatibel wird: // (1) Änderung der Eigenschaftsnamen, Hinzufügen von @Column oder Hinzufügen von @ColumnOverride, damit // die Eigenschaften den Spalten zugeordnet werden können. // (2) Hinzufügen der setter-Methoden, die den enthaltenen getter-Methoden entsprechen. // // Änderung (1) wäre eine einfache Änderung -- wenn der Benutzer jedoch zahlreiche Beans wie diese hat // oder wenn er einen aus früheren Versionen übernommenen Code hat, den er nicht ändern kann, kann // er stattdessen die den ParameterHandler verwenden. // // Änderung (2) kann möglicherweise erhebliche Änderungen an der Entwurfsarchitektur des Benutzers // erforderlich machen. In diesem speziellen Fall möchte der Benutzer z. B. möglicherweise nur // Änderungen an departmentName und departmentCode zulassen, wenn beide Änderungen zusammen // durchgeführt werden. Daher hat er eine Methode changeDepartment(String,String), aber keine // Methode setDepartmentName(String) oder setDepartmentCode(String). Ein angepasster // ParameterHandler würde es dem Benutzer ermöglichen, diese Bean weiterhin unverändert zu verwenden. public class CustomDepartment { private String departmentName; private String departmentCode; // Andere Eigenschaften public CustomDepartment (String departmentName, String departmentCode) { this.departmentName = departmentName; this.departmentCode = departmentCode; } public void changeDepartment (String departmentName, String departmentCode) { this.departmentName = departmentName; this.departmentCode = departmentCode; } public String getDepartmentName () { return departmentName; } public String getDepartmentCode () { return departmentCode; } // Andere Methoden }
Der Zweck dieses Beispiels wird in Kommentaren im Code erläutert.
package com.samplePackage; import java.sql.PreparedStatement; import java.sql.SQLException; import com.ibm.pdq.runtime.generator.ParameterHandler; // Dies ist ein Beispiel für einen angepassten Parameterhandler, in dem die SQL-Parameter // nicht auf bereits in den Methodenparametern verfügbaren Werten basieren. Eingabe // diesem Fall wird die Projektlänge durch Multiplikation eines Werts einer Eigenschaft // vom Parameter ProjectLevel mit einem Wert einer Eigenschaft vom Parameter AdefUser // berechnet. public class ProjectLevelParameterHandler implements ParameterHandler { public void handleParameters (PreparedStatement stmt, Object... parameters) throws SQLException { System.out.println("CDS in parameter handler"); ProjectLevel projectLevel = (ProjectLevel) parameters[0]; AdefUser adefUser = (AdefUser) parameters[1]; int numberOfEmployees = adefUser.getNumberOfEmloyees (); double lengthInDays = projectLevel.getMinimumProjectLengthInDaysPerDepartmentMember () * numberOfEmployees; String workDepartment = adefUser.getWorkDept (); System.out.println("CDS trying to set parameters"); stmt.setDouble (1, numberOfEmployees); stmt.setDouble (2, lengthInDays); stmt.setString (3, workDepartment); } }
Definition der Bean AdefUser.
package com.samplePackage; import com.ibm.pdq.annotation.Column; public class AdefUser { private String workDept; private int numberOfEmloyees; public AdefUser (String workDept, int numberOfEmployees) { this.workDept = workDept; this.numberOfEmloyees = numberOfEmployees; } @Column(name="no_of_employees") public int getNumberOfEmloyees () { return numberOfEmloyees; } public void setNumberOfEmloyees (int numberOfEmloyees) { this.numberOfEmloyees = numberOfEmloyees; } public String getWorkDept () { return workDept; } public void setWorkDept (String workDept) { this.workDept = workDept; } }
Definition der Bean ProjectLevel.
package com.samplePackage; public class ProjectLevel { private int projectLevel; private double minimumProjectLengthInDaysPerDepartmentMember; public ProjectLevel(int projectLevel, double minimumProjectLengthInDaysPerDepartmentMember) { this.projectLevel = projectLevel; this.minimumProjectLengthInDaysPerDepartmentMember = minimumProjectLengthInDaysPerDepartmentMember; } public double getMinimumProjectLengthInDaysPerDepartmentMember () { return minimumProjectLengthInDaysPerDepartmentMember; } public void setMinimumProjectLengthInDaysPerDepartmentMember (double minimumProjectLengthInDaysPerDepartmentMember) { this.minimumProjectLengthInDaysPerDepartmentMember = minimumProjectLengthInDaysPerDepartmentMember; } public int getProjectLevel () { return projectLevel; } public void setProjectLevel (int projectLevel) { this.projectLevel = projectLevel; } }