본문 바로가기
개발노트

[MyBatis] 동적SQL 처리하기 : ForEach - 검색 기능 구현

by 별토끼. 2018. 2. 10.
반응형

동적SQL 처리하기 : ForEach

 

 

* where절에서 in을 쓰려면 myBatis에는 어떻게 해야할지에 대해 해결했다.

 

collection = 전달받은 인자값

item   = 전달받은 인자값을 다른이름으로 대체 
open = 해당 구문이 시작할 때 (
close = 해당구문이 끝날 때 )

separator = 한번 이상 반복할때 반복되는 사이에  해당 문을 넣어줌

 

 

 

<foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #
 </foreach>

 이러한 형태로 where절 구문 뒤에 여러 값이 동적으로 들어가야한다면  

 ForEach를 이용하여 쉽게 데이터를 가져올 수 있다.

 

다만, list에 들어가는 데이터 타입은 Map이나 Array여야 한다.

(HashMap으로 하니 오류가 났다)

 

 

 

* 실제 구현한 코드

 

 

 - 이번 만드는 프로젝트에서 이 부분은 Search 기능이다. 특정 태그를 클릭하면 해당 태그에 대해 검색하는데 

1) 태그를 클릭하면

2) 태그 테이블에서 해당 태그가 등록된 포스트 번호를 가져와서

3) 포스트 테이블에서 select 하여 검색 결과로 나타내준다.

 

 

 * Controller

    /* 노하우 검색 리스트 */
    @RequestMapping("/service/knowhowSearch.do")
    public ModelAndView knowhowSearchList(HttpServletRequest request){
        String tag_name=request.getParameter("tag_name");
        
        ModelAndView mView=knowhowService.Searchlist(tag_name);
        mView.setViewName("service/knowhowSearch");
        return mView;        
    }    

* Service

    @Override
    public ModelAndView Searchlist(String tag_name) {
        List<Integer> kh_nums = knowhowTagDao.findPost_num(tag_name);
        List<KnowhowDto> list = knowhowDao.getSearchList(kh_nums);
        ModelAndView mView = new ModelAndView();
        mView.addObject("list", list);
        return mView;
    }    

 

 

* 태그 관련 Dao

    @Override
    public List<Integer> findPost_num(String tag_name){
        List<Integer> kh_num = session.selectList("knowhowTag.findKh_num", tag_name);
        System.out.println("findPost_num:"+kh_num.get(0));
        return kh_num;
    }​

 

* 태그 관련 Mapper

    <select id="findKh_num" resultType="java.util.HashMap" parameterType="string">
        SELECT tag_kh_num
        FROM kh_tag
        WHERE tag_name=#        
    </select>
​

 

* 포스트 관련 Dao

    @Override
    public List<KnowhowDto> getSearchList(List<Integer> kh_nums){
        List<KnowhowDto> list = session.selectList("knowhow.getSearchList", kh_nums);
        return list;
    }    ​

 

* 포스트 관련 Mapper

    <select id="getSearchList" resultType="knowhowDto" parameterType="java.util.Map"> 
        SELECT kh_num, kh_title, kh_filePath, kh_content, kh_regr_id, kh_reg_dtime, kh_disp_tf
        FROM kh_board 
        WHERE kh_num in
        <foreach item="item" index="index" collection="list"
                      open="(" separator="," close=")">
                #
        </foreach>        
        ORDER BY kh_num DESC 
    </select>
​

 

반응형

댓글