myBatis 프로젝트를 사용하며 배운점들을 정리한다.
Dynamic Query는 상황에 다라 분기 처리를 통해 동적인 SQL문을 작성할 수 있다.
myBatis는 XML에서 쿼리를 작성하기 때문에 별도의 표기법이 필요하다.
정적쿼리
<select id="findByFaq" resultType="FaqTotalEntity">
SELECT A.FAQ_ID
, A.IS_VIEW
, A.FAQ_TITLE
, A.FAQ_CONTENT
, A.START_DT
, A.END_DT
, B.IMAGE_ID
, B.NAME
, B.PATH
FROM TB_FAQ A
LEFT JOIN TB_FAQ_IMAGE B
ON A.FAQ_ID = B.FAQ_ID
WHERE A.FAQ_ID = #{faqId}
</select>
if, where를 활용한 동적쿼리
<select id="findByTopList" resultType="FaqTotalEntity">
SELECT A.FAQ_ID
, A.VIEW_COUNT
, A.IS_VIEW
, A.ADMIN_ID
, A.FAQ_TITLE
, A.IS_TOP
, A.TOP_ORDER
, A.START_DT
, A.END_DT
, B.PATH
FROM TB_FAQ A
LEFT JOIN TB_FAQ_IMAGE B
ON A.FAQ_ID = B.FAQ_ID
WHERE A.IS_TOP = 'Y'
<if test='isView == "N" or isView == "Y"'>
AND A.IS_VIEW = #{isView}
</if>
<if test="faqTitle != null">
AND A.FAQ_TITLE LIKE CONCAT('%',#{faqTitle},'%')
</if>
<if test="startDt != null">
AND A.START_DT <![CDATA[>=]]> #{startDt}
</if>
<if test="endDt != null">
AND A.END_DT <![CDATA[<=]]> #{endDt}
</if>
ORDER BY
<choose>
<when test="order != null and orderType == 'ASC'">
${order} ASC
</when>
<when test="order != null and orderType == 'DESC'">
${order} DESC
</when>
<when test="order == null and orderType == null">
A.TOP_ORDER
</when>
</choose>
</select>
그외 choose - when - otherwise , trim, where, set 등 다양한 조건식이있다.
#{ }, ${ }의 차이점
위 동적쿼리문에서 orderby의 ${order}를 #{order}로 기존에는 사용하였다.
PostMan으로 API Request를 호출하였다.
그런데 쿼리문이 order by 정렬이 되지않은 상태로 출력되었다.
즉, DB의 결과값고 PostMan의 결과값이 달랐다.
Log상 myBatis의 쿼리문도 정상적으로 날라가는게 보였는데 원인을 찾지 못해 삽질을 시작했다.
그결과
#{ }는 파라미터 값이 ' '로 감싸져들어가고, ${ }는 파라미터 값이 그대로 들어간다.
${ }로 변경하니 정상 출력되었다.
참고사이트 : myBatis 공식홈페이지