Monti

mybatis <Where 절 IN 처리> - foreach 본문

Spring/mybatis

mybatis <Where 절 IN 처리> - foreach

montt 2021. 6. 14. 22:03

오늘 프로젝트를 진행하면서 WHERE 절에 계속 가변하는 값을 주기위해서 IN을 사용하는 방법을 알아보았다.

 

mybatis에서 IN 절을 사용하기 위해서는 foreach 문장이 필요한데, 세부 내용은 다음과 같다.

  • collection : Java에서 Map 넘겨받은 key 값
  • item : 전달받은 value값을 mybatis mapper에서 사용할(?) 이름
  • index : 반복되는 구문번호
  • separator : 반복되는 사이에 출력할 문자열
  • open : 구문이 시작될 때 삽입할 문자
  • close : 구문이 종료될 때 삽입될 문자열

 

쉽게 생각하면

open + item[0] + separator + item[1] + separator + ... + item[n] + close

즉,

( 0, 1, ... , n ) 이 입력이 되는거라고 보면 될거같다.

 

내가 작성한 코드는

  • java Controller (값을 List로 받아오기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        List<Integer> category = new ArrayList<Integer>();
        if(keyword.equals("package") || keyword.equals("all")) 
            category.add(1);
        if(keyword.equals("ticket") || keyword.equals("all"))
            category.add(2);
        if(keyword.equals("mobile") || keyword.equals("all"))
            category.add(3);
        
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("list", category);
        
           if(req.getMethod().equalsIgnoreCase("GET")) { // GET 방식인 경우
            keyword = URLDecoder.decode(keyword, "utf-8");
        }
        
        dataCount = service.listCount(map);
        
        if(dataCount != 0)
            total_page = aboutUtil.pageCount(rows, dataCount) ;
 
        if(total_page < current_page) 
            current_page = total_page;
 
        int offset = (current_page-1) * rows;
        if(offset < 0) offset = 0;
        map.put("offset", offset);
        map.put("rows", rows);
        
        List<Product> list = service.listProducts(map);
cs

 

  • java Service (mybatis 호출)
1
2
3
4
5
6
7
8
9
10
    public List<Product> listProducts(Map<String, Object> map) throws Exception {
        List<Product> list = null;
        try {
            list = dao.selectList("product.product_list_categories", map);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        return list;
    }
cs

 

  • mybatis (값 불러오기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <select id="product_list_categories" parameterType="map"
        resultType="com.aboutrip.app.product.Product">
        SELECT p.code, product_name, start_date, end_date, upload_date,
        ishidden, price, img_name
        from product p
       LEFT JOIN productdetail d ON p.code=d.code
        JOIN product_img i ON p.code=i.code
        WHERE category_num IN
        <foreach collection="list" item="code" index="index"
            separator="," open="(" close=")">
            #{code}
        </foreach>
        ORDER BY START_DATE ASC
        OFFSET #{offset} ROWS FETCH FIRST #{rows} ROWS
        ONLY
    </select>
cs

각각 이렇게해서 데이터를 불러올 수 있었다.

 

맨처음에 foreach collction을 category_num으로 받아왔는데 부적합한 열유형 오류가 발생해서 강사님께 물어봤다.

collection의 경우 한번씩 오류 뜰 가능성이 있다고 기본적으로 list로 사용하면 좋다고 해서 바꾸니까 바로 오류가 고쳐졌다.

Comments