Commons BeanUtil 에는 참 유용한게 많다..
그중 RowSet 과 비스무리(?) 한 것이 하나 있는데..
바로 RowSetDynaClass 이다...
일반적 JDBC 프로그래밍에서는 아래와 같은 순서를 가진다.
pstmt = t.prepareStatemet(query);
pstmt.setXXX(....);
rs = pstmt.executeQuery();
while(rs.next()){
... 작업들.....
}
rs.close();
이런 구조를 가지고 가게 되며, 커넥션이 닫히기 전에 resultSet 을 순차적으로 내려가면서 작업을 한다.
Commons BeanUtils 안에는 RowSetDynaClass 라는 클래스가 있다.
이 클래스는 JDBC 연결이 끊어진 이후에도 사용가능한 CachedRowSet 과 비슷한 기능을 제공해준다.
이것의 사용법은 상당히 간단하다. 참조 코드는 다음과 같다.
pstmt = t.prepareStatement(query);
rs = pstmt.executeQuery();
rsdc = new RowSetDynaClass(rs);
rs.close();
....
finally{ ... conn.close(); }
요기까지가 끝이다.. 이후에는 rsdc 라는 녀석을 이용해서 데이터를 취득하면 된다.
이렇게 데이터를 가져오게 되면
rsdc 에서는 getRows() 메소드를 이용하여 List 객체를 취득할 수 있다.
List arr = rsdc.getRows();
또한 검색해 온 컬럼의 이름들을 Property 로 얻을 수도 있다.
DynaProperty[] dynas = rsdc.getDynaProperties();
for(int i = 0; i < dynas.length; i++){
System.out.println(dynas[i].getName());
}
DynaProperty 클래스는 일반적인 Property 개념으로 보면 된다.
또한 이렇게 얻어온 DynaProperty 배열객체를 이용하여 RowSetDynaClass 를 순환하며 내용을 참조할 수 있다.
List 형태로 반납된 rows 들을 순환하게 되면 DynaBean 이라는 객체를 반납하게 된다.
이 형태를 이용하여 rs.next() 작업과 동일한 결과를 얻을 수 있다.
Iterator iter = arr.iterator();
while(iter.hasNext()){
DynaBean bean = (DynaBean)iter.next();
for(int i = 0; i < dynas.length; i++){
System.out.println(bean.get(dynas[i].getName()));
}
}
사용하다 주의할 것은 테이블 컬럼명이 regiDate 와 같이 중간에 대문자가 끼어있을 경우이다
이렇게 중간에 대문자가 끼어있는 것들은 RowSetDynaClass 를 생성하는 과정에서
전부 소문자로 바뀌게 된다.
SQL 상에서는 대소문자를 가리지 않지만 객체에서 값을 얻어올때는 가린다는것에 주의!!!
그렇기 때문에 bean.get("regidate") 와 같이 프라퍼티를 전부 소문자로 적어야
제대로 출력될 것이다.
DAO Layer 측에서 해야할 일들이 DAO를 이용하는 Layer 에 종속적인 작업이 진행될 경우
RowSetDynaClass 를 이용하여 Action 측에서 사용하면 각 레이어의 할일이 조금더 분명해 질수 있다.