반응형

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>
반응형