본 장에서는 tbJDBC에서 제공하는 Row Set 기능을 설명한다.
Row Set이란 문자 그대로 로우 데이터의 집합을 포함하는 객체이다. javax.sql.RowSet 인터페이스 메소드를 통해 접근할 수 있다.
일반적으로 Row Set은 다음과 같이 세 가지로 나뉜다.
Row Set에서는 여러 개의 리스너를 등록하여 사용할 수 있다. 등록할 때는 addRowSetListener() 메소드를 사용하고, 제거할 때는 removeRowSetListener() 메소드를 사용하면 된다. 이때 사용되는 리스너는 반드시 javax.sql.RowSetListener 인터페이스를 통해서 구현되어야 한다.
RowSetListener 인터페이스에서 제공하는 이벤트는 다음과 같이 3가지이다.
이벤트 | 설명 |
---|---|
cursorMoved | next()나 previous() 등의 메소드를 통해 열의 이동이 있을 때 마다 발생한다. |
rowChanged | 새로운 열이 추가되거나 기존의 열이 수정되거나 삭제될 때 발생한다. |
rowSetChanged | 전체 Row Set이 생성되거나 변경될 때 발생한다. |
RowSetListener 인터페이스의 이벤트를 사용하는 방법은 다음의 예와 같다.
리스너 클래스를 생성한다.
public class MyListener implements RowSetListener { public void cursorMoved(RowSetEvent event) { // do work } public void rowChanged(RowSetEvent event) { // do work } public void rowSetChanged(RowSetEvent event) { // do work } }
리스너를 RowSet 객체에 등록한다.
MyListener mListener = new MyListener(); rowset.addRowSetListener(mListener);
Cached Row Set은 모든 열을 캐시에 저장하고, 데이터베이스와의 연결을 유지하지 않도록 구현된 Row Set의 한 형태이다. tbJDBC에서는 TbCachedRowSet 클래스로 제공된다.
RowSet 객체는 execute() 메소드를 통해 사용할 수 있는 준비를 마치며, 그 이후에는 java.sql.ResultSet 객체를 사용하는 방법과 동일하게 사용할 수 있다.
본 절에서는 RowSet 객체를 생성하는 과정을 두 가지로 나누어 설명한다.
다음의 예는 질의문을 이용하여 RowSet 객체를 생성하는 과정이다.
TbCachedRowSet 객체를 생성한다.
TbCachedRowSet rowset = new TbCachedRowSet();
URL, 사용자 이름, 패스워드, 질의문을 설정한 후에 execute() 메소드를 수행하여 RowSet 객체를 생성한다.
rowset.setUrl("jdbc:tibero:thin:@localhost:8629:dbsvr"); rowset.setUsername("tibero"); rowset.setPassword("tmax"); rowset.setCommand("SELECT * FROM emp"); rowset.execute();
다음의 예는 기존에 존재하는 결과 집합을 이용하여 RowSet 객체를 생성하는 과정이다.
TbCachedRowSet 객체를 생성한다.
TbCachedRowSet rowset = new TbCachedRowSet();
결과 집합 객체(rset)를 이용하여 populate() 메소드를 수행하여 RowSet 객체를 생성한다.
ResultSet rset = pstmt.executeQuery(); rowset.populate(rset);
RowSet 객체를 이용하여 정방향이나 역방향으로 이동하면서 열의 데이터를 탐색할 수 있다.
예를 들면 다음과 같다.
rowset.beforeFirst(); while (rowset.next()) { System.out.println(rowset.getString(1)); } rowset.afterLast(); while (rowset.previous()) { System.out.println(rowset.getString(1)); }
또한 열의 데이터를 삽입, 삭제, 수정할 수도 있다. 단, acceptChanges() 메소드를 수행해야 커밋이 실행된다.
예를 들면 다음과 같다.
rowset.absolute(5);
rowset.moveToInsertRow();
rowset.updateString(1, "tibero");
rowset.insertRow();
rowset.acceptChanges();