티스토리 뷰

반응형

MyBatis에서는 SQL을 동적으로 처리 할 수 있다.

저장 프로시저(stored procedure)를 활용해도 되지만 MyBatis에서 제공하는 기능을 사용해보자.


 

if

 

<select id = "search" resultType="MainDTO" parameterType="Integer">
select * from search_list where seq = #{seq}
  	<if test="title != title">
  		and title = #{title}
  	</if>
  	<if test="contents != contents">
  		and contents = #{contents}
  	</if>
</select>

if의 조건에 맞지 않으면 

select * from search_list where seq = #{seq}

 

title 값이 있으면  

select * from search_list where seq = #{seq} and title = #{title}


title 과 contents 값이 있으면 

select * from search_list where seq = #{seq} and title = #{title} and contents = #{contents}


choose, when, otherwise
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
	select * from search_list where gubn = 'SE'
    <choose>
    	<when test="seq != null">
        	and seq = #{seq}
        </when>
        <when test="title != null and contents != null">
        	and title = #{title} and contents = #{contents}
        </when>
        <otherwise>
      		AND seq = 1
    	</otherwise>
    <choose>
</select>

 

if와는 다르게 자바에서의 switch 구문과 유사하다.

seq, title, cotnets 값이 모두 있을 때

첫번째 when에 걸려서 select * from  where search_list gubn = 'SE' and seq = #{seq} 가 된다. 

모두 해당되지 않으면 otherwise에 걸린다.


 

foreach
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
	select * from search_list where seq in
    	<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        	#{item}
  	</foreach>
</select>

foreach는 동적 SQL에서 반복처리를 해준다.

collection 값으로 Map이나 배열객체와 더불어 List, Set등과 같은 반복가능한 객체를 전달할 수 있다.

index : 현재 몇번째 반복인지

open : 시작 문자

close : 끝 문자 )

separator : 구분자 ,

select * from search_list where seq in (1, 2, 3 .. )


where, trim, set

where

<select id = "search" resultType="MainDTO" parameterType="Integer">
	select * from search_list
    <choose>
    	<when test ="seq !null">
        	where seq = #{seq}        
        <when>
        <when test ="contents !null">
        	where contents = #{contents}        
        <when>
    </choose>
</select>

where은 choose, when, otherwise 내부에서 반복되는 where을 생략해 줄 수 있다.

<select id = "search" resultType="MainDTO" parameterType="Integer">
	select * from search_list
    <where>
      <choose>
          <when test ="seq !null">
              seq = #{seq}        
          <when>
          <when test ="contents !null">
              contents = #{contents}        
          <when>
      </choose>
    </where>
</select>

trim

<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
	select * from search_list where
    <if test="title != title">
    	title = #{title}
    </if>
    <if test="contents != contents">
    	and contents = #{contents}
    </if></select>

위의 쿼리에서 어떤 조건에도 해당 되지 않는다면 (title = null, cotents =null)

select * from search_list where 

오류가 발생 할 것이다.

<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
	select * from search_list
    <trim prefix="WHERE" prefixOverrides="AND | OR ">
      <if test="title != title">
          title = #{title}
      </if>
      <if test="contents != contents">
          and contents = #{contents}
      </if>
      <trim>
</select>

prefix : 쿼리 완성 후 trim 내부에 내용이 있다면 가장 앞에 쓰일 내용

suffix : 쿼리 완성 후 trim 내부에 내용이 있다면 가장 뒤에 쓰일 내용

prefixOverrides : 쿼리 완성 후 trim 내부에 맨 앞에 해당 문자열이 있다면 지움

suffixOverrides : 쿼리 완성 후 trim 내부에  맨 뒤에 해당 문자열이 있다면 지움


set

<update id = "update" parameterType="java.util.HashMap">
	update search_list
    <set>
      <if test="title != title">
          title = #{title}
      </if>
    </set>
    where seq = #{seq}
</update>

set은 update문에서 쓰인다.

update 테이블 set 열 = '변경할값' WHERE 조건 에서 set에 해당된다.


set, trim  활용 - prefix, suffixOverrides 사용

<update id = "update" parameterType="java.util.HashMap">
	update search_list
    <trim prefix="SET" suffixOverrides=",">
      <if test="title != title">
          title = #{title},
      </if>
       <if test="contents != contents">
          title = #{contents},
      </if>
    </trim>
    where seq = #{seq}
</update>

 

반응형
댓글
반응형