'dynamic query'에 해당되는 글 2건

  1. 2011.10.18 mybatis 동적쿼리 조건문에 isEmpty, isNotEmpty 를 써보자. 2
  2. 2011.09.06 mybatis dynamic query 조건에서 in 조건 사용하기

mybatis 동적쿼리 조건문에 isEmpty, isNotEmpty 를 써보자.

iBatis 에서 mybatis 로 바뀌면서 바뀐것들 중에 하나가 동적쿼리문에서 쓰는 태그들이다.

iBatis 에 있던 <isEqual/> <isNotEqual/> 요런 것들이

mybatis 에서는 <if test="xxx == 'a'"></if> <if test="xxx != 'a'"></if> 요렇게 대체할 수 있어서 쫌더 간결해 진것 같다.

그런데 test="" 요기에서 쓸수 있는 비교연산자들 중에는 null 인지 빈 공백인지 판단하던 <isEmpty/>, <isNotEmpty/> 를 대체할만한 비교연산자가 없었다.

null 인지 공백인지 mybatis 에서 판단하기 위해서는
<if test="xxx == null or xxx == ''"></if>

요렇게 쫏끔 번거롭게 쓸 수 밖에 없는것 같았다. 뭐 더 찾아보진 않았지만~



어째 다른 방법이 없나 쭉 찾아보니까~ 신기하게도 조건문에서 자바 클래스의 메소드를 호출해서 하는 방법이 있었다.

클래스를 하나 맨들고 거기에다 boolean 을 리턴해주는 static 메소드들을 뽓 맨들고 고것을 호출하는 방식이다.

내가 작성해본 클래스는 요렇다.
package stove99.tistory.com;

import java.lang.reflect.Array;
import java.util.List;
import java.util.Map;

public class MyComparator {
	public static boolean isEmpty(Object obj){
		if( obj instanceof String ) return obj==null || "".equals(obj.toString().trim());
		else if( obj instanceof List ) return obj==null || ((List)obj).isEmpty();
		else if( obj instanceof Map ) return obj==null || ((Map)obj).isEmpty();
		else if( obj instanceof Object[] ) return obj==null || Array.getLength(obj)==0;
		else return obj==null;
	}
	
	public static boolean isNotEmpty(String s){
		return !isEmpty(s);
	}
}


죠렇게 맨든 클래스를 땡겨다 쓰는 mabatis sql xml 예제는 요렇다.
<select id="testSQL" parameterType="map" resultType="hashmap">
	SELECT * FROM TB_TEST
 	WHERE
 		1=1
 		<!-- @패키지.클래스명@호출할메소드(파라메터) -->
 		<if test="@stove99.tistory.com.MyComparator@isEmpty(keyword)">
 			AND KEYWORD = #{keyword}
 		</if>
</select>
@패키지명.클래스@메소드 요렇게 호출해야 되기 때문에 패키지나 클래스명은 간단하게 명명하면 좋을것 같다.

뭐 쓰고보니 더 복잡해진것 같기도 하고 -_-

 아무튼 딸랑 empty 체크하는 거에만 활용해서 그럴수도 있지만, 자바 메소드를 호출할수 있다는 것은 이것저것 활용할데가 많을것 같다. 

mybatis dynamic query 조건에서 in 조건 사용하기


dynamic query 에서 조건 태그에 들어가는 비교 연산자 뭐 흔히 사용하는 == ,  != ,  > ,  <  , <=  뭐 이런것들이 있다.

이런 기본적인것 이외에도 in 이라는 연산자가 있는데

이것을 이용하면 기존 or 로 비교구문을 쭉 이어서 썼던것을 단순하게 처리할수 있을것 같았다.

그걸 사용해 볼려고 User Guide를 보니 하니 뭔놈에 설명이 하나도 안되있고

검색어로 넣을 만한 단어거 너무 일반적이라서 구글에게 물어보기도 힘들었다.

처음에는 query 에서 쓰는것 처럼 <if test="param1 in ('a', 'b'. 'c', 'd')">쿼리</if>  요런식으로 해 보니까 에러는 안나지만 정상적으로 비교되지 않았다.



그러다가 문득

    쿼리

요렇게 ( ) 을 { } 으로 바꿔서 해보았다.

잘된다 -_-;;


내가 못찾아서 그런가  mybatis 는 설명이 너무 허약한것 같다.
prev 1 next