S2JDBC - JdbcManager - SQLによる操作

SQLを使って複数件検索をする場合は、 selectBySql()getResultList() を組み合わせます。

results = jdbcManager .selectBySql( EmployeeDto.class, "select ... where department_id = ?", 10) .getResultList(); ]]>

結果を Map で受け取ることもできます。

results = jdbcManager .selectBySql( BeanMap.class, "select ...") .getResultList(); ]]>

BeanMapはMap<String, Object>なクラスで、 存在しないキーにアクセスすると 例外が発生します。 キーの値は、AAA_BBBのような'_'記法の値ををaaaBbbのようなキャメル記法に 変換したものです。

このルールは、convention.diconで指定されている org.seasar.framework.convention.impl.PersistenceNamingConventionImpl のfromColumnNameToPropertyName()の実装を変えることで、カスタマイズすることができます。

デフォルトでは、結果がなかった場合は、 空の List が返されます。 disallowNoResult() を呼び出すと、 結果がなかった場合は javax.persistence.NoResultException が発生します。

results = jdbcManager .selectBySql( BeanMap.class, "select ...") .disallowNoResult() .getResultList(); ]]>

SQLを使って1件検索をする場合は、 selectBySql()getSingleResult() を組み合わせます。

結果を Map で受け取ることもできます。

BeanMapはMap<String, Object>なクラスで、 存在しないキーにアクセスすると 例外が発生します。 キーの値は、AAA_BBBのような'_'記法の値ををaaaBbbのようなキャメル記法に 変換したものです。

このルールは、convention.diconで指定されている org.seasar.framework.convention.impl.PersistenceNamingConventionImpl のfromColumnNameToPropertyName()の実装を変えることで、カスタマイズすることができます。

デフォルトでは、結果がなかった場合は、 null が返されます。 disallowNoResult() を呼び出すと、 結果がなかった場合は javax.persistence.NoResultException が発生します。

検索結果が多くの行を返すため、 List でまとめて受け取ることが困難な場合は iterate(IterationCallback) を使います。

() { int count; public Integer iterate(BeanMap map, IterationContext context) { if (...) { ++count; } return count; } }); ]]>

iterate(IterationCallback) の引数には、 次のインターフェースを実装したクラスのインスタンスを渡します。

  • org.seasar.extension.jdbc.IterationCallback<ENTITY, RESULT>

ENTITYselectBySql() で指定したクラス、 RESULTiterate(IterationCallback) が返す結果の型を指定します。

問い合わせ結果の1行ごとに次のメソッドがコールバックされます。

  • RESULT iterate(ENTITY entity, IterationContext context)

コールバックメソッドが最後に返した値が iterate(IterationCallback) の戻り値となります。

コールバックメソッドの第2引数で渡される org.seasar.extension.jdbc.IterationContext exit プロパティを true にすると、 問い合わせ結果のイテレーションは終了となり、 検索結果の残りは無視されます。 その時の戻り値が iterate(IterationCallback) の戻り値となります。

SELECT COUNT(*) ~による検索結果の行数を取得する場合は、getCountBySql()を使います。

このメソッドは通常、 select count(*) from ( SQL ) を 実行した結果を返します。

ページングを指定する場合は、 limit(), offset() を使います。 limit() には、取得する行数を指定します。 offset() には、最初に取得する行の位置を指定します。 最初の行の位置は0になります。 ページングを指定するには、必ず ordey by 句が必要です。 order by句で指定するカラムは、selectリストにも含めるようにしてください。

SQLを使ってエンティティを更新する場合は、 updateBySql()params()execute() を組み合わせます。 updateBySql() の2番目以降の引数はパラメータのクラスの可変長引数です。 挿入、削除も updateBySql() を使います。

一意制約違反によりエンティティを挿入ができなかった場合は、 javax.persistence.EntityExistsException が発生します。

SQLを使って複数エンティティをバッチ更新する場合は、 updateBatchBySql()params()execute() を組み合わせます。 updateBatchBySql() の2番目以降の引数はパラメータのクラスの可変長引数です。 挿入、削除も updateBatchBySql() を使います。

dtoList = ...; ... SqlBatchUpdate batchUpdate = jdbcManager .updateBatchBySql( "update employee set salary = ? where id = ?", BigDecimal.class, Integer.class); for (EmployeeDto dto : dtoList) { batchUpdate.params(dto.salary, dto.id); } int[] countArray = batchUpdate .execute(); ]]>

一意制約違反によりエンティティを挿入ができなかった場合は、 javax.persistence.EntityExistsException が発生します。

バッチ更新のサイズを設定するには batchSize() を使います。

dtoList = ...; ... SqlBatchUpdate batchUpdate = jdbcManager .updateBatchBySql( "update employee set salary = ? where id = ?", BigDecimal.class, Integer.class); for (EmployeeDto dto : dtoList) { batchUpdate.params(dto.salary, dto.id); } int[] countArray = batchUpdate .batchSize(50) .execute(); ]]>

SQLを使ってストアドプロシージャを呼び出す場合は、 callBySql()execute() を組み合わせます。 callBySql() の最初の引数は、 ストアドプロシージャを呼び出すSQLです。

最初の例は、パラメータのない場合です。

INのパラメータが1つだけで、そのパラメータが null にならない場合は、 callBySql() の2番目の引数で値を直接指定します。

上記以外の場合は、 callBySql() の2番目の引数にJavaBeansを指定します。 プロシージャを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。

注意点

S2JDBCは、ソースコード上に記述したフィールドの順番と、 コンパイルされた.classファイル内のフィールドの順番が同じになることを前提としていますが、 これはJavaの仕様では保証されていません. SunのJDKやEclipseではソースコード上と.classファイル内のフィールド順は同じになっていますが、 フィールドの順番が変わってしまう環境ではストアドの呼び出しが失敗します。 フィールドの順番が変わってしまう環境があった場合は Seasar-userメーリングリスト までお知らせください.

  • フィールドにアノテーションが付けられていない場合、 IN パラメータになります。

  • フィールドに @Out アノテーションが付けられている場合、 OUT パラメータになります。

  • フィールドに @InOut アノテーションが付けられている場合、 INOUT パラメータになります。

  • フィールドに @ResultSet アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。 ただし、 OracleやPostgreSQLのように、 パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、 OUT パラメータとして扱われます。

  • フィールドに @Lob が付けられている場合、 そのパラメータはLOBとして扱われます。 @Lob アノテーションは他のアノテーションと組み合わせて使用することが出来ます。

result; // 結果セット } ]]>

ストアドプロシージャが複数のカラムを持つ結果セットを返す場合は、 対応するフィールドの型をList<結果セットの行に対応するJavaBeansの型>にします。

result; // 結果セット } ]]>

オラクルとPostgreSQLの場合は、結果セットをパラメータで受け取る必要があります。 これらのRDBMSでは、 @ResultSet アノテーションが付けられたパラメータは OUT パラメータとして扱われるので、 ストアドプロシージャ呼び出しのSQLの中に対応するバインド変数を付け加えます。

result; // 第2引数 (OUT) } ]]>

SQLを使ってストアドファンクションを呼び出す場合は、 callBySql() と、 getSingleResult() または getResultList() を組み合わせます。 callBySql() の1番目の引数でストアドファンクションの戻り値の型を指定します。 2番目の引数でストアドファンクションを呼び出すSQLを指定します。

最初の例はパラメータがなく、 戻り値が結果セットでない場合です。

OracleやPostgreSQLのように、 ストアドファンクションの戻り値で結果セットを返すことが出来る場合は getResultList() で結果の List を受け取ります。 callBySql() の1番目の引数で List の要素の型を指定します。

result = jdbcManager .callBySql( String.class, "{? = call myfunc}") .getResultList(); ]]>

結果セットの行が複数のカラムを持つ場合は List の要素をJavaBeansにします。

result = jdbcManager .callBySql( MyDto.class, "{? = call myfunc}") .getResultList(); ]]>

INのパラメータが1つだけで、そのパラメータが null にならない場合は、 callBySql() の3番目の引数で値を直接指定します。

上記以外の場合は、 callBySql() の3番目の引数にJavaBeansを指定します。 ストアドファンクションを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。

注意点

S2JDBCは、ソースコード上に記述したフィールドの順番と、 コンパイルされた.classファイル内のフィールドの順番が同じになることを前提としていますが、 これはJavaの仕様では保証されていません. SunのJDKやEclipseではソースコード上と.classファイル内のフィールド順は同じになっていますが、 フィールドの順番が変わってしまう環境ではストアドの呼び出しが失敗します。 フィールドの順番が変わってしまう環境があった場合は Seasar-userメーリングリスト までお知らせください.

  • フィールドにアノテーションが付けられていない場合、 IN パラメータになります。

  • フィールドに @Out アノテーションが付けられている場合、 OUT パラメータになります。

  • フィールドに @InOut アノテーションが付けられている場合、 INOUT パラメータになります。

  • フィールドに @ResultSet アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。 ただし、 OracleやPostgreSQLのように、 パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、 OUT パラメータとして扱われます。

  • フィールドに @Lob が付けられている場合、 そのパラメータはLOBとして扱われます。 @Lob アノテーションは他のアノテーションと組み合わせて使用することが出来ます。

result; // 結果セット } ]]>

ストアドファンクションが複数のカラムを持つ結果セットを返す場合は、 対応するフィールドの型をList<結果セットの行に対応するJavaBeansの型>にします。

result; // 結果セット } ]]>

オラクルとPostgreSQLの場合は、戻り値以外の結果セットをパラメータで受け取る必要があります。 これらのRDBMSでは、 @ResultSet アノテーションが付けられたパラメータは OUT パラメータとして扱われるので、 ストアドファンクション呼び出しのSQLの中に対応するバインド変数を付け加えます。

result; // 第2引数 (OUT) } ]]>