Spring JDBC の SimpleJdbcCall を使用しています。私は非常に役に立ちますが、それでも私にとっては単純で滑らかではありません。理想的には、JDBC 呼び出しが通常の Java メソッド呼び出しと区別できないと想像します。
最近、多くの軽量な ORM フレームワークが Java に登場しているのを見て (Ebean など)、ストアド プロシージャの方向に類似した開発があるかどうか尋ねたいと思いました。
Spring JDBC の SimpleJdbcCall を使用しています。私は非常に役に立ちますが、それでも私にとっては単純で滑らかではありません。理想的には、JDBC 呼び出しが通常の Java メソッド呼び出しと区別できないと想像します。
最近、多くの軽量な ORM フレームワークが Java に登場しているのを見て (Ebean など)、ストアド プロシージャの方向に類似した開発があるかどうか尋ねたいと思いました。
Java から JDBC または JPA を介してストアド プロシージャを呼び出すのは、非常に面倒で冗長な場合があります。EclipseLink で提供されている例を見ると、JPA 2.1 ではそれほど単純にはなっていません。
@NamedStoredProcedureQuery(
name="ReadUsingMultipleResultSetMappings",
procedureName="Read_Multiple_Result_Sets",
resultSetMappings = {
"EmployeeResultSetMapping",
"AddressResultSetMapping",
"ProjectResultSetMapping",
"EmployeeConstructorResultSetMapping"
}
)
@SqlResultSetMappings({
@SqlResultSetMapping(
name = "EmployeeResultSetMapping",
entities = {
@EntityResult(entityClass = Employee.class)
}
),
@SqlResultSetMapping(
name = "EmployeeConstructorResultSetMapping",
classes = {
@ConstructorResult(
targetClass = EmployeeDetails.class,
columns = {
@ColumnResult(name="EMP_ID", type=Integer.class),
@ColumnResult(name="F_NAME", type=String.class),
@ColumnResult(name="L_NAME", type=String.class),
@ColumnResult(name="R_COUNT", type=Integer.class)
}
)
}
)
})
良いオプションは、 jOOQなどのコード ジェネレーターを活用することです(私は jOOQ ベンダーで働いているため、この回答は偏っています)。次の手順を想定します。
-- Check whether there is an author in AUTHOR by that name and get his ID
CREATE OR REPLACE PROCEDURE author_exists (
author_name VARCHAR2,
result OUT NUMBER,
id OUT NUMBER
);
生成されたコードを使用すると、次のように簡単に呼び出すことができます。
AuthorExists result = Routines.authorExists(configuration, "Paulo");
assertEquals(new BigDecimal("1"), result.getResult());
assertEquals(new BigDecimal("2"), result.getId();
詳細については、jOOQ マニュアルも参照してください。
他のコード ジェネレーターが存在し、面倒な JDBC または JPA コードを生成するために利用できます。
@NamedStoredProcedureQueryなどを使用してJPAからストアドプロシージャを呼び出す可能性があります。たとえば、eclipselinkを使用できます。http://wiki.eclipse.org/EclipseLink/Examples/JPA/StoredProcedures
それが役に立てば幸い。