Mybatis 구성을 하다보면 if
문 또는 choose
when
을 통해 쿼리를 동적으로 구성하고 결과를 받는 경우가 종종 있는데, 보통 NULL
체크용도로만 사용해서 크게 불편함 없이 사용했지만 최근에 동적으로 비교에 따른 쿼리 작성으로 숫자나 문자열을 비교하면서==
equals
비교 등이 헷갈리게 되어 많은 에러를 뱉게 되었다. 이번 기회에 각 케이스별로 실행해보고 결과를 정리해보고자 한다.
문자열 비교
* 어떤 비교를 하던지 null체크를 먼저 합니다.
1. 'param.equals()' --------- 정상 동작
<if test="name != null and 'name.equals(비교할 문자열)'">
column = #{name}
</if>
<if test='name != null and "name.equals(비교할 문자열)"'>
column = #{name}
</if>
2. ' 비교대상=="" ' 싱글쿼터로 감싸고 더블쿼터로 비교 --------- 정상 동작
<if test='name != null and name=="비교할 문자열"'>
column = #{name}
</if>
3. " 비교대상=='' " 더블쿼터로 감싸고 싱글쿼터로 비교 --------- 정상 동작
<if test="name != null and name=='비교할 문자열'">
column = #{name}
</if>
4. Null이 아니거나 공백이 아닌지 체크 (" =='' ", ' =="" ' 둘다 가능하다)
<if test="name != null and name! = ''">
column = #{name}
</if>
예전 기억으로는 문자열 비교도 정상비교가 안되는 케이스가 존재했던것으로 기억하는데 한글 비교시에도 문자열은 어느방식이든 문제가 없는것을 확인하였다.
문자(char) 비교
문자 단어의 길이가 한개로 지정한 경우입니다.
Map<Object, Object> params = new HashMap<Object, Object>();
params.put("type", "1");
1. ' 비교대상.equals("") ' --------- 정상 동작
<if test= 'type != null and type.equals("1")'> <!-- 성공 -->
d_type = #{type}
</if>
2. " 비교대상.equals('') " --------- 문법에러는 없지만 비교 안됨
<if test= "type != null and type.equals('1')"> <!-- 비교 안됨 -->
d_type = #{type}
</if>
3. " 비교대상=='' " --------- 문법에러는 없지만 비교 안됨
<if test= "type != null and type == '1'"> <!-- 비교 안됨 -->
d_type = #{type}
</if>
4. ' 비교대상=="" ' --------- 정상 동작
<if test= 'type != null and type == "1"'> <!-- 성공 -->
d_type = #{type}
</if>
5. Null이 아니거나 공백이 아닌지 체크 (" =='' ", ' =="" ' 둘다 가능하다)
<if test= "type != null and type != ''">
d_type = #{type}
</if>
주의 사항으로 자바단에서 데이터 셋을 하는부분에서 한개의 워드를 싱글쿼드('')로 감싸게 되면 위의 기능이 정상적으로 동작하지 않는다. ex)params.put("type", '1');
숫자 비교
<if test= "idx != null and idx == 2">
d_idx = #{idx}
</if>