1. ホーム
  2. java

[解決済み] ストアドプロシージャを呼び出すためのSpring JDBC Template

2023-05-05 06:46:37

質問

現代(2012年頃)のSpring JDBC Templateを使用してストアドプロシージャを呼び出す正しい方法は何でしょうか?

例えば、以下の両方を宣言したストアドプロシージャがあるとします。 INOUT というパラメータがあり、以下のような感じです。

mypkg.doSomething(
    id OUT int,
    name IN String,
    date IN Date
)

私は CallableStatementCreator ベースのアプローチで、明示的に INOUT というパラメータがあります。の中の次のメソッドを考えてみましょう。 JdbcTemplate クラスで使用されます。

public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters)

もちろん、このように使えることは知っています。

List<SqlParameter> declaredParameters = new ArrayList<SqlParameter>();

declaredParameters.add(new SqlOutParameter("id", Types.INTEGER));
declaredParameters.add(new SqlParameter("name", Types.VARCHAR));
declaredParameters.add(new SqlParameter("date", Types.DATE));

this.jdbcTemplate.call(new CallableStatementCreator() {

    @Override
    CallableStatement createCallableStatement(Connection con) throws SQLException {
        CallableStatement stmnt = con.createCall("{mypkg.doSomething(?, ?, ?)}");

        stmnt.registerOutParameter("id", Types.INTEGER);
        stmnt.setString("name", "<name>");
        stmnt.setDate("date", <date>);

        return stmnt;
    }
}, declaredParameters);

の目的は何でしょうか? declaredParameters で既に登録しているのに csc の実装ですでに登録されているのに?言い換えれば、なぜ私が csc を渡す必要があるのでしょうか? con.prepareCall(sql) を内部で実行できるのに?基本的に、両方ではなくどちらか一方を渡すことはできないのでしょうか?

または、私がこれまでに遭遇したものよりもはるかに優れたストアドプロシージャの呼び出し方法(Spring JDBC Templateを使用)があるのでしょうか?

注意してください。 似たようなタイトルの質問が多く見受けられますが、この質問と同じではありません。

どのように解決するのですか?

Springでストアドプロシージャを呼び出すには、いくつかの方法があります。

もしあなたが CallableStatementCreator を使ってパラメータを宣言すると、Javaの標準的なインタフェースである CallableStatement を使用します。つまり、パラメータを登録し、別々に設定します。使用方法 SqlParameter を使うことで、よりすっきりしたコードになります。

を見ることをお勧めします。 SimpleJdbcCall . このような使い方ができるかもしれません。

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
    .withSchemaName(schema)
    .withCatalogName(package)
    .withProcedureName(procedure)();
...
jdbcCall.addDeclaredParameter(new SqlParameter(paramName, OracleTypes.NUMBER));
...
jdbcCall.execute(callParams);

簡単な手続きであれば jdbcTemplate 's update メソッドを使用します。

jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);