MyBatis 동적 SQL 만들기<choose>,<set>,<if>

LikeChoonsik's·2023년 1월 20일
0

Mysql

목록 보기
20/21
post-thumbnail

MyBatis의 동적 SQL 기능을 사용하면 하나의 SQL문으로 여러 케이스를 처리할 수 있다. 예를 들어 정렬 조건에 따라 ORDER BY 절을 바꿔야 하거나 검색 조건에 따라 WHERE 절을 변경해야 할 경우 동적 SQL 기능을 이용하면 자동으로 변경되는 SQL문을 만들 수 있다.

MyBatis 동적 SQL 종류

<if test="조건">SQL</if>

조건이 참일 경우 SQL문을 반환한다.

<choose>
    <when test="조건1">SQL</when>
    <when test="조건2">SQL</when>
    <otherwise>SQL</otherwise>
<choose> 

검사할 조건이 여러개일 경우 사용|
자바의 if-else문과 유사하다.
일치하는 조건이 없으면 <otherwise>의 SQL이 반환된다.

<where>
    <if test="조건1">SQL</if>
    <if test="조건2">SQL</if>
</where>

SQL문의 WHERE절을 만들때 사용한다.
<where> 안의 조건식에서 일치하는 조건이 있으면 WHERE절을 만들어 반환하고 없으면 만들지 않는다.

<trim prefix="접두어" prefixOverrides="문자열|문자열">
    <if test="조건1">SQL</if>
    <if test="조건2">SQL</if>
</trim>

조건에 따라 SQL이 반환되면 SQL문의 앞부분에서 prefixOverrides에 지정된 문자열과 일치하는 문자열을 제거하고 prefix로 지정한 접두어를 붙인다.

<set>
   <if test="조건1">SQL</if>
   <if test="조건2">SQL</if>
</set>	

UPDATE문의 SET절을 만들때 사용한다.
<set> 안의 조건식에서 일치하는 조건이 있으면 SET절을 만들어 반환하고 없으면 만들지 않는다.
SET절의 항목이 여러 개일 경우 자동으로 콤마(,)를 붙인다.

<foreach
    item="항목"
    index="인덱스"
    collection="목록"
    open="시작문자열"
    close="종료문자열"
    separator="구분자">
</foreach>	

목록형 데이터로 SQL문을 만들때 사용한다.
특히 IN(값, 값, ...) 조건을 만들때 편리하다.

item : 한 개의 항목을 가리키는 변수 이름 지정
index : 인덱스 값을 꺼낼때 사용할 변수 이름 지정
collection : java.util.List 구현체나 배열 객체 지정
open : 최종 반환값의 접두어 지정
close : 최종 반환값의 접미어 지정
separator : 구분자 문자열 지정

<bind name="변수명" value=""/>

변수를 생성할때 사용

<when><if>의 test 속성

test 속성에는 조건을 검사하는 OGNL(Open-Graph Navigation Language) 기반 표현식이 온다.
OGNL은 자바 객체의 프로퍼티 값을 쉽게 꺼내고 할당하기 쉽도록 만든 표현식 언어이다.

MyBatis 동적 SQL -<choose> 사용 예

<select id="selectList" parameterType="map" resultMap="projectResultMap">
    select PNO, PNAME, STA_DATE, END_DATE, STATE
    from PROJECTS
    order by
    <choose>
        <when test="orderCond == 'TITLE_ASC'">PNAME asc</when>
        <when test="orderCond == 'TITLE_DESC'">PNAME desc</when>
        <when test="orderCond == 'STARTDATE_ASC'">STA_DATE asc</when>
        <when test="orderCond == 'STARTDATE_DESC'">STA_DATE desc</when>
        <when test="orderCond == 'ENDDATE_ASC'">END_DATE asc</when>
        <when test="orderCond == 'ENDDATE_DESC'">END_DATE desc</when>
        <when test="orderCond == 'STATE_ASC'">STATE asc</when>
        <when test="orderCond == 'STATE_DESC'">STATE desc</when>
        <when test="orderCond == 'PNO_ASC'">PNO asc</when>
        <otherwise>PNO desc</otherwise>
    </choose>
</select>

<choose>를 사용하여 파라미터 orderCond의 값에 따라 다른 정렬조건을 반환하도록 하는 예이다.

예를 들어 orderCond가 'STATE_ASC'이면 다음과 같이 동적 SQL문이 생성된다.

select PNO, PNAME, STA_DATE, END_DATE, STATE
from PROJECTS
order by STATE asc

MyBatis 동적 SQL - <set> 사용 예

<update id="update" parameterType="map">
    update PROJECTS
    <set>
        <if test="title != null">PNAME=#{title},</if>
        <if test="content != null">CONTENT=#{content},</if>
        <if test="startDate != null">STA_DATE=#{startDate},</if>
        <if test="endDate != null">END_DATE=#{endDate},</if>
        <if test="state != null">STATE=#{state},</if>
        <if test="tags != null">TAGS=#{tags},</if>
    </set>
    where PNO = #{no}
</update>

<set>을 사용하여 update 호출 시 파라미터가 있는 컬럼만 SET절을 만들도록 하는 예이다.
예를 들어 startDate, endDate만 전달되면 다음과 같이 동적 SQL문이 생성된다.

update PROJECTS
SET STA_DATE = #{startDate},
END_DATE = #{endDate}
where PNO = #{no}
profile
춘식이는 너무 귀엽습니다.

0개의 댓글