dev_eunz

[MyBatis] 쿼리작성 (동적쿼리, #{} ${} 차이점, CDATA 사용) 본문

IT/프로그래밍

[MyBatis] 쿼리작성 (동적쿼리, #{} ${} 차이점, CDATA 사용)

은그램 2020. 10. 11. 10:16
728x90
반응형

현재 재직중인 회사에서

MyBatis라는 프레임워크를 처음 접해보았다.

 

생각보다 많은 곳에서 사용되고 있던 MyBatis.

 

내가 까먹지 않기 위해서 일단 작성해본다.

 

 

 

1단계.

 

 

아래와 같이 구성되어있는 쿼리가 있다고

 

SELECT *
FROM EXAM_TABLE
WHERE EXAM_1 = 1
    AND EXAM_2 >= 10

 

 

MyBatis 에서는 이대로 바로 사용했다가는, 원하는 결과를 보지 못한다.

 

아래와 같이 수정해서 사용하자.

 

SELECT *
FROM EXAM_TABLE
WHERE EXAM_1 = 1
    AND EXAM_2 <![CDATA[ >= ]]>  10

CDATA 구문을 사용하면, JSP/XML 파일에서 사용시 태그(Tag)로 인식되는 것이 아니라 대괄호([]) 안의 내용을 코드로 인식하게 된다.

 

 

 

2단계.

 

 

쿼리에 원하는 데이터를 넣어 비교하고 싶을 때.

 

SELECT *
FROM EXAM_TABLE
WHERE EXAM_1 =  #{EXAM_1}
    AND EXAM_2 <![CDATA[ >= ]]> ${EXAM_2}

 

#{} 과 ${} 의 차이점

 

#{}

- 보안 측면에서 유리하다.

- 파라미터가 String 형태로 들어온다.

- EXAM_1 = 1 인 경우, #{EXAM_1} =>  '1'

- ( SELECT * FROM EXAM WHERE EXAM_1 = #{EXAM_1} )

 

${}

- 파라미터가 바로 출력된다.

- 사용자의 입력인 경우, '' (String화) 필요하지만 적용되지 않는다.

- 테이블이나 컬럼명 전달시에 효과적.

- ( SELECT ${EXAM_1} FROM EXAM )

 

 

 

 

※ 참고로, 비교대상 데이터의 조건 거는 법

 

데이터가 값이 없으면,

 

EXAM_1 = 

 

==> 오류 발생 !

SELECT *
FROM EXAM_TABLE
WHERE 1=1
<if test = "'EXAM_1 != null and EXAM_1 != ''" > AND EXAM_1 =  #{EXAM_1} </if>

'and'를 소문자로 사용해야함을 잊지 말자.

 

위와 같은 코드를 실행하면,

EXAM_1 데이터가 있을 때에만 해당 구문을 타기 때문파란 부분처럼 처리하는 것이 좋다.

728x90
반응형
Comments