쿼리를 작성해야 할때 전달받은 인자값을 바탕으로 반복적인 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>
Map 선언시 List 형태로 넘기는 예시
<java Code>
public List<Books> getBooksInfo() {
Map<String, Object> param = new HashMap<String, Object>();
param.put("id", "1"); //#{id}에 셋팅
param.put("name", "victor"); //#{name}에 셋팅
List<String> codeList = new ArrayList<String>();
codeList.add("01"); //in 조건에 넣을 정보
codeList.add("05");
param.put("code_list", codeList); //map에 list를 넣는다.
return sqlSession.selectList("selectBooksInfo", param);
}
<SQL Mapper>
<select id="selectBooksInfo" resultType="kr.co.husk.Books" parameterType="java.util.HashMap">
select
price,
discount_price
from
books
where
id = #{id}
and name = #{name}
<choose>
<when test="code_list.size != 0">
and book_code in
<foreach collection="code_list" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
</choose>
</select>
<결과 쿼리>
SELECT price,
discount_price
FROM books
WHERE id = '1'
AND name = 'victor'
AND book_code in ('01','05')
일반적으로 in 에 들어가는 조건 이외에 단순한 String 값도 같이 넣어 조회 하게 됩니다.
방법은 Map을 선언시 <String, Object> 로 선언하고 Object에 list를 넣어주고 query 부분에서 리스트를 foreach 돌려 사용하면 됩니다.
query xml 부분에서 foreach 로 in절에 리스트를 돌림!
출처 :
MyBatis foreach를 이용한 배열 파라미터 삽입하기
쿼리를 작성해야 할때 전달받은 인자값을 바탕으로 반복적인 SQL 구문을 작성할때 유용하다. 대표적으로 체크박스등과 같은 인자값이 동일한 다수의 배열 데이터를 검색조건에 반영해야 할때가
fruitdev.tistory.com
mybatis (foreach문, in절)
Spring 과 mybaits 사용시 in 에 조건을 넣기 위해 foreach를 사용합니다. 그리고 조건 데이터를 넘겨줄때는 parameter에 리스트로 전달하면 됩니다. 하지만 일반적으로 in 에 들어가는 조건 이외에 단순
huskdoll.tistory.com
'Java' 카테고리의 다른 글
mybatis에서 selectKey 사용하는 방법 (0) | 2020.10.09 |
---|