Programing/Spring

iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL

리커니 2017. 8. 30. 18:24
반응형

iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL

 

iBatis 의 업그레이드 버젼이 myBatis 라고 생각 하시면 됩니다.

iBatis 가 Apache 에서 google로 넘어가면서 명칭이 변경된 것이죠.

설정이나 기타 차이점에 대해서는 아래의 Link를 참조하시고,

 

Link : 전자정부프레임워크 iBatis, MyBatis 설정 방식 차이, 비교

 

전자정부프레임워크 iBatis, MyBatis 설정 방식 차이, 비교

전자정부프레임워크 iBatis, MyBatis 설정 방식 차이 MyBatis 의 구버젼인 iBatis 와의 설정 방식 차이에 대해서 알아보겠습니다. (같은 DAO 형태로 사용하는 경우를 예로 설명하겠습니다.) 전자정부프레임워크에..

aljjabaegi.tistory.com

 

이번 포스팅에서는 이 둘의 동적 태그를 비교해서 알아보도록 하겠습니다.

 

우선 iBatis 에서 사용되는 기본 동적 태그(Binary Conditional Tag)는 아래와 같습니다.

여기서 사용되는 속성에는

 

prepend - 태그 조건에 맞아 실행될 sql문에 선행하여 붙을 속성

property - 매개변수 명

compareProperty - 비교할 다른 매개변수명

compareValue - 비교대상이 될 값

 

이 있습니다.

 

 

<iBatis 동적 태그>

 

태그 설명과 예시
<isEqual>  property의 값이 같을때만 태그내 쿼리를 실행합니다.


WHERE 1=1 
<isEqual prepend="AND" property="useYn" compareValue="Y">
        EQUIP_TYPE = 1
</isEqual>


useYn 이 Y 일때만 EQUIP_TYPE =1 조건을 실행합니다.
 <isNotEqual>  property의 값이 같지 않을 때만 태그내 쿼리를 실행합니다.

WHERE 1=1
<isNotEqul prepend="AND" property="useYn" compareValue="N">
            EQUIP_TYPE = 1
</isNotEqual>

useYn 이 N이 아닐 때만 EQUIP_TYPE=1 조건을 실행합니다.
 <isGreaterThan> property의 값이 비교값보다 클경우 쿼리를 실행합니다.

WHERE 1=1
<isGreaterThan prepend="AND" property="age" compareValue="19">
             JOIN_YN = 'Y'
</isGreaterThan>


age 값이 19 보다 클경우 JOIN_YN='Y' 조건을 실행합니다.
 <isGreaterEqual> property의 값이 비교값보다 같거나 클경우 쿼리를 실행합니다.

WHERE 1=1
<isGreaterEqual prepend="AND" property="age" compareValue="18">
              JOIN_YN = 'Y'
</isGreaterEqual>


age 값이 18 이거나 이보다 클경우 JOIN_YN='Y' 조건을 실행합니다.
 <isLessEqual> property의 값이 비교값보다 작거나 같을 경우 쿼리를 실행합니다.

WHERE 1=1
<isLessEqual prepend="AND" property="age" compareValue="18">
            JOIN_YN = 'N'
</isLessEqual>

 

다음은 단일 조건 태그 입니다. (아래부터는 설명을 제외하겠습니다. 위와 비슷하니..)

태그 설명과 예시
 <isPropertyAvailable>  property값이 유효할 경우 쿼리를 실행합니다.
 <isNotPropertyAvailable>  property값이 유효하지 않을 경우 쿼리를 실행합니다.
 <isNull> property값이 null일 경우 쿼리를 실행합니다.
<isNotNull>  property값이 null이 아닐 경우 쿼리를 실행합니다.
<isEmpty>  property값이 비어있을경우 쿼리를 실행합니다.
 <isNotEmpty>  property값이 비어있지 않을 경우 쿼리를 실행합니다.

 

다음은 파라메터 조건 태그 입니다.

태그 설명과 예시
 <isParameterPresent>  파라메터가 있을 경우 쿼리를 실행합니다.

<isParameterPresent prepend="WHERE">           
    1=1
</isParameterPresent>


파라메터값이 넘어왔을 경우에만 WHERE 조건 붙음
<isNotParameterPresent>  파라메터값이 없을 경우 쿼리를 실행합니다.

WHERE 1=1<isNotParameterPresent prepend="AND">
         TYPE = 'DEFAULT'
<isNotParameterPresent>


파라메터값이 없을 경우에만 TYPE = 'DEFAULT' 쿼리 실행

 

iterate 태그

파라메터로 배열을 넘겨 IN 쿼리문을 사용할 때 유용합니다.

태그 설명과 예시
 <iterate> 배열 타입의 파라메터를 받을 때 활용합니다.

WHERE 1=1
<isNotEmpty prepend="AND" property="empIdArray">
       EMP_ID IN
<iterate open="(" close=")" conjunction="," property="empIdArray">
       #empIdArray[]#
</iterate>
</isNotEmpty>


배열의 값을 빼내어 콤마로 구분하여 괄호 '(' , ')' 내에 넣게 되죠.
ex) ('111', '222', 333', '444') 

 

dynamic 태그

태그 설명과 예시
 <dynamic> 하위 태그에 일치되는 내용이 존재할 경우 where절을 붙인다.
가장 처음 일치요소의 prepend="AND" 는 생략된다.

<dynamic prepend="WHERE">
        <isEqual prepend="AND" property="empId" comapareValue="123">
                    VACATION = 'TRUE'
        </isEqual>
</dynamic>


empId 파라메터 값 123이라면 <isEqual>태그의 prepend는 생략되고
WHERE 절이 붙어 WHERE VACATION = 'TRUE' 쿼리가 실행된다.

 

이제 iBatis의 동적태그는 모두 알아보았구요.

이제 myBatis의 동적 태그에 대해서 알아보도록 하겠습니다.

 

 

 

 

<myBatis 동적 태그>

 

if 태그

iBatis 의 isEqual, isNotEqaul, isNull, isNotNull, isEmpty, isNotEmpty 를 하나로

 

태그  설명과 예시
 <if> 일반 개발 언어의 if문으로 보시면 됩니다.

WHERE 1=1
<if test="empId != null">

       AND EMP_ID = #{empId}
</if>


if test 후에 문자열에 조건을 넣으시면 됩니다.

 

※ if문 사용 시 주의점.(따옴표 주의) 문자열 비교시 주의점.

<if test="name.equals('kim')"></if>             // 정상 작동하지 않음

<if test='name.equals("kim")'></if>             // 정상 작동

 

 

choose, when otherwise 태그

oracle case문 과 같이 케이스에 따라 조건이 달라질 때

태그 설명과 예시
 <choose>, <when>, <otherwise> Oracle의 case 문과 비슷하다고 보시면 됩니다.

WHERE 1=1<choose>
   <when test = "searchCondition == 'title'">
       AND TITLE LIKE #{title}
   </when>
   <when test = "searchCondition == 'content'">
       AND CONTENT LIKE #{content}
   </when>
   <otherwise>
       AND DEL_YN = 'N'
   </otherwise>

파라메터
searchCondition이 title 이면 AND TITLE LIKE #{title} 을
searchCondition이 content이면 AND CONTENT LIKE #{content} 를
아니면 AND DEL_YN = 'N' 을 조회한다.

 

where, trim 태그

태그 설명과 예시
 <where>, <trim> iBatis의  dynamic과 같이 조건에 따라 where절을 추가 할때 사용

 SELECT COUNT(*)
    FROM MST_USER
    <trim prefix="WHERE" prefixOverrides="AND|OR">
         <if test="id != null">
               AND USER_ID = #{id}
         </if>
         <if test="pw != null">
               AND USER_PW = #{pw}
         </if>
     </trim>

trim태그를 위와 같이 사용하면 맨 첫번째 AND나 OR을 WHERE로 바꾸게 된다.

 

set 태그

태그 설명과 예시
 <set> 동적으로 update 구문을 만들때 사용한다.

UPDATE MST_USER

   <set>
       <if test="email != null">EMAIL = #{email},</if> 
       <if test="address != null">ADDRESS = #{address},</if>
       <if test="phone != null">PHONE = #{phone},</if>
    </set> 
WHERE USER_ID = #{id}


동적으로 set 키워드를 붙히고 불필요한 콤마를 제거한다.
<trim prefix="SET" suffixOverrides=",">
<trim>
와 같다. 

 

foreach 태그

iBatis의 iterate와 비슷한 태그도 존재한다. 반복 기능

태그 설명과 예시
<foreach>  배열 타입의 파라미터를 받을 때 사용한다.
배열이나 리스트의 경우 parameterType="Map" 으로 설정하고
List일 경우 collection="list"
배열일 경우 collection="array" 로 설정.
List나 Array의 경우 Mybatis 내부단에서 Map으로 치환을 함.

<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="empIdArray != null">
      AND EMP_ID IN 
<foreach item="empIdArray" index="index" collection="list" open="(" separator="," close=")">
      #{item}
</foreach>
</if>


배열의 값을 빼내어 콤마로 구분하여 괄호 '(' , ')' 내에 넣게 되죠.
ex) ('111', '222', 333', '444') 
collection : 파라메터로 받은 배열변수의 명칭
item : collection의 alias

 

bind 태그

변수를 만드는 태그

태그 설명과 예시
<bind> 변수를 생성한다.

<bind name="searchKeyword" value="'%'+title+'%'"/>
SELECT *
  FROM BOARD
 WHERE TITLE LIKE #{searchKeyword}


title 파라메터를 받아 searchKeyword라는 변수에 저장하고
이를 쿼리에서 활용할 수 있다.

 

iBatis와 myBatis에서 사용하는 동적 태그들에 대해서 알아보았는데요.

비슷한듯 하면서도 약간의 차이가 있네요.

 

동적 태그를 잘 활용하면 보다 다이나믹한 쿼리를 생성할 수 있습니다.

 

iBatis 참조 : https://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html

myBatis 참조 : http://www.mybatis.org/mybatis-3/ko/index.html

 

반응형