Kim VamPa

[MyBatis] <choose>, <when>, <otherwise> 본문

공부/데이터베이스

[MyBatis] <choose>, <when>, <otherwise>

Kim VamPa 2021. 3. 6. 10:10
728x90
반응형

목표

 

MyBatis에서 사용하는 <choose>, <when>, <otherwise> 사용법

 <choose>, <when>, <otherwise>를 왜 사용하고 어떻게 사용하는지를 이해합니다.

 

 

 

순서

1. <choose>, <when>, <otherwise> 이해

2. 예제

 

 

1. <choose>, <when>, <otherwise> 이해

 <if>태그와 같이 조건식이 참일 경우 쿼리문을 실행해주는 역할을 합니다. 다른점은 여러개의 <if>태그 사용경우 조건식이 true를 반환하는 <if>태그는 모두 쿼리문이 실행됩니다. 하지만 <choose> 태그내의 여러개의 <when> 태그문의 경우 조건식이 true를 반환하는 <when>태그를 찾으면 거기서 멈추고 해당 <when>태그의 쿼리만 실행합니다. 다시말해 조건식을 가진 여러개의 <when>태그 오로지 한개의 <when>태그내부 쿼리만 실행됩니다. 대부분의 프로그래밍 언어에서 사용되는 if else와 비슷한 역할을 합니다.

 

 <choose> 태그 안에서 <when>태그와 <otherwise>를 작성합니다. <when>태그는 각각 조건식(test 속성)을 가지며 여러번 작성할 수 있습니다. 실행 시 <when>태그의 조건식을 순서대로 확인하여 true를 반환하는 <when>태그 안의 쿼리문을 실행하게 됩니다. 만약 <when>태그의 조건식중 true 반환한 것이 없다면 <otherwise> 태그 내에 작성된 쿼리문이 실행됩니다. <otherwise>태그는 생략 가능합니다.

 

<choose>
	<when test="조건식1"> 쿼리문1 </when>
    	<when test="조건식2"> 쿼리문2 </when>
    	<when test="조건식3"> 쿼리문3 </when>
    	<when test="조건식4"> 쿼리문4 </when>
	<otherwise> 쿼리문5 </otherwise>
</choose>

 

 

 

2. 예제

 아래는 MyBatis 공식 홈페이지의 <if>태그 예제를 입니다.

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

 아래는 <choose>,<when>을 사용한 예제입니다.

<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
 	 <when test="title != null">
    		AND title like #{title}    
   	 </when>
 	 <when test=test="author != null and author.name != null">
  	  	AND author_name like #{author.name}    
  	 </when>    
  </choose>
</select>

 얼핏 똑같은 역할을 한다고 생각할 수 있습니다. 하지만 결과는 확연히 다릅니다. 위의 <if>태그를 사용한 예제의 경우 <if>태그 조건식 둘다 ture면, 각 <if>태그가 가지고 있는 쿼리문 2개를 모두 실행합니다. 하지만 <choose>,<when>예제의 경우 <when>태그의 조건식이 true이면 다음<when>의 조건식을 탐색하지 않고 하나의 쿼리문만 실행하게됩니다.

 

 

REFERENCE

 

DATE

  • 2020.03.06
728x90
반응형
Comments