개발.log/framework
[Mybatis] XML태그 <choose>, <when>, <otherwise>로 동적쿼리 Dynamic SQL 구현하기
개발하는 주디씨
2022. 11. 23. 23:36
자바 인터페이스 Mapper를 통해 쿼리를 구현할 때, 파라미터를 그대로 바인딩해서 사용해야 더 효율적인 쿼리를 구현할 수 있다. 왜냐면... 수정할 때 하나 바꾸면 다 바뀌는 게 좋잖아요? 개발자는... 같은 코드를 반복하지 않지 :)
구조 및 사용법
<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>
<choose> 태그는 <when> 태그와 함께 사용되며, 조건을 여러 번 작성할 수 있다. 실행 시 <when> 태그의 조건식을 순서대로 확인하며 쿼리문을 실행하게 된다. 만약 <when> 태그의 조건 식중 true 반환한 것이 없다면 <otherwise> 태그 내에 작성된 쿼리문이 실행된다. <otherwise> 태그는 생략 가능하다.
적용 예제 XML
<mapper namespace="com.tistory.mybatisStudy.dao.studyDao">
<select id="selectABCD" parameterType="hashMap" resultType="com.tistory.judy.do.util.FrwMap">
<![CDATA[
SELECT /*SQL_ID : com.tistory.mybatisStudy.dao.studyDao.selectABCD(mybatis_Judy)*/
code_exam1
, code_exam2
, code_exam3
FROM JUDY_TABLE
WHERE BASE_YMD = #{BASE_YMD}
]]>
<choose>
<when test = 'SEL_CD != null and SEL_CD == "01"'>
AND TISTORY_CODE = '*'
</when>
<when test = 'SEL_CD != null and SEL_CD == "02"'>
AND TISTORY_CODE = '1'
</when>
<otherwise>
AND TISTORY_CODE = '0'
</otherwise>
</choose>
ORDER BY BASE_YMD
</mapper>
MyBatis <if>태그와 비교해보고
<choose>...<when>태그 이해하기
두 가지 태그의 역할은 해당하는 조건문이 있다는 점에서 동일하다. 하지만 조건식을 탐색하는 과정에서 차이가 있다.
<if>태그 : 조건식이 true일 경우, 다음 조건식을 탐색하여 true인 조건식 모두를 실행.
<choose>태그 : 조건식이 true일 경우, 다음 조건식을 탐색하지 않고 하나의 쿼리만 실행.
⚙️Reference : https://mybatis.org/mybatis-3/ko/sqlmap-xml.html
MyBatis – 마이바티스 3 | 매퍼 XML 파일
Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면
mybatis.org