스프링(Spring)에서 동적쿼리(Dynamic Query) 사용 예제 :: 소림사의 홍반장!

where, set

<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </where> </select>

where 요소는 태그에 의해 컨텐츠가 리턴되면 단순히 “WHERE” 만을 추가한다. 게다가, 컨텐츠가 “AND” 나 “OR” 로 시작한다면, 그 “AND” 나 “OR”를 지워버린다.

 

 

다음 예제는 동적인 update 구문의 유사한 경우이다. set 요소는 update 하고자 하는 칼럼을 동적으로 포함시키기 위해 사용될 수 있다. 예를 들어:

<update id="updateAuthorIfNecessary"
       parameterType="domain.blog.Author">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

 여기서 set 요소는 동적으로 SET 키워드를 붙히고, 필요없는 콤마를 제거한다.

 

 

foreach

동적 SQL 에서 공통적으로 필요한 것은 collection 에 대해 반복처리를 하는 것이다. 종종 IN 조건을 사용하게 된다. 예를 들면,

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

foreach 요소는 매우 강력하고 collection 을 명시하는 것을 허용한다. 요소 내부에서 사용할 수 있는 item, index 두가지 변수를 선언한다. 이 요소는 또한 열고 닫는 문자열로 명시할 수 있고 반복간에 둘 수 있는 구분자도 추가할 수 있다.

참고 파라미터 객체로 MyBatis 에 List 인스턴스나 배열을 전달 할 수 있다. 그렇게 하면 MyBatis 는 Map 으로 자동으로 감싸고 이름을 키로 사용한다. List 인스턴스는 “list” 를 키로 사용하고, 배열 인스턴스는 “array” 를 키로 사용한다.

 

 

게시판 검색용 실사용 예

     

<sql id="reboard.where">

      <!-- 동적쿼리(dynamic Query) 작성 -->

            <if test="value != null and value != ''">

                  <foreach item="item" collection="key"

                             open="where" separator="or">

                        ${item} like '%'||#{value}||'%'      

                  </foreach>

            </if>

      </sql>

     

      <select id="getTotSize" resultType="int" parameterType="kr.co.khi.dto.ReboardDto">

            select

            count(no) from reboard

            <include refid="reboard.where"/>

      </select>

 

      <select id="getList" resultType="kr.co.khi.dto.ReboardDto"

            parameterType="kr.co.khi.dto.ReboardDto">

           

            select *

            from (

                  select

                        rank() over(order by ref desc, step asc) r,

                        no, title, writer, depth, wdate, rcount

                   from reboard

                   <include refid="reboard.where"/>

                   )

            where r between #{firstRow} and #{lastRow}

                   

      </select>

다른 카테고리의 글 목록

Dev. 스프링/참고소스 및 예제 카테고리의 포스트를 톺아봅니다