[解決済み] ストアドプロシージャを呼び出すためのSpring JDBC Template
質問
現代(2012年頃)のSpring JDBC Templateを使用してストアドプロシージャを呼び出す正しい方法は何でしょうか?
例えば、以下の両方を宣言したストアドプロシージャがあるとします。
IN
と
OUT
というパラメータがあり、以下のような感じです。
mypkg.doSomething(
id OUT int,
name IN String,
date IN Date
)
私は
CallableStatementCreator
ベースのアプローチで、明示的に
IN
と
OUT
というパラメータがあります。の中の次のメソッドを考えてみましょう。
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);
関連
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Uncaught ReferenceError: は定義されていません。
-
強制型変換について
-
無効な文字定数
-
Junitのユニットテストエラー
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
java 365*1000*60*60*24 計算問題
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Spring Bootアプリケーションにポートを設定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
セミコロン期待値エラー解決
-
ジャバアレイ
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
java 365*1000*60*60*24 計算問題
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
Zipファイルの圧縮・解凍にantを使用する
-
ApiModel と @ApiModelProperty の使用法