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
반응형