구문 다이어그램 및 구문 요소 설명은 다음 섹션에 있습니다.
구문 다이어그램에서 사용되는 규칙을 이해하려면 구문 다이어그램 읽는 방법을 참조하십시오.
커서를 사용하지 않는 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 표기를 사용하는 경우, 첫 번째 매개변수 유형은 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 | 기본 Java 유형, 단순 오브젝트 유형 또는 Bean의 랩퍼 클래스인 기본 유형 int. T는 @Update 어노테이션이 있는 경우에만 int일 수 있으며 @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 유형이나 기본 Java 유형의 Array, List 또는 Iterator를 리턴하도록 지정하지 마십시오.
SQL에서 쿼리된 정보가 기본 Java 유형으로 저장될 때마다 SQL 널(NULL) 값과 관련된 정보는 유실됩니다. 또한, Java에서는 <기본 Java 유형>.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의 Iterator 유형은 ResultIterator입니다. Iterator 사용 완료 후 ResultIterator.close() 메소드를 사용하여 Iterator를 닫아야 합니다.
각 요소가 행에 해당하는 Iterator 오브젝트가 리턴되도록 지정합니다. 매개변수화된 유형 T를 지정해야 합니다.
응용프로그램이 Iterator에 대해 각 next() 조작을 실행할 때 쿼리 결과 행이 데이터 소스에서 검색됩니다.
<T> 오브젝트가 CALL문에 의해 리턴되는 경우, 오브젝트를 채우는 데이터의 소스는 스토어드 프로시저가 리턴하는 첫 번째 ResultSet 오브젝트입니다.
<T> 오브젝트가 SELECT문에 의해 리턴되는 경우, 오브젝트를 채우는 데이터의 소스는 쿼리의 결과입니다.
pureQuery의 Iterator 유형은 ResultIterator입니다. Iterator 사용 완료 후 ResultIterator.close() 메소드를 사용하여 Iterator를 닫아야 합니다.