SQL문의 매개변수 표시문자

데이터베이스에 대해 실행되는 메소드의 매개변수를 참조하기 위해 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은 양의 정수 리터럴을 표시합니다.
  • 인라인 메소드에 사용되는 경우, ?nObject... 매개변수의 값을 포함하는 Object[ ]에서 (n-1)번째 항목과 일치합니다.
  • 어노테이션이 있는 메소드에 사용되는 경우, ?n은 어노테이션이 있는 메소드의 n번째 매개변수와 일치합니다.
       @Select(sql="SELECT * FROM Employee WHERE salary>?1")
       Iterator<Customer> getCustomersInRegion(BigDecimal r);
동일한 순서 표시문자를 SQL문에 두 번 이상 사용할 수 있습니다.
:name
해당 표시문자는 ?1.name의 축약 버전입니다.
?n.name
해당 표시문자는 java.util.Map<String> 오브젝트 또는 Bean을 참조해야 하는 메소드 매개변수 ?n을 참조합니다. namejava.util.Map<String> 오브젝트 또는 Bean 내에서 특성을 참조해야 합니다.
식별된 매개변수가 java.util.Map<String>인 경우, pureQuery가 호출하는 메소드는 매개변수가 사용되는 방법에 따라 다릅니다.
  • 입력 매개변수: pureQuery는 MapObject get(String) 메소드를 호출하여 SQL문에 전달할 값을 얻습니다. get() 메소드에 대한 호출에서 String의 값은 ?n 뒤에 오는 이름입니다.
  • 출력 매개변수: pureQuery는 MapObject put(String, Object) 메소드를 호출하여 이름 지정된 키와 연관된 값을 리턴합니다. put()에 대한 호출에서 String 키의 값은 ?n 뒤에 오는 이름입니다.
  • 입력 매개변수 및 출력 매개변수: SQL문이 실행되기 전에 pureQuery는 MapObject get(String) 메소드를 호출합니다. SQL문이 실행된 후, pureQuery는 MapObject put(String, Object) 메소드를 호출합니다.

키로 사용되는 문자열은 모두 매개변수 표시문자의 이름에서 비롯되므로(접두부가 : 또는 ?n 여부와 관계없이), 이름은 Java 소스 ID로 간주되며 원래의 대소문자로 get() 및 mutator 메소드에 전달됩니다.

식별된 매개변수가 Bean인 경우, 분석 프로세스는 더 복잡합니다.
  • 매개변수가 입력 매개변수로 사용되는 경우, pureQuery는 다음 프로세스를 수행합니다.
    1. Bean 인터페이스가 공용 getXXX() 메소드에 대해 검사됩니다. 여기서 ID의 XXX 부분은 ?n 뒤에 오는 이름의 첫 번째 문자를 먼저 대문자화한 후 해당 이름에서 생성됩니다. 이러한 메소드가 있는 경우, 해당 메소드는 SQL문에 전달할 값을 얻는 데 사용됩니다.
    2. getXXX() 메소드가 없는 경우, Bean은 이름이 ?n 뒤에 오는 이름과 일치하는 공용 특성에 대해 검사됩니다. 이러한 특성이 있는 경우, 해당 특성에 직접 액세스하여 SQL문에 전달할 값을 얻습니다.
    3. 공용 특성이 없는 경우, Bean 인터페이스는 공용 Object get(String) 메소드에 대해 검사됩니다. 이러한 메소드가 있는 경우, 해당 메소드는 SQL문에 전달할 값을 얻는 데 사용됩니다. 여기서 String 매개변수에 대해 전달되는 값은 ?n 뒤에 오는 이름입니다.
    4. get(String) 메소드가 없는 경우, 오류가 보고됩니다.
  • 매개변수가 출력 매개변수로 사용되는 경우, pureQuery는 다음 프로세스를 수행합니다.
    1. Bean 인터페이스가 공용 setXXX() 메소드에 대해 검사됩니다. 여기서 ID의 XXX 부분은 ?n 뒤에 오는 이름의 첫 번째 문자를 먼저 대문자화한 후 해당 이름에서 생성됩니다. 이러한 메소드가 있는 경우, 해당 메소드는 Bean 매개변수의 연관된 특성을 갱신하는 데 사용됩니다.
    2. setXXX() 메소드가 없는 경우, Bean은 이름이 ?n 뒤에 오는 이름과 일치하는 공용 특성에 대해 검사됩니다. 이러한 특성이 있는 경우, 해당 특성은 직접 수정되어 Bean의 연관된 특성을 갱신합니다.
    3. 공용 특성이 없는 경우, Bean 인터페이스는 공용 void set(String, Object) 메소드에 대해 검사됩니다. 이러한 메소드가 있는 경우, 해당 메소드는 Bean의 연관된 특성을 갱신하는 데 사용됩니다. 여기서 String 매개변수에 대해 전달되는 값은 ?n 뒤에 오는 이름입니다.
    4. 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의 대소문자를 알아야 합니다.


피드백