構文図および構文エレメントの説明は、以下のセクションに記載されています。
構文図で使用されている規則については、構文図の読み方を参照してください。
以下の構文を使用して、カーソルを使用しない DML ステートメントを実行するアノテーション付きメソッドを宣言します。また、DDL ステートメントの実行にもこの構文を使用できます。
>>-@Update--(--sql--=--"--SQL-statement--"--)-------------------> >--+------------------------------------------------------------------------------------------+--> '-@Handler--(--+-parameterHandler--=--class-name--------------------------------------+--)-' +-resultHandler--=--class-name--+------------------------------------+-+ | '-,--parameterHandler--=--class-name-' | '-rowHandler--=--class-name--+------------------------------------+----' '-,--parameterHandler--=--class-name-' >--modifiers--return-type--method-name--(--+-----------------------+--+------------------------------------+--);->< '-handler--handler-name-' | .-,------------------------------. | | V | | '---parameter-type--parameter-name-+-'
例
以下に示すのは、SELECT ステートメントを実行するメソッドの構文例です。
@Select(sql = "SELECT PID, QUANTITY, LOCATION FROM HEATHR.INVENTORY WHERE PID = ?") Inventory getInventory(String pid);
以下に示すのは、INSERT ステートメントを実行するメソッドの構文例です。
@Update(sql = "INSERT INTO HEATHR.INVENTORY (PID, QUANTITY, LOCATION) VALUES (?, ?, ?)") int createInventory(String pid, int quantity, String location);
以下の構文を使用して、CALL ステートメントを実行するアノテーション付きメソッドを宣言します。
>>-@Call--(--sql--=--"--SQL-statement--"--)---------------------> >--+------------------------------------------------------------------------------------------------------+--> '-@Handler--(--+-callHandlerWithParameters--=--class-name--+------------------------------------+-+--)-' | '-,--parameterHandler--=--class-name-' | '-parameterHandler--=--class-name--------------------------------------------------' >--modifiers--return-type--method-name--(--+-----------------------+--+------------------------------------+--);->< '-handler--handler-name-' | .-,------------------------------. | | V | | '---parameter-type--parameter-name-+-'
例
@Call(sql = "Call MYSCHEMA.BONUS_INCREASE( :p_bonusfactor, :p_bonusmaxsumfordept, :p_deptswithoutnewbonuses, :p_countdeptsviewed, :p_countdeptsbonuschanged, :p_errormsg )") StoredProcedureResult callBONUS_INCREASE(Bonus_increaseParam parms);
以下の構文を使用して、SELECT ステートメントを実行するアノテーション付きメソッドを宣言します。@Cursor アノテーションを使用する場合、java.sql.ResultSet をインターフェースにインポートする必要があります。
>>-@Select--(--sql--=--"--SQL-statement--"--)-------------------> >--+-----------------------------------------------------------------------------------------+--> | .-,-------------------------------------------------------------------. | | (1) V .-false-. | | '-@Cursor--(--------+-allowStaticRowsetCursors--=--+-true--+--------------------------+-+-' | .-java.sql.ResultSet.CONCUR_READ_ONLY-. | +-concurrency--=--+-java.sql.ResultSet.CONCUR_UPDATABLE-+---------+ | .-java.sql.ResultSet.CLOSE_CURSORS_AT_COMMIT--. | +-holdability--=--+-java.sql.ResultSet.HOLD_CURSORS_OVER_COMMIT-+-+ | .-java.sql.ResultSet.TYPE_FORWARD_ONLY-------. | '-type--=--+-java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE-+---------' '-java.sql.ResultSet.TYPE_SCROLL_SENSITIVE---' >--+------------------------------------------------------------------------------------------+--> '-@Handler--(--+-parameterHandler--=--class-name--------------------------------------+--)-' +-resultHandler--=--class-name--+------------------------------------+-+ | '-,--parameterHandler--=--class-name-' | '-rowHandler--=--class-name--+------------------------------------+----' '-,--parameterHandler--=--class-name-' >--modifiers--return-type--method-name--(--+-----------------------+--+------------------------------------+--);->< '-handler--handler-name-' | .-,------------------------------. | | V | | '---parameter-type--parameter-name-+-'
例
@Select (sql="select PUBLISHER_ID, BOOK_NAME, BOOK_ID, COUNTY from BOOKS WHERE STATE='CALIFORNIA'") @Cursor (concurrency = ResultSet.CONCUR_READ_ONLY, type=ResultSet.TYPE_FORWARD_ONLY, holdability=ResultSet.HOLD_CURSORS_OVER_COMMIT) Iterator<Books> getBooksInCaliforniaAndNameCursor ();
以下の構文は、位置指定更新および削除を実行するためのアノテーション付きメソッドを宣言する場合に使用します。@Cursor アノテーションを使用する場合、java.sql.ResultSet をインターフェースにインポートする必要があります。
位置指定更新および削除のアノテーション付きメソッドの作成に関する情報については、位置指定更新および削除の実行を参照してください。
位置指定更新または削除用のカーソルを開き、名前を設定する SELECT ステートメントを実行するメソッドの構文
>>-@Select--(--sql--=--"--SQL-statement--"--)-------------------> >--+------------------------------------------------------------------------------------------------------------------------------+--> | .-,-----------------------------------------------------------------------. | | V (1) .-java.sql.ResultSet.CONCUR_READ_ONLY-. | | '-@Cursor--(--cursorName--=--"--cursor-name--"--------+-concurrency--=--+-java.sql.ResultSet.CONCUR_UPDATABLE-+---------+-+--)-' | .-java.sql.ResultSet.CLOSE_CURSORS_AT_COMMIT--. | +-holdability--=--+-java.sql.ResultSet.HOLD_CURSORS_OVER_COMMIT-+-+ | .-java.sql.ResultSet.TYPE_FORWARD_ONLY-------. | '-type--=--+-java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE-+---------' '-java.sql.ResultSet.TYPE_SCROLL_SENSITIVE---' >--+---------------------------------------------------------------------------------------+--> '-@Handler--(--+-parameterHandler--=--class-name-----------------------------------+--)-' '-rowHandler--=--class-name--+------------------------------------+-' '-,--parameterHandler--=--class-name-' >--modifiers--+-Iterator-----------+--method-name--(--+-----------------------+--+------------------------------------+--);->< '-java.sql.ResultSet-' '-handler--handler-name-' | .-,------------------------------. | | V | | '---parameter-type--parameter-name-+-'
名前付きカーソルを使用する UPDATE または DELETE ステートメントを実行するメソッドの構文
>>-@Update--(--sql--=--"--SQL-statement--"--,--positionedCursorName--=--"--cursor-name--"--)--> >--+-------------------------------------------------+----------> '-@Handler--(--parameterHandler--=--class-name--)-' >--modifiers--return-type--method-name--(--+-----------------------+--+------------------------------------+--);->< '-handler--handler-name-' | .-,------------------------------. | | V | | '---parameter-type--parameter-name-+-'
例
以下に示すのは、位置指定更新および削除用のカーソルを開く SELECT ステートメントを実行するメソッドの構文例です。
@Select (sql="select PUBLISHER_ID, BOOK_NAME, BOOK_ID, COUNTY from BOOKS WHERE STATE='CALIFORNIA' FOR UPDATE OF PUBLISHER_ID") @Cursor (concurrency = ResultSet.CONCUR_UPDATABLE, type=ResultSet.TYPE_FORWARD_ONLY, holdability=ResultSet.HOLD_CURSORS_OVER_COMMIT, cursorName="TESTCURSORITER") Iterator<Books> getBooksInCaliforniaAndNameCursor ();
以下に示すのは、カーソルを使用する UPDATE ステートメントを実行するメソッドの構文例です。
@Update (sql="update BOOKS SET PUBLISHER_ID = :publisher_id", positionedCursorName = "TESTCURSORITER") int updateBooksByUsingNamedCursor (Book b);
pureQuery では、以下のいずれかの条件が真の場合に、ステートメントを更新可能とみなします。
繰り返し型の引数ペアで、メソッド起動時に期待される引数の型と名前を示します。
こうしたパラメーターは、以下の規則に従って、SQL ステートメントで指定されるパラメーター・マーカーと突き合わされます。こうしたパラメーターは、スカラー型、Bean クラス、または Map オブジェクトが可能です。SQL のパラメーター参照に :name 表記が使用されている場合には、最初の parameter-type は Bean または Map でなければなりません。 Bean または Map のプロパティー名が、SQL ストリング内での :name の出現箇所との突き合わせに使用されます。
SQL で ? 表記がパラメーター参照に使用されている場合には、スカラー値だけを指定できます。
?n および ?n.name 表記が使用される場合には、メソッド・パラメーターをすべてスカラー型にするか、Bean クラスと Map オブジェクトの組み合わせにする必要があります。
通常、指定のパラメーターは入力変数にのみ使用されます。ただし、SQL CALL ステートメントの OUT パラメーターまたは INOUT パラメーターの場合には、出力変数を表す場合があります。詳しくは、CALL ステートメントのサポートについて取り上げた前述のセクションを参照してください。
以下の表には、@Call、@Select、および @Update の各アノテーションを使用するメソッドで可能な戻りの型が示されています。
省略形 | 意味 |
---|---|
CAL | CallHandlerWithParameters |
I | Iterator |
L | List |
M | Map |
O | Object |
R | java.sql.ResultSet |
RES | ResultHandler |
ROW | RowHandler |
S | String |
SPR | StoredProcedureResult |
T | プリミティブ型 int、プリミティブ Java 型のラッパー・クラス、単純な Object 型、または Bean。T を int にできるのは @Update アノテーションの場合だけで、@Update アノテーションでは T を int にする必要があります。 |
アノテーション | ||||
---|---|---|---|---|
@Call | @Select | @Update | ||
戻りの型 | CAL | ✓ | ||
int | ✓ | |||
int[] | ✓ | |||
I<M<S,O>> | ✓ | ✓ | ||
I<T> | ✓ | ✓ | ||
L<M<S,O>> | ✓ | ✓ | ||
L<T> | ✓ | ✓ | ||
M<S,O> | ✓ | |||
M<S,O>[] | ✓ | ✓ | ||
R | ✓ | |||
RES | ✓ | |||
ROW | ✓ | |||
ROW[] | ✓ | |||
L<ROW> | ✓ | |||
I<ROW> | ✓ | |||
SPR | ✓ | |||
<T> | ✓ | |||
<T>[] | ✓ | ✓ | ||
void | ✓ | ✓ |
アノテーション付きメソッドを使用する場合は、@Select または @Call がプリミティブ Java タイプ、つまり Array、List、または Iterator を戻すことを指定しないでください。
SQL NULL 値に関する情報は、SQL から照会された情報がプリミティブ Java タイプに格納されると失われます。 さらに、Java は、<primitive Java type>.class の汎用 <T> クラスを指定する汎用メソッドが、そのプリミティブ Java タイプに適したラッパー・クラスのインスタンスを戻すように要求します。
int tCount = myGenericMethod( int.class );ここで、以下は myGenericMethod の定義です。
<T> T myGenericMethod( Class<T> cl );
Integer tCount = myQuery.myGenericMethod( Integer.class );
アノテーション付きインターフェースで定義されたメソッド・シグニチャーで、汎用メソッド・シグニチャーを明示的に使用しない (<T> および戻りクラス情報は使用しない) 場合であっても、この制約事項は汎用メソッドの使用に関連します。アノテーション付きインターフェースの生成済みインプリメンテーションでは、インライン・メソッド API と一部の面で類似したメソッドを使用しているために、この制約事項が必要とされます。特に、このインプリメンテーションでは汎用メソッドを使用します。
基礎となるデータベース ResultSet オブジェクトは閉じられます。
<T> オブジェクトが CALL ステートメントによって戻されると、そのオブジェクトに追加されたデータのソースは、ストアード・プロシージャーが戻す最初の ResultSet オブジェクトになります。
<T> オブジェクトが SELECT ステートメントによって戻される場合には、そのオブジェクトに追加されるデータのソースは照会結果です。
Map<String,Object> オブジェクトが CALL ステートメントによって戻されると、そのオブジェクトに追加されたデータのソースは、ストアード・プロシージャーが戻す最初の ResultSet オブジェクトになります。
Map<String,Object> オブジェクトが SELECT ステートメントによって戻される場合には、そのオブジェクトに追加されるデータのソースは照会結果です。
基礎となるデータベース ResultSet オブジェクトは閉じられます。
基礎となるデータベース ResultSet オブジェクトは閉じられます。
スカラーまたは Bean が戻されることを指定します。スカラーは、Double などのラッパー、または String、Date、Timestamp にすることができます。
提供された SQL ステートメントが照会であり、複数の行が該当する場合、最初の行からの値が戻されます。
基礎となるデータベース ResultSet オブジェクトは閉じられます。
Map<String,Object> オブジェクトの Iterator が戻されることを指定します。詳しくは、戻される Map<String,Object> オブジェクトの説明を参照してください。
照会結果行は、Iterator でそれぞれの next() 操作をアプリケーションが実行する際にデータ・ソースから取り出されます。
pureQuery における反復子のタイプは ResultIterator です。使用し終えたら、ResultIterator.close() メソッドでそれらの反復子を閉じる必要があります。
Iterator オブジェクトが、行に対応する各エレメントとともに戻されることを指定します。 パラメーター化されたタイプ T を指定する必要があります。
照会結果行は、Iterator でそれぞれの next() 操作をアプリケーションが実行する際にデータ・ソースから取り出されます。
<T> オブジェクトが CALL ステートメントによって戻されると、そのオブジェクトに追加されたデータのソースは、ストアード・プロシージャーが戻す最初の ResultSet オブジェクトになります。
<T> オブジェクトが SELECT ステートメントによって戻される場合には、そのオブジェクトに追加されるデータのソースは照会結果です。
pureQuery における反復子のタイプは ResultIterator です。使用し終えたら、ResultIterator.close() メソッドでそれらの反復子を閉じる必要があります。