반응형

@notepad_jj2

츄르사려고 코딩하는집사입니다.


웹개발을 하면서, IBatis의 iterate를 사용할 때가 있습니다.

예를 들어, 아래처럼 말이죠.

 

아래의 코드처럼, JAVA 단에서 NO와 AGE를 받아서 정렬을 하고 싶을 때에 사용합니다.

SELECT NAME
  FROM STUDENT
ORDER BY NO, AGE DESC;

 

ORDER BY를 1가지의 COLUMN을 받아 정렬하고 싶으면 아래처럼 XML에 쿼리를 사용하게 됩니다.

  SELECT NAME
    FROM STUDENT
ORDER BY #ORDBY#

 

근데, ORDER BY를 N개 이상을 사용하고 싶을 때에는 COLUMN 1개에 변수 1개를 만드는건 너무 하드코딩이 되어 버립니다. 그렇기 때문에, IBatis에서 iterate를 사용하여 사용할 수 있습니다.

 

 

iterate 사용 방법

 

testService.java

List<String> ordby = new ArrayList<String>();

// ordby에 값 넣기

DataMap param = new DataMap();
param.put("ORDBY", ordby);

 

test.xml

<select id="test">
       SELECT NAME
         FROM STDUENT
    <iterate prepend="" property="ORDBY" close="DESC" conjunction=",">
        ORDER BY #ORDBY[]#
    </iterate>
</select>

 

iterate 속성

 

1. prepend

- prepend는 쿼리의 맨 앞에 붙여준다.

- 위의 쿼리에서 prepend에 ORDER BY를 넣으면 #ORDBY[]#만 넣어도 된다.

<select id="test">
       SELECT NAME
         FROM STDUENT
    <iterate prepend="ORDER BY" property="ORDBY" close="DESC" conjunction=",">
        #ORDBY[]#
    </iterate>
</select>

 

2. property

- property는 받아오는 파라미터 명을 넣어주면 된다.

- 서비스단에서 Map에 ORDBY를 넣어 보내주므로, ORDBY를 넣어준다.

 

3. open

- open은 ORDBY 파라미터를 시작하는 맨 처음에 넣는 것을 말한다.

 

4. close

- close은 ORDBY 파라미터를 끝내는 맨 뒤에 넣는 것을 말한다.

- 위의 코드에서 DESC를 넣으면, 아래와 같은 형태가 된다.

- 예를 들어, ORDBY 리스트에 NO와 AGE가 있다면, 아래와 같은 형태가 된다.

  SELECT NAME
    FROM STUDENT
ORDER BY NO, AGE DESC

 

5. conjunction

- 리스트에 있는 값을 가져오면서 값을 구분하는 구분자를 뜻한다.

- conjunction="," 이거면, 위처럼 NO 라는 값 뒤에 ,을 붙인다.

 


근데, 위의 방법처럼 했는데도 iterate를 사용하지 못한 경우가 있습니다.

바로 저같이 말이죠.

 

저는 그래서, iterate를 사용하지 않고 그냥 서비스 단에서 던질 값들을 String으로 만들어 던졌습니다.

 

예를 들어, ORDER BY를 여러가지 COLUMN으로 정렬하고 싶을 때에는 아래와 같이 서비스 단에서 String 변수를 만들어 던져주면 됩니다.

 

testService.java

String strORDBY = "";


for(int i = 0; i < test.size(); i++) {
	if(i==test.size()-1) {
    	strORDBY += (columnName + " DESC");
    }
    
    strORDBY += (columnName + ", ");
}

 

test.xml

<select id="test">
       SELECT NAME
         FROM STDUENT
         <isNotEmpty property="ORDBY">
     ORDER BY $ORDBY$
         </isNotEmpty>
</select>

이런 식으로, strORDBY STring형 변수를 만들어서 맨 뒤가 아니라면 그냥 columnName, 이 세트를 strORDBY에 더해주고, 맨뒤면 마지막에 DESC를 넣어주던지 할 수 있습니다.

 

뒤에 ASC나 DESC를 값에 따라 받고 싶으면 그냥 flag 1개를 만들어서 변수를 설정하여 넣어주면 됩니다.

 

이렇게 해서, iterate를 대체할수도 있습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기