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