Mybatis는 동적(Dynamic) 태그 기능을 통해서 SQL을 파라미터들의 조건에 맞게 조정할 수 있는 기능을 제공한다.
Mybatis의 동적 태그는 약간의 구문을 이용해서 전달되는 파라미터를 가공해서 경우에 따라 다른 SQL을 만들어서 실행할 수 있다.
Mybatis의 동적 태그
○ if
'test'라는 속성과 함께 특정한 조건이 true가 되었을 때 포함된 SQL을 사용하고자 할 때 작성한다.
보통 검색을 할 때, 조건이 주어진다. 예를 들어 그 조건에는 제목, 내용, 작성자가 있다. 그래서 조건을 설정하고 조건에 맞는 데이터를 조회하고 싶을 때 사용한다.
Ex)
- 검색 조건이 'T'면 제목(title)이 키워드인 항목을 검색
- 검색 조건이 'C'면 내용(content)이 키워드인 항목을 검색
- 검색 조건이 'W'면 작성자(writer)가 키워드인 항목을 검색
<if test="type == 'T'.toString()"> // 제목을 조건으로 검색할 때.
(title list '%'||#{keyword}||'%')
</if>
<if test="type == 'C'.toString()"> // 내용을 조건으로 검색할 때.
(content list '%'||#{keyword}||'%')
</if>
<if test="type == 'W'.toString()"> // 작성자를 조건으로 검색할 때.
(writer list '%'||#{keyword}||'%')
</if>
○ choose(when, otherwise)
choose는 if와 달리 여러 상황들 중 하나의 상황에서만 동작한다. Java의 'if ~ else' 구문이나 JSTL의 <choose>와 유사하다.
<choose>
<when test="type == 'T'.toString()">
title list '%'||#{keyword}||'%'
</when>
<when test="type == 'C'.toString()">
content list '%'||#{keyword}||'%'
</when>
<otherwise>
writer list '%'||#{keyword}||'%'
</otherwise>
</choose>
<otherwise>는 위 모든 조건이 충족되지 않을 경우에 사용한다.
○ trim(where,set)
trim, where, set은 단독으로 사용되지 않고 <if>, <choose>와 같은 태그들을 내포하여 SQL들을 연결해주고, 앞 뒤에 필요한 구문들(AND, OR, WHERE 등)을 추가하거나 생략하는 역할을 한다.
<where>의 경우 태그 안쪽에서 SQL이 생성될 때는 WHERE 구문이 붙고, 그렇지 않는 경우에는 생성되지 않는다.
select * from boards
<where>
<if test="idx != null">
idx = #{idx}
</if>
</where>
위 쿼리문들 설명하면 간단하다. idx의 값이 존재하면 <where>를 포함한 쿼리문이 실행된다. 반대로 idx의 값이 존재하지 않으면 <where>는 포함되지 않고 쿼리문을 실행한다.
idx의 값이 존재 O | SELECT * FROM BOARDS WHERE idx = 1 |
idx의 값이 존재 X | SELECT * FROM BOARDS |
<trim>은 하위에서 만들어지는 쿼리문을 조사하여 앞쪽에 추가적인 쿼리문을 넣을 수 있다. <trim>에는 다음과 같은 속성이 있다.
- prefixOverride : 실행될 쿼리의 <trim>문 맨 앞에 해당 문자열이 있다면 지워버림.
SELECT * FROM BOARDS WHERE <trim prefixOverrides="WHERE"> WHERE idx = ${idx}</trim>
- suffixOverride : 실행될 쿼리의 <trim>문 맨 뒤에 해당 문자열이 있다면 지워버림.
<trim suffixOverrides=","></trim>
- prefix : 실행될 쿼리의 <trim>문 안에 가장 앞에 붙일 내용.
UPDATE BOARDS <trim prefix="SET">TITLE = #{title}, CONTENT = #{content}</trim>
- suffix : 실행될 쿼리의 <trim>문 안에 가장 뒤에 붙일 내용.
<trim suffix=")"></trim>
예제
prefix와 suffixOverride 사용 예
UPDATE BOARDS
<trim prefix="SET" prefixOverrides=",">
<if test="idx != null"> idx = #{idx}, </if>
<if test="title != null"> title = #{title}, </if>
<if test="content != null"> content = #{content}, </if>
</trim>
prefix와 prefixOverride 사용 예
SELECT * FROM BOARDS
<trim prefix="WHERE" prefixOverrides="and|or">
<if test="idx != null"> AND idx = #{idx} </if>
<if test="title != null"> OR title = #{title} </if>
<if test="content != null"> AND content = #{content} </if>
</trim>
<set>은 UPDATE 문에 쓰인다. 예를 보면 보다 쉽게 이해할 수 있다.
UPDATE BOARDS
<set>
<if test="title != null">
title = #{title}
</if>
</set>
WHERE idx = #{idx}
○ foreach
foreach는 전달받은 collection 인자 값을 바탕으로 반복적인 쿼리문을 작성할 때 사용한다. 주로 데이터 타입이 같은 다수의 배열 데이터를 검색 조건에 반영해야할 때, OR 또는 IN절에 많이 사용한다.
<foreach>의 속성
- collection : 전달받은 인자를 속성값으로 넣는다. 예를 들어, List, Map, Array 등이 있다.
- item : 전달받은 collection 인자 값을 대체할 이름을 값으로 넣는다.
- open : 구문이 시작할 때 삽입할 문자열을 속성 값으로 삽입한다.
- close : 구문이 종료될 때 삽입할 문자열을 속성 값으로 삽입한다.
- separator : 반복되는 구문 사이에 삽입할 문자열을 속성 값으로 삽입한다.
- index : index의 값을 부를 일종의 변수명을 속성 값으로 삽입한다.
예제
SELECT title, context, id, create_at FROM boards
<where>
<if test="list != null">
id IN
<foreach collection="list" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</if>
</where>
@Test
void 게시물_가져오기2(){
List<String> list = Arrays.asList("wodud","ckdrl");
boardMapper.SearchWithForeach(list).forEach(board -> System.out.println(board));
}
▽ 도움을 주신 분들
[MyBatis] <foreach> 사용법
목표 MyBatis에서 사용하는 사용법 를 왜 사용하고 어떻게 사용하는지를 알아봅니다. 순서 1. 이해 2. 예제 1. 전달받은 collection 인자 값을 바탕으로 반복적인 SQL 구문을 작성할 때 사용합니다. 주
kimvampa.tistory.com
[MyBatis] 동적 쿼리 <trim> 개념 및 문법 총 정리
속성 prefix : 실행될 쿼리의 문 안에 쿼리 가장 앞에 붙여준다. UPDATE board username=#{username},password=#{password} prefixOverrides : 실행될 쿼리의 문 안에 쿼리 가장 앞에 해당하는 문자들이 있으면 자..
java119.tistory.com
04. MyBatis - 동적 쿼리
동적 쿼리 이번 포스트에서는 MyBatis가 가진 멋진 기능중 하나인 동적 쿼리 작성에 대해 살펴보자. 동적 쿼리는 상황에 따라 분기 처리를 통해 SQL을 동적으로 만드는 것이다. 특정 Continent에 속한
goodteacher.tistory.com
[MyBatis] 동적 쿼리 <trim> <where> <set>
MyBatis의 동적쿼리 <trim>에 대해 알아봅니다.
velog.io
+ 코드로 배우는 스프링 웹 프로젝트

'Mybatis' 카테고리의 다른 글
[Mybatis] ${}와 #{}의 차이가 뭘까? (0) | 2022.07.14 |
---|---|
[Mybatis] CDATA가 뭐지? (0) | 2022.07.12 |
JPA와 Mybatis 차이점 (0) | 2022.06.27 |