본문 바로가기
기타

[Mybatis] SQL에서 WHERE 절 안에 in 처리하기

by 태진아밴드 2020. 9. 7.

바비, 마이삭, 하이선 3단콤보

오늘도 개미는 열심히 일을 하기위해 폭우를 뚫고 출근했다😢

 

출근하자마자 운영팀쪽에서 DB 데이터 출력 요청이 있었는데

 

당분간 해당 데이터를  매일 혹은 주 3회 정도 뽑아달라는 요청이였다.

 

쿼리문이야 간단하고 뽑는거는 어려운 일이 아니였는데 내가 부재시에도 데이터 출력이 필요할수도 있기에

 

관리자페이지에 해당 데이터 엑셀다운로드 페이지를 추가해주기로 하였다.

 

출력이 필요한 매장들을 엑셀 업로드 한 후 다운로드 버튼을 누르면 해당 정보들이 출력되게끔 작업 한 뒤

 

테스트를 하는데 엑셀이 텅텅비어서 다운로드 된다...?😞

 

 

[ 엑셀 업로드 부분 일부]

//

if (fileExtend.equals("xlsx")) {
	XSSFWorkbook work = new XSSFWorkbook(fis);
	int sheetNum = work.getNumberOfSheets();

	for (int loop = 0; loop < sheetNum; loop++) {
		XSSFSheet sheet = work.getSheetAt(loop);

		int rows = sheet.getLastRowNum();

		for (int rownum = 1; rownum < rows + 1; rownum++) {
			XSSFRow row = sheet.getRow(rownum);

			if (row != null) {
				// 조회 대상 코드
				XSSFCell cell = cell = row.getCell(0);
				String shopCode = CommonUtil.cellValue(cell);
				if (!shopCode.equals("")) {
					rowcount++;
					shopList += "'" + shopCode + "',";
				}
			}
		}
	}
}
shopList = shopList.substring(0, shopList.length()-1);
 
 //

엑셀에서 조회 대상 코드들을 추출해 String에 'code1', 'code2', 'code3' ... 형태로 담아 Mybatis를 통해 xml에서 단순하게 

 

 

[ 쿼리문 일부 ]

--

WHERE
	shop_code in (
    	#{shopCodes}
    )
    
--

이런식으로 사용하려 했는데 정작 로그에 쿼리문은 정상적으로 출력되는데 resultSet에는 아무것도 출력되지 않았다.

 

왜 저럴까 고민해보고 구글링하다가 Mybatis 사용법을 다시 찾아봤더니

 

WHERE 절에 in 사용시에는 저런식으로 사용하면 안되고 foreach 로 반복시켜줘야 된다는걸 찾았다.

 

몇달전에 저렇게 구현했는데 대충 복사 붙여넣기만했더니 까먹었던 내 자신을 비하하며 이번 기회에 제대로 적어둬야겠다...😢

 

방법은 간단하다.

 

 

[수정 후 부분 일부]

//

JSONObject param = new JSONObject();
String arrShopList[] = null;
arrShopList = shopList.split(",");
param.put("arrShopList", arrShopList);
        
//

 

--

WHERE 
	shop_code in
    <foreach collection="arrShopList" item="item" index="index" open="(" close=")" separator=",">
    #{item}
    </foreach>
 
--

 

 

 

String에 'code1', 'code2', 'code3' ... 형태로 담지말고 그냥 code1, code2, code3 ... 형태로 담아준 뒤

 

이런식으로 , 기준으로 split 시켜 배열에 담아주고 Mybatis에서 foreach 구문으로 돌려주면 된다.

 

 

foreach 구문 자체가 직관적이라 이해하기도 쉽다.

 

반복문 시작전 " ( "괄호가 열리게 되고,  배열이 반복 될때마다 " , "로 구분 된다. 그리고 반복문이 끝나면 " ) " 괄호로 닫히게 된다.

 

생각없이 기계적으로 만들지 말고 만든건 까먹지 말자..!