MyBatis Dynamic SQL (동적 SQL)
- 어노테이션에 직접 <if> 태그 등을 사용하려면 <script> 태그를 붙여줘야 한다.
- MyBatis는 동적 SQL처리를 지원하기 위해 QGNL(Object-Graph Navigation Language) 기반의 표현식을 사용한다.
CDATA(Character DATA)
- "<"기호는 태그의 시작으로 인식하므로 사용에 주의하여야 한다.
- SQL문 내에서 “<” 기호 등을 쓰고 싶다면 CDATA를 사용한다.
- : 문자로만 판단, [ ] 안에 있는 문장은 파싱되지 않는다. **(마크업 언어(xml)로 해석하지 말아라.)**
- CDATA영역 안의 모든 문장을 문자열로 만들어버리기 때문에 동적 쿼리를 작성하는 데에서는 주의해서 사용해야 한다. (특수문자가 포함된 코드에만 사용)
@Select("""
<script>
<![CDATA[
SELECT *
FROM customers
WHERE CustomerName < 'a';
]]>
</script>
""")
@Select("""
<script>
SELECT *
FROM customers
WHERE CustomerName <![CDATA[ < ]]>'a';
</script>
""")
if
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
- <if test=‘조건식’> </if>
- 조건식이 참인 경우 쿼리문을 실행한다.
test문 따옴표 주의
- test문은 ‘작은따옴표’(싱글쿼테이션) 로 묶는 것이 좋다.
- 문자열을 인식시키기 위해서는 큰 따옴표를 사용한다.
- ‘Y’는 char형식으로 취급되어 숫자 86으로 인식한다. 한 캐릭터의 문자열인 "Y"를 비교하려면 test문을 작은따옴표로 묶은 후, 문자열 등은 큰 따옴표로 묶어주는 것이 좋다.
@Select("""
<script>
SELECT COUNT(*)
FROM customers
<if test='country != null'>
WHERE country = #{country}
</if>
</script>
""")
String select1(String country);
foreach
@Select("""
<script>
SELECT *
FROM customers
WHERE
Country IN
<foreach collection="args" item="elem"
open="(" separator="," close=")">
#{elem}
</foreach>
</script>
""")
- 컬렉션을 반복해야 할 때 사용
- IN 조건을 작성해야 할 때 사용
- collection : 전달 받은 인자(List, Array 형태만 가능)
- item : 전달받은 인자의 값을 alias명으로 대체
- separator : 반복 사이에 배치할 문자열 추가
- open, close : 구문 시작과 끝에 삽입할 문자열 추가
- index : 목록의 위치값(0부터 순차적 증가)
trim
@Select("""
<script>
SELECT *
FROM customers
<trim prefix="WHERE" prefixOverrides="OR">
<foreach collection="args"
item="elem">
OR Country = #{elem}
</foreach>
</trim>
</script>
""")
String select8(List args);
// 실행 쿼리문 : SELECT * FROM customers WHERE Country = ? OR Country = ? OR Country = ?
- prefix : <trim>태그 내부의 쿼리문 가장 앞에 설정값을 붙여준다.
- prefixOverrides : <trim> 태그 내부의 쿼리문 가장 앞의 문자열이 설정값과 같다면 문자열을 지운다.
- suffix : <trim>태그 내부의 쿼리문 가장 뒤에 설정값을 붙여준다.
- prefixOverrides : <trim> 태그 내부의 쿼리문 가장 뒤의 문자열이 설정값과 같다면 문자열을 지운다.
bind
@Select("""
<script>
<bind name="alterKeyword" value="'%' + keyword + '%'" />
SELECT *
FROM customers
WHERE CustomerName LIKE #{alterKeyword}
</script>
""")
String select9(String keyword);
// 실행 쿼리문 : SELECT * FROM customers WHERE CustomerName LIKE %com%
- OGNL 표현식에서 변수를 생성하여 컨텍스트에 바인딩한다. (추가적인 문자열 붙이기)
- name : 지정할 변수 이름
- value : 파라미터 값과 추가 문
작은 따옴표와 큰 따옴표
- String 문자열은 큰 따옴표, 작은따옴표를 포함하여 허용한다.
- Character 문자는 작은 따옴표만 허용한다.
@Select("""
<script>
SELECT * FROM customers
WHERE
<if test="word == 'abc'">
-- word는 abc
</if>
<if test='word == "def"'>
-- word는 def
</if>
<if test="word == 'q'">
-- word는 q (char형식으로 숫자로 인식)
-- NumberformatException 발생
</if>
<if test='word == "k"'>
-- word는 k
</if>
</script>
""")
String select10(String word);
'MyBatis' 카테고리의 다른 글
[MyBatis] Insert 자동 생성된 키 값 얻기 (0) | 2023.10.20 |
---|