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