Java

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

코딩공부 2021. 2. 13. 20:13


쿼리를 작성해야 할때 전달받은 인자값을 바탕으로 반복적인 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절에 리스트를 돌림!

 

 

출처 : 

fruitdev.tistory.com/187

 

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

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

fruitdev.tistory.com

 

huskdoll.tistory.com/507

 

mybatis (foreach문, in절)

Spring 과 mybaits 사용시 in 에 조건을 넣기 위해 foreach를 사용합니다. 그리고 조건 데이터를 넘겨줄때는 parameter에 리스트로 전달하면 됩니다. 하지만 일반적으로 in 에 들어가는 조건 이외에 단순

huskdoll.tistory.com

 

'Java' 카테고리의 다른 글

mybatis에서 selectKey 사용하는 방법  (0) 2020.10.09