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>
'MyBatis' 카테고리의 다른 글
[MyBatis] XML 없이 MyBatis 설정하기 (0) | 2021.11.12 |
---|