본문 바로가기

MyBatis

MyBatis foreach를 이용한 배열 파라미터 삽입하기

반응형

쿼리를 작성해야 할때 전달받은 인자값을 바탕으로 반복적인 SQL 구문을 작성할때 유용하다.
대표적으로 체크박스등과 같은 인자값이 동일한 다수의 배열 데이터를 검색조건에 반영해야 할때가 있는데, 이때 OR 구문 또는 IN 구문으로 작성하면 편리하게 사용할 수 있다.


다만 foreach의 경우 인자값으로 List와 Array 형태의 collection 타입만 사용이 가능하다.



foreach 기본 문법 형태


<foreach collection="sUser_type" item="type"  open="(" close=")" separator="or">
 </foreach>


collection = 전달받은 인자. List나 Array 형태만 가능
item = 전달받은 인자값을 alias 명으로 대체
open = 해당 구문이 시작될때 삽입할 문자열
close = 해당 구문이 종료될때 삽입할 문자열
separator = 반복 되는 사이에 출력할 문자열
index=반복되는 구문 번호이다. 0부터 순차적으로 증가



List 형태를 넘겼을 경우의 예제.

<java Code>

List sUserTP = new ArrayList();
sUserTP.add("SP");
sUserTP.add("BX");


HashMap hm = new HashMap();
hm.put("sUser_age", 23) ;
hm.put("sUser_type", sUserTP) ;


<SQL Mapper>

<select id="getTList" resultType="hashmap" parameterType="hashmap">
	SELECT
		name, age
	FROM
		TB_user
	WHERE
		age = #{sUser_age} AND
		<foreach collection="sUser_type" item="type"  open="(" close=")" separator="or">
			user_type = #{type.value}
		</foreach>
</select>


또는 or 구문을 IN 구문으로 변경


<select id="getTList" resultType="hashmap" parameterType="hashmap">
	SELECT
		name, age
	FROM
		TB_user
	WHERE
		age = #{sUser_age} AND
		user_type IN 
		<foreach collection="sUser_type" item="type"  open="(" close=")" separator=",">
			#{type.value}
		</foreach>
</select>





Array 형태를 넘겼을 경우의 예제.

<java Code>

String[] sUserTP = {"SP", "BX"} ;

HashMap hm = new HashMap();
hm.put("sUser_age", 23) ;
hm.put("sUser_type", sUserTP) ;



<SQL Mapper>

<select id="getTList" resultType="hashmap" parameterType="hashmap">
	SELECT
		name, age
	FROM
		TB_user
	WHERE
		age = #{sUser_age} AND
		user_type IN 
		<foreach collection="sUser_type" item="type" index="index"  open="(" close=")" separator=",">
			#{type[index]}
		</foreach>
</select>




foreach를 잘 이용하면 단순 검색뿐만 아니라 동일한 구문으로 이루어진 다수의 INSERT, UPDATE도 작성이 가능하니 여러 방면으로 사용이 가능하다.