MyBatis 로 작성한 select 문의 where 절
에서 사용될 검색용 파라미터는
아래와 같은 예외적인 사항이 발생할 수 있습니다.
" "
같이 내부에 아무 값도 없는 문자열List
, Array
가 파라미터의 경우이런 사항들 때문에 주로 MyBatis Where 조건절에서는 <if>
태그를 사용해
쓸 수 없거나 무의미한 파라미터들을 걸러내는 작업을 선행합니다.
저도 일을 하면서 이런 경우가 잦은데요, 지금부터 제가 자주 사용하는 방식을 공유하겠습니다.
참고로 Spring FrameWork 을 사용한다는 전제가 깔려있습니다.
org.springframework.util.*
패키지 내부에는 다양한 유틸성 메소드를 제공하고
MyBatis
로 SQL 작성 시에 상당히 유용합니다 👍
일단 아래와 같은 DTO
를 생성하고, 이걸 MyBatis
의
<select>
태그 속성인 parameterType
의 값으로 사용하겠습니다
package me.dailycode.dto
@Getter // getter, setter 는 lombok 을 사용해서 생성
@Setter
public class ParamDTO {
private Long id;
private String name;
private List<String> codeList;
}
<where>
절<!-- resultType 속성은 주요 관심사가 아니여서 map 을 사용했습니다. -->
<select id="list" parameterType="me.dailycode.dto.ParamDTO" resultType="map">
select *
from test_table
<where>
<if test='@org.springframework.util.StringUtils@hasText(name)'>
AND name = #{name}
</if>
<if test='!@org.springframework.util.CollectionUtils@isEmpty(codeList)'>
AND A.DETAIL_CODE IN
<foreach collection="codeList" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</where>
</select>
<where>
태그는 맨앞에 AND
, OR
가 보이면 이를 동적으로 삭제해줍니다.<if>
태그는 name
이라는 문자열 값이 null, 공백 문자열인지 확인합니다.<if>
태그는 codeList
라는 List
가 null 인지, 빈 List 인지 확인합니다.<if>
태그의 test
속성값 맨 앞에 !
가 있습니다!!추천사항
<if test=''>
속성값은 꼭'(홑따옴표)
로 감싸서 사용하시길 바랍니다.
이렇게 해야 ... 정신건강에 좋습니다 😅
<if test="~~">
❌<if test='~~'>
👍