데이터베이스에 대해 실행되는 메소드의 매개변수를 참조하기 위해
SQL문에 사용할 수 있는 여러 가지 다른 표시문자가 있습니다.
SQL문은 런타임 시 해당 명령문을 사용하는 메소드의
매개변수에 전달되는 값을 사용할 수 있습니다. SQL문은
이러한 매개변수를 표시문자로 표시합니다. 각 표시문자는
메소드의 매개변수에 해당합니다.
메소드가 호출될 때 이러한 매개변수의 값은
호출 응용프로그램에서 제공하고 SQL문의 실행 중에 사용되는
인수에서 얻습니다.
SQL문에 사용할 수 있는
여러 가지 유형의 표시문자가 있습니다.
- ?
- 이러한 표시문자는 위치에 따른 메소드의 매개변수와 일치합니다.
- 인라인 메소드에 사용되는 경우, n번째 ? 표시문자는
Object... 매개변수의 값을 포함하는 Object[
]에서 (n-1)번째 항목과 일치합니다.
- 어노테이션이 있는 메소드에 사용되는 경우, n번째 ? 표시문자는
어노테이션이 있는 메소드의 n번째 매개변수와
일치합니다.
@Select(sql="select DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION from DEPARTMENT where DEPTNO = ?")
Iterator<Department> getDepartment(String deptno);
@Update(sql="insert into DEPARTMENT (DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION) values( ?, ?, ?, ?, ?)")
int createDepartment(String deptno, String deptname, String mgrno, String admrdept, String location);
@Update(sql="update DEPARTMENT set DEPTNO = ?, DEPTNAME = ?, MGRNO = ?, ADMRDEPT = ?, LOCATION = ? where DEPTNO = ?")
int updateDepartment(String deptno, String deptname, String mgrno, String admrdept, String location, String deptno_K);
- 이 유형의 표시문자를 사용하는 경우, SQL문의 모든 다른 표시문자도
이 유형이어야 합니다.
- ?n
- 이러한 표시문자는 위치에 따른 메소드의 매개변수와
일치합니다. 여기서 n은 양의 정수 리터럴을 표시합니다.
- 동일한 순서 표시문자를 SQL문에 두 번 이상 사용할 수 있습니다.
- :name
- 해당 표시문자는 ?1.name의 축약 버전입니다.
- ?n.name
- 해당 표시문자는 java.util.Map<String> 오브젝트 또는
Bean을 참조해야 하는 메소드 매개변수 ?n을
참조합니다. name은
java.util.Map<String> 오브젝트 또는
Bean 내에서 등록 정보를 참조해야 합니다.
식별된 매개변수가
java.util.Map<String>인 경우,
pureQuery가 호출하는 메소드는 매개변수가 사용되는 방법에 따라
다릅니다.
- 입력 매개변수: pureQuery는 Map의 Object
get(String) 메소드를 호출하여 SQL문에 전달할 값을
얻습니다. get() 메소드에 대한 호출에서 String의 값은
?n 뒤에 오는 이름입니다.
- 출력 매개변수: pureQuery는 Map의 Object
put(String, Object) 메소드를 호출하여 이름 지정된 키와 연관된 값을
리턴합니다. put()에 대한 호출에서 String 키의 값은
?n 뒤에 오는 이름입니다.
- 입력 매개변수 및 출력 매개변수: SQL문이 실행되기 전에
pureQuery는 Map의 Object
get(String) 메소드를 호출합니다. SQL문이 실행된 후, pureQuery는
Map의 Object put(String, Object) 메소드를 호출합니다.
키로 사용되는 문자열은
모두 매개변수 표시문자의 이름에서 비롯되므로(접두부가 : 또는 ?n 여부와 관계없이),
이름은 Java 소스 ID로 간주되며 원래의 대소문자로
get() 및 mutator 메소드에 전달됩니다.
식별된 매개변수가
Bean인 경우, 분석 프로세스는 더 복잡합니다.
- 매개변수가 입력 매개변수로 사용되는 경우, pureQuery는
다음 프로세스를 수행합니다.
- Bean 인터페이스가 공용 getXXX() 메소드에 대해
검사됩니다. 여기서 ID의 XXX 부분은
?n 뒤에 오는 이름의 첫 번째 문자를
먼저 대문자화한 후 해당 이름에서 생성됩니다. 이러한 메소드가 있는 경우,
해당 메소드는 SQL문에 전달할 값을 얻는 데 사용됩니다.
- getXXX() 메소드가 없는 경우,
Bean은 이름이 ?n 뒤에 오는 이름과 일치하는
공용 등록 정보에 대해 검사됩니다. 이러한 등록 정보가 있는 경우, 해당 등록 정보에 직접 액세스하여
SQL문에 전달할 값을 얻습니다.
- 공용 등록 정보가 없는 경우, Bean 인터페이스는
공용 Object get(String) 메소드에 대해 검사됩니다. 이러한 메소드가
있는 경우, 해당 메소드는 SQL문에 전달할 값을 얻는 데
사용됩니다. 여기서 String 매개변수에 대해 전달되는 값은
?n 뒤에 오는 이름입니다.
- get(String) 메소드가 없는 경우, 오류가
보고됩니다.
- 매개변수가 출력 매개변수로 사용되는 경우,
pureQuery는 다음 프로세스를 수행합니다.
- Bean 인터페이스가 공용 setXXX() 메소드에 대해
검사됩니다. 여기서 ID의 XXX 부분은
?n 뒤에 오는 이름의 첫 번째 문자를
먼저 대문자화한 후 해당 이름에서 생성됩니다. 이러한 메소드가 있는 경우,
해당 메소드는 Bean 매개변수의 연관된 등록 정보를 갱신하는 데 사용됩니다.
- setXXX() 메소드가 없는 경우,
Bean은 이름이 ?n 뒤에 오는 이름과 일치하는
공용 등록 정보에 대해 검사됩니다. 이러한 등록 정보가 있는 경우, 해당 등록 정보는 직접 수정되어
Bean의 연관된 등록 정보를 갱신합니다.
- 공용 등록 정보가 없는 경우, Bean 인터페이스는
공용 void set(String, Object) 메소드에 대해 검사됩니다. 이러한 메소드가
있는 경우, 해당 메소드는 Bean의 연관된 등록 정보를 갱신하는 데
사용됩니다. 여기서 String 매개변수에 대해 전달되는 값은
?n 뒤에 오는 이름입니다.
- set(String, Object) 메소드가 없는 경우, 오류가
보고됩니다.
- 매개변수가 입력 매개변수와 출력 매개변수 둘 다로 사용되는 경우,
SQL문이 실행되기 전에 입력에 대해 위에서 설명한 매개변수를 분석하는
프로세스가 수행되고 SQL문이 실행된 후 출력에 대해 위에서 설명한
프로세스가 수행됩니다.
또한 키로 사용되는 문자열은 모두
매개변수 표시문자의 이름에서 비롯되므로(접두부가 : 또는 ?n 여부와 관계없음),
이름은 Java 소스 ID로 간주되며 원래의 대소문자로
get(String) 및 set(String) 메소드에
전달됩니다.
Map과 Bean은
매개변수의 소스로 사용될 뿐만 아니라 쿼리를 통해 선택된 행에서 구성될 수도
있습니다. pureQuery가 행에서 Map 또는 Bean을 구성하는 경우,
get(String) 메소드, set(String, Object) 메소드 및
put(String, Object) 메소드의 키에 사용되는 문자열 값은
SQL 소스 ID(선택된 컬럼 레이블의)이며 소문자입니다. Bean의 선택적 get(String) 메소드나
set(String, Object) 메소드 또는 Map의 get(String) 및 put(String,
Object) 메소드를 구현하거나 사용하는 경우, 키로 사용되는 ID의 대소문자를
알아야 합니다.