Unterstützung für CALL-Anweisungen in mit Annotationen versehenen Methoden zum Ausführen von SQL-Anweisungen für Datenbanken

Die Unterstützung für die SQL-Anweisung CALL in mit Annotationen versehenen Methoden weist einige Ähnlichkeiten mit der Unterstützung für SQL-Anweisungen CALL in integrierten Methoden auf.

Ähnlichkeiten mit der Unterstützung für SQL-Anweisungen CALL in integrierten Methoden

Das String-SQL, das Sie in der Annotation @Call angeben, hat die gleiche Form und die gleiche Funktionalität zum Verweisen auf Parametermarken wie das in dem als ersten Parameter an die Methode call() in der Schnittstelle Data übergebene String-SQL.

Eine mit Annotationen versehene Methode erhält als Parameter die gleichen Parameter, die in einem entsprechenden Aufruf der gespeicherten Prozedur mit der Methode call() in der Schnittstelle Data übergeben werden.

Wenn Sie einen Stapel von SQL-Anweisungen CALL ausführen wollen, ist dies nur möglich, wenn die gespeicherte Prozedur keine OUT- oder INOUT-Parameter aufweist und keine Abfrageergebnisse zurückgibt.

Unterschiede bei der Unterstützung für SQL-Anweisungen CALL in mit Annotationen versehenen Methoden

Die mit Annotationen versehenen @Call-Methoden unterstützen die Verwendung von CallHandler nicht.

Die mit Annotationen versehenen @Call-Methoden unterstützen das Stapeln einer SQL-Anweisung CALL nicht. Wenn Sie jedoch Stapelverarbeitungsoperationen mit einer SQL-Anweisung CALL ausführen müssen, hängt die Unterstützung für mit Annotationen versehene Methoden wie bei integrierten Methoden, die die Verwendung der Methode Data.updateMany() erfordern, von der Annotation @Update ab. Ebenso wird die gleiche Konvention für die Annahme einer Gruppe generischer Objekte und Rückgabe eines int-Arrays verwendet.

Es gibt einen weiteren wichtigen Unterschied zwischen mit Annotationen versehenen Methoden und der Methode Data.call() mit der Signatur public StoredProcedureResult call (String sql, Object... parameters);. Mit Annotationen versehene @Call-Methoden müssen nicht zur Rückgabe eines Objekts StoredProcedureResult definiert werden. Sie können auch zur Rückgabe von 'void' oder eines der folgenden Typen definiert werden:

Unterstützung für void wird für den Fall bereitgestellt, dass der Schnittstellenentwickler entweder weiß, dass die aufgerufene gespeicherte Prozedur keine ResultSet-Objekte zurückgibt, oder dass die zurückgegebenen ResultSet-Objekte nicht von Interesse sind. Beispiel:

@Call(sql=
     "CALL updateEmployee(:empno, :name, :sal, :bonus)")
public void updateMyEmployee(EmployeeBean empObject);

Von der gespeicherten Prozedur updateEmployee wird möglicherweise kein ResultSet zurückgegeben. Dies ist jedoch irrelevant, da der Rückgabetyp für updateEmployee 'void' ist. Wenn von der gespeicherten Prozedur OUT- oder INOUT-Parameter zurückgegeben werden, werden sie (unter Verwendung der gleichen Regeln, wie für die Methode Data.call() beschrieben) in den Parameter empObject87 übertragen.

Die Unterstützung für alle weiteren Rückgabetypen (List<Map<String,Object>> usw.) wird für den Fall bereitgestellt, dass der Schnittstellenentwickler entweder weiß, dass von der aufgerufenen gespeicherten Prozedur ein einzelnes ResultSet zurückgegeben wird, oder dass nach dem ersten ResultSet zurückgegebene ResultSet-Objekte nicht von Interesse sind. Beispiel:

@Call(sql="CALL GetEmployeesInDept(:deptno)")
public List<EmployeeBean> queryDeptEmployee(
                                 DepartmentBean deptBean);

Die gespeicherte Prozedur GetEmployeesInDept wird mit dem Parameter deptno IN aus deptBean aufgerufen. Wenn GetEmployeesInDept mit einem Parameter INOUT statt IN definiert ist, wird (unter Verwendung derselben Regeln, wie für die Methode Data.call() beschrieben) auch der Wert OUT dieses Parameters zum Aktualisieren der Eigenschaft deptno von deptBean verwendet.

Unabhängig von den Parametern der gespeicherten Prozedur GetEmployeesInDept wird Code zum Verarbeiten des ersten zurückgegebenen ResultSet in mindestens einem Objekt EmployeeBean generiert, das in Form einer Liste zurückgegeben wird. Weitere ResultSet-Objekte, sofern vorhanden, werden ignoriert. Wenn kein ResultSet vorhanden ist oder das erste ResultSet keiner EmployeeBean zugeordnet werden kann, wird eine Ausnahmebedingung ausgelöst.


Feedback