Mybatis 동적 SQL

일반적으로 검색 기능이나 다중 입력 처리 등을 수행해야 할 경우 SQL을 실행하여 DAO를 여러 번 호출 시키는 방법으로 쿼리를 구현


if 구문

동적 쿼리를 구현할 때 가장 기본적으로 사용되는 구문

특정 조건을 만족할 경우 안의 구문을 쿼리에 포함시킨다.

< 원하는 금액대에 적합한 추천 메뉴 목록 불러오기 >

<select id="selectMenuByPrice" parameterType="hashmap"
		 resultMap="menuResultMap">
 		SELECT
 			   A.MENU_CODE
 			 , A.MENU_NAME
 			 , A.MENU_PRICE
 			 , A.CATEGORY_CODE
 			 , A.ORDERABLE_STATUS
 		  FROM TBL_MENU A
 		 WHERE A.ORDERABLE_STATUS = 'Y'
 		 <if test="price gte 0 and price lte 10000"/>
 		 <!-- gte == [>=] -->
 		 <!-- lte == [<=] -->
 		 <![CDATA[
 		   AND A.MENU_PRICE < #{ price }
 		   ]]>
 		   <if test="price gt 10000 and price lte 20000">
 		   AND A.MENU_PRICE BETWEEN 10001 AND #{ price }
 		   </if>
 		   <if test="price gt 20000 and price lte 30000">
 		   AND A.MENU_PRICE BETWEEN 20001 AND #{ price }
 		   </if>
 		   <if test="price gt 30000">
 		   AND A.MENU_PRICE BETWEEN 30001 AND #{ price }
 		   </if>
 		   ORDER BY A.MENU_CODE
 	</select>

<![CDATA[범위]]> 범위 사이의 내용은 태그를 인식하지 않음

gte == [>=]

lte == [<=] 왼쪽을 기준으로 크기 판별이 가능하다.


choose 구문

Java의 if-else, switch, jstl의 choose구문과 유사

주어진 구문 중 한 가지 만을 수행하고자 할 때 사용한다.

<select id="searchMenuBySupCategory" parameterType="SearchCriteria" 
	resultMap="menuResultMap">
	    SELECT
	           A.MENU_CODE
	         , A.MENU_NAME
	         , A.MENU_PRICE
	         , A.CATEGORY_CODE
	         , A.ORDERABLE_STATUS
	      FROM TBL_MENU A
	     WHERE A.ORDERABLE_STATUS = 'Y'
	     <!-- swith문과 유사한 choose -->
	     <choose>
	     <when test="value == '식사'">
	       AND A.CATEGORY_CODE IN (4, 5, 6, 7)
	     </when>
	     <when test="value == '음료'">
	       AND A.CATEGORY_CODE IN (8, 9, 10)
	     </when>
	     <otherwise>
	       AND A.CATEGORY_CODE IN (11, 12)
	     </otherwise>
	     </choose>
	     ORDER BY A.MENU_CODE
	</select>