자바썸
자바랑 썸타는중
자바썸

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
자바썸

자바랑 썸타는중

Mybatis

[Mybatis] 동적 쿼리에 대해 알아보자

2022. 7. 13. 15:31

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
    'Mybatis' 카테고리의 다른 글
    • [Mybatis] ${}와 #{}의 차이가 뭘까?
    • [Mybatis] CDATA가 뭐지?
    • JPA와 Mybatis 차이점
    자바썸
    자바썸

    티스토리툴바