티스토리 뷰



1) SELECT a.id, a.name FROM 어떤테이블 a WHERE a.id = #id#

2) SELECT a.id, a.name FROM 어떤테이블 a WHERE a.id = $id$

를 놓고 설명을 드리자면 


1)의 경우 iBatis는 다음과 같은 PreparedStatement를 생성해서 사용하게 됩니다.

SELECT a.id, a.name FROM 어떤테이블 a WHERE a.id = ?


따라서 #id#에 설정되는 값이 바뀌어도 위의 PreparedStatement를 재사용하게 되고,

DB입장에서도 이미 컴파일된 SQL을 사용하게 됩니다.


하지만 2)의 경우 iBatis는 $id$를 마치 상수와 같이 처리해서 PreparedStatement를 생성하게 됩니다.

만약 $id$가 1인 경우는

SELECT a.id, a.name FROM 어떤테이블 a WHERE a.id =1

을 생성합니다.


여기서 $id$값이 바뀌어서 2가 되는 경우는

SELECT a.id, a.name FROM 어떤테이블 a WHERE a.id =2

를 또 PreparedStatement로 생성하게 됩니다.


따라서 $를 사용해서 변수를 바인딩하는 경우 해당 변수의 값이 많지 않은 경우에는

바인드할 변수가 없는 PreparedStatement처럼 사용할 수 있기 때문에 수행 능력을 높일 수 있지만,

게시판의 식별자처럼 계속 바뀌는 변수에 대해 사용하는 경우는 오히려 수행 능력이 떨어집니다.


그래서 대부분 테이블 이름과 같이 SQL자체가 바뀌는 경우 혹은 DDL에서 재활용할 부분이 많을 때에 사용합니다.


그리고 다음과 같은 경우에는 #를 사용하면 반드시 에러가 발생하고 $를 반드시 사용해야 합니다.


....

  '' AS CLOSE_CONTENTS 

 FROM OPENQUERY(DOWELL, 'SELECT NAL, 

  SU,  

  REPLACE(PNA, ''\N'', '''') AS PNA, 

  DAN,  

  JKU, 

    MK,  

    PKU, 

    PKNO, 

    SBNO, 

    KCO, 

  BI,  

  JNO, 

  REC 

FROM BT00 

  WHERE KCO = ''$AAAAAA$''

AND PKNO = ''$BBBBB$''

      AND OKU  = ''3''

AND UKU  = ''2''') A 

LEFT JOIN SD_CUSTOM_REMAIN_M  A4 ON A4.SALE_CUST_CODE = A.KCO  

....


위와 같이 문자열 속에 변수를 넣어야 하는 경우에는 #AAAA#를 사용하면 에러가 생기면 반드시 $AAAA$로 사용해야 한다.



2014/02/20 - 프로그램 개발에 유용한 3종 셋트 사이트


2014/02/13 - iBatis에서 ‘#’과 ‘$’ Escape 하기 삽질


2014/02/05 - 전자정부프레임웍에서 ibatis 쿼리 로그 생성


2014/01/25 - iBATIS Insert 시 자동으로 생성된 Key의 참조



'프로그램' 카테고리의 다른 글

MSSQL SELECT문을 이용한 UPDATE  (1) 2014.03.27
자바스크립트의 defer, async  (0) 2014.03.27
MSSQL PRIMARY KEY 제거  (0) 2014.02.25
MSSQL 중복 데이터 확인  (1) 2014.02.25
NoSQL이란 무엇인가? 2번째 이야기  (0) 2014.02.24
댓글