Search

'list'에 해당되는 글 2건

  1. 2011.04.06 [java] List 정렬하기
  2. 2009.04.13 [iBatis] iterate 사용법 1

[java] List 정렬하기

프로그래밍/Java 2011. 4. 6. 16:05 Posted by galad
http://ssami.tistory.com/291

정렬할 대상 List가 갖는 Info 클래스
###java;highlight: [27,28,29]
package com.omp.bp.cms.common.model;

public class CommonFileInfo implements Comparable<CommonFileInfo> {

    private String fileName;    // 파일명
    private String filePath;    // 파일경로
    private String name;        // 화면 표시용 이름

    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public String getFilePath() {
        return filePath;
    }
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int compareTo(CommonFileInfo o) {
        return fileName.compareTo(o.getFileName());
    }
}
compartTo 메소드가 Collections를 이용해 정렬할 때 사용된다.
Info 클래스의 구성원 중 하나만 가지고 비교할 때는 Comparable를 구현하는 방법을 사용하고,
여러 개의 구성원 중 선택해서 정렬하는 방식을 원할 때는 맨 위의 링크를 참고.

정렬하는 메소드
###java
/**
 * 파일 정보를 목록으로 생성. 파일명 역순 정렬.
 * @param files
 * @return
 */
private List<CommonFileInfo> getFileInfos(File[] files) {

    List<CommonFileInfo> list = new ArrayList<CommonFileInfo>();

    for(File f : files) {
        CommonFileInfo info = new CommonFileInfo();
        info.setName(f.getName());
        info.setFileName(f.getName());
        info.setFilePath(f.getAbsolutePath());

        list.add(info);
    }

    Collections.sort(list);        // 정렬
    Collections.reverse(list);    // 역순

    return list;
}

[iBatis] iterate 사용법

프로그래밍/Framework 2009. 4. 13. 20:13 Posted by galad
    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE" property="deleteContentTypeList" open="("  conjunction="," close=")">
            CONTENT_TYPE IN #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE CONTENT_TYPE IN " property="deleteContentTypeList" open="("  conjunction="," close=")">
            #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" parameterClass="java.util.List" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="("  conjunction="," close=")">
                CONTENT_TYPE IN #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

버근지 뭔지 몰라도 위의 방식은 하나도 안된다. property속성을 쓰면 안되는건지...
근데 되는 사람들도 있는 것 같고..

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate open="CONTENT_TYPE IN ("  close=")" conjunction="," >
                #[]#
            </iterate>
        </dynamic>
    </statement>

이것처럼 아예 property 속성을 없애고, list의 이름을 없이 하면 잘됨.

참고:http://lostsin.tistory.com/tag/iBATIS

sql의 xml설정은 다음과 같이 하고

     <delete id="deletes" >
          DELETE FROM users
          <dynamic prepend="WHERE id IN">
              <iterate open="(" conjunction="," close=")">
                  #[]#
              </iterate>
          </dynamic>
      </delete>


DAO는 다음과 같이 한다
    public int delete(Integer[] ids) {
        return getSqlMapClientTemplate().delete("users.deletes", ids);
    }

해당 쿼리는 <iterate> 구문에 의하여 WHERE id IN (1,2,3,4,5) 방식으로
값이 매핑되게 된다.


보너스1.
List<>를 사용하는 방법도 xml 쿼리 부분은 동일하다.

List<String> list = new ArrayList<String>(3);

list.add("1");

list.add("2");

list.add("3");

List objs = sqlMapClient.queryForList("select-test",list);




보너스2.
parameterClass="map" 을 사용할 땐

     WHERE

session_id IN

<iterate property="sessionIds" open="(" close=")" conjunction=",">

#key[]#

</iterate>

hash의 key 값으로 사용된 string을 지정해주면 된다 (?)

추가.
            HashMap map = new HashMap();
            map.put("deleteContentTypeList", deleteContentTypeList);
            map.put("updateId", updateId);
            map.put("updateTime", updateTime);
           
            this.update("contenttype.DELETE_CONTENT_TYPE", map);

    <statement id="DELETE_CONTENT_TYPE">
        UPDATE
            CONTENT_TYPE
        SET
              STATUS = 'D'
            , UPDATE_ID = #updateId#
            , UPDATE_TIME = #updateTime#
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="CONTENT_TYPE IN (" close=")" conjunction=",">
                #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

이건 또 된다. map에 넣어서 넘겨주면 멀쩡히 잘 되는군...

# 추가
list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면(map으로 넘겼을 떄 말고),
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
    // select something and use iterate
    <iterate> // iterate 태그 내 property 속성을 제거하라
        #someList[]#
    </iterate>
</select>