본문 바로가기

개발/Framework

[MyBatis] MyBatis 동적 SQL 처리

< MyBatis SQL 처리 >

 

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

 

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

=> XML 기반 JSTL과 같은 형식의 표현식 사용 가능!!

 

 

 

* if

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>
<select id="selectSearchCount" parameterType="hashmap" resultType="_int">
    SELECT
           COUNT(*)
      FROM 
           BOARD
      JOIN
           MEMBER ON (BOARD_WRITER = USER_NO)
     WHERE
           BOARD.STATUS = 'Y'
    <if test="condition == 'writer'" > <!-- parametertype에 map을 적어놨기때문에 키값만 쓰면 됨 -->
        AND USER_ID  
    </if>
    <if test="condition == 'content'">
        AND BOARD_CONTENT      
    </if>
    <if test="condition == 'title'">  
        AND BOARD_TITLE 
    </if>       
        LIKE '%' || #{ keyword } || '%'
</select>

 

 

* choose (when, otherwise)

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>
<select id="selectSearchList" parameterType="hashmap" resultMap="boardResultSet">
    SELECT
           BOARD_NO,
           BOARD_TITLE,
           USER_ID,
           COUNT,
           CREATE_DATE
      FROM
           BOARD B
      JOIN
           MEMBER ON (BOARD_WRITER = USER_NO)
     WHERE
           B.STATUS = 'Y'
    <choose>
        <when test="condition == 'writer'">
           AND USER_ID
        </when>
        <when test="condition == 'title'">
           AND BOARD_TITLE
        </when>
        <otherwise>
           AND BOARD_CONTENT
        </otherwise>		
    </choose> 
           LIKE '%' || #{ keyword } || '%'
     ORDER
        BY
           BOARD_NO DESC
</select>