본문 바로가기
MyBatis

MyBatis 동적 SQL 사용법

by 지니★ 2021. 7. 23.
728x90
728x90
SMALL
MyBatis 동적 SQL 사용법

 

마이바티스의 가장 강력한 기능 중 하나는 동적 SQL을 처리하는 방법이다.
JDBC나 다른 유사한 프레임워크를 사용해본 경험이 있다면 동적으로 SQL 을 구성하는 것이 얼마나 힘든 작업인지 이해할 것이다.
간혹 공백이나 콤마를 붙이는 것을 잊어본 적도 있을 것이다.
동적 SQL 은 그만큼 어려운 것이다.

동적 SQL 을 사용하는 것은 결코 파티가 될 수 없을 것이다. 마이바티스는 강력한 동적 SQL 언어로 이 상황을 개선한다.

동적 SQL 엘리먼트들은 JSTL이나 XML기반의 텍스트 프로세서를 사용해 본 사람에게는 친숙할 것이다.
이바티스의 이전 버전에서는 알고 이해해야 할 엘리먼트가 많았다.
마이바티스 3 에서는 이를 크게 개선했고 실제 사용해야 할 엘리먼트가 반 이하로 줄었다.
마이바티스의 다른 엘리먼트의 사용을 최대한 제거하기 위해 OGNL 기반의 표현식을 가져왔다.

 

if ?

동적 SQL 에서 가장 공통적으로 사용되는 것으로 where의 일부로 포함될 수 있다.

 

if 사용법
<select id="selectUser" resultType="map">
  SELECT *
    FROM USER
   WHERE STATUS = 'Y'
   <if test="id != null">
     AND ID = #{id}
   </if>
</select>

 

choose, when, otherwise ?

Java의 switch 구문과 유사한 MyBatis에서는 choose 엘리먼트를 제공한다.

 

choose, when, otherwise 사용법
<select id="selectUser" resultType="map">
  SELECT *
    FROM USER
   WHERE 
   <choose>
     <when test="id != null">
       ID = #{id}
     </when>
     <when test="name != null">
       AND NAME = #{name}
     </when>
     <otherwise>
       AND STATUS = 'Y'
     </otherwise>
   </choose>
</select>

 

foreach ?

동적 SQL 에서 공통적으로 필요한 것은 collection 에 대해 반복처리를 하는 것이다.

IN 조건에 사용하게 된다.

 

foreach 사용법
<select id="selectUser" resultType="map">
  SELECT *
    FROM USER
   WHERE STATUS = 'Y'
     AND ID IN
         <foreach collection="idList" index="idx" item="id" open="(" separator="," close=")">
           #{id}
         </foreach>
</select>

 

where ?

where 절에 if 엘리먼트를 사용할 경우, 조건에 따라 문법에 맞지 않는 SQL 이 만들질 수 있다.

이 경우 where 엘리먼트를 사용하여 SQL 을 만들 수 있다.

 

where 사용법
<select id="selectUser" resultType="map">
  SELECT *
    FROM BLOG
   <where>
     <if test="status != null">
       STATUS = #{status}
     </if>
     <if test="id != null">
       AND ID = #{id}
     </if>
     <if test="name != null">
       AND NAME = #{name}
     </if>
   </where>
</select>

 

set ?

where 엘리먼트와 유사하며 update 의 set 에 들어가는 컬럼을 동적으로 포함시킬 때 사용된다.

 

set 사용법
<update id="updateUser">
  UPDATE USER
     <set>
       <if test="name != null"> NAME = #{name}, </if>
       <if test="password != null"> PASSWORD = #{password}, </if>
       <if test="email != null"> EMAIL = #{email} </if>
     </set>
   WHERE ID = #{id}
</update>

 

trim ?

prefix 와 suffix 를 사용하여 시작과 끝에 들어가 문자열을 설정할 수 있으며, prefixOverrides 와 suffixOverrides 를 사용하여 시작과 끝에 제외할 문자열을 설정할 수 있다.

아래 사용법을 이용하면 where 엘리먼트와 set 엘리먼트를 대체할 수 있다.

 

trim 사용법
<trim prefix="WHERE" prefixOverrides="AND|OR">
  ...
</trim>

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

 

728x90
728x90
SMALL

'MyBatis' 카테고리의 다른 글

[MyBatis] XML 없이 MyBatis 설정하기  (0) 2021.11.12

댓글