WebRowSet 을 이용한 JDBC 활용하기 4부

ResultSet 가공하기


WebRowSet 클래스의 deleteRow() 메소드를 이용하여 특정 row의 데이터를 삭제할 수 있습니다.
비슷한 방법으로 특정 row의 값을 업데이트 하거나 이동할 수 있습니다.

코드 조각을 보면서 이야기 해 볼까요.
... ... ...
ResultSet rs =  stmt.executeQuery("select * from student ");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
wrs.absolute(1); //첫번째 row로 커서를 옮깁니다.
wrs.deleteRow(); //커서가 위치한 row를 삭제합니다.
wrs.absolute(2); //두번째 row로 커서를 옮깁니다.
wrs.updateInt(4,20);//커서가 위치한 row의 4번째 컬럼 값을 20으로 변경합니다.
... ... ...

코드의 처음 세줄은 ResultSet으로부터 WebRowSet을 만들어내고 있으며, 다음 두줄은 ResultSet의 데이터에서
첫번째 Row를 삭제하고 있습니다. 마지막 두줄은 두번째 Row의 4번째 Column값을 20으로 변경하고 있습니다.

위와같은 처리를 거친 결과의 data eliment는 아래와 같습니다.
 <data>
   <deleteRow> 
     <columnValue>200</columnValue> 
     <columnValue>Jack</columnValue> 
     <columnValue>Dakota</columnValue> 
     <columnValue>21</columnValue> 
   </deleteRow> 
   <currentRow> 
     <columnValue>100</columnValue> 
     <columnValue>John</columnValue> 
     <columnValue>Doe</columnValue> 
     <columnValue>26</columnValue> 
     <updateRow>20</updateRow> 
   </currentRow> 
 </data>

xml의 결과를 보면 첫번째 row에 대해 <deleteRow> 태그를 이용하여 삭제된 row임을 표시하고
두번째 row에서 <updateRow> 태그를 이용하여 4번째 column이 26에서 20으로 업데이트 되었음을
나타내고 있습니다.



변경사항 Commit 하기


위에 살펴본 과정은 단지 ResultSet의 데이타를 가공했을 뿐으로 commit을 수행하기 전까지는
database에 변경된 값들이 반영되지 않습니다.
변경된 데이터를 database에 적용하기 위해 acceptChanges() 메소드를 이용할 수 있습니다.
... ... ...
wrs.acceptChanges();
... ... ...



다음편에 계속..
2008/11/16 02:22 2008/11/16 02:22
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WebRowSet 을 이용한 JDBC 활용하기 3부

ResultSet 출력하기


자. 이제 위의 예제코드의 ResultSet을 XML데이터로 변형 해 봅시다.
이를 위해 com.sun.rowset.WebRowSetImple 클래스를 이용할 수 있습니다.
위 예제 코드에 몇 라인의 코드를 추가함으로써 result set을 XML 파일로 출력 할 수 있습니다.

... ... ... 
ResultSet rs =  stmt.executeQuery("select * from student");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
try {
  wrs.writeXml(
  new FileOutputStream("student.xml"));
} catch (FileNotFoundException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
... ... ...


wrs.writeXML()의 출력형태는 WebRowSet scheme definition. 의 형태를 따르며
출력은 properties, metadata, data의 세 부분으로 구분 되어집니다.
일반적인 출력 레이아웃은 다음과 같습니다.

<?xml version="1.0"?> 
<webRowSet xmlns= "http://java.sun.com/xml/ns/jdbc(새 창으로 열기)" 
           xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance(새 창으로 열기)"
           xsi:schemaLocation= "http://java.sun.com/xml/ns/jdbc(새 창으로 열기) 
           http://java.sun.com/xml/ns/jdbc/webrowset.xsd(새 창으로 열기)"> 
 <properties> 
       ... ... ... 
 </properties> 
 <metadata> 
       ... ... ...
 </metadata> 
 <data> 
       ... ... ...
</data> 
</webRowSet>


<properties> 태그는 provider( isolation leve, RowSet type 등)를 의미 합니다. <metadata> 태그는 해당 데이타베이스의 테이블의 갯수, 이름, 컬럼타입 등을 나타내며, 마지막으로 <data> 태그는 해당 테이블의 실제 정보를 기술합니다.

 <data>
   <currentRow>
     <columnValue>200 < /columnValue>
     <columnValue>Jack</columnValue>
     <columnValue>Dakota</columnValue>
     <columnValue>21</columnValue>
   </currentRow>
   <currentRow>
     <columnValue>100</columnValue>
     <columnValue>John</columnValue>
     <columnValue>Doe</columnValue>
     <columnValue>26</columnValue>
   </currentRow>
 </data>


위의 예에서 보이는 <currentRow> 태그는 WebRowSet의 각 Row에 저장되어있는 데이터를 나타냅니다. insert, update, delete같은 데이터 조작은 다음편에서 계속하겠습니다.

2008/11/11 13:03 2008/11/11 13:03
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WebRowSet 을 이용한 JDBC 활용하기 2부

ResultSet 이용하기


아래에 이어질 예제는 JDK5.0과 Oracle 데이터베이스 10.2를 이용하여 진행하고 있음을 밝혀둡니다.

자.. 'student'라는 테이블에 아래와 같은 데이터를 갖는 간단한 데이터베이스가 있다고 합시다.

SQL> select * from student;

사용자 삽입 이미지






시작에 앞서, 위의 student 테이블을 가지고있는 데이터베이스에서 각 레코드를 조회하여 result set을 얻어오는
간단한 java 어플리케이션을 짜 보도록 합시다.

public class DatasourceConnector {
    public static void main(String[] args) {

        Connection con = null;
        OracleDataSource ds = null;

        try {

            ds = new OracleDataSource();
            ds.setUser("<dbuser>");
            ds.setPassword("<password>");
            ds.setURL("jdbc:oracle:thin:@localhost:1521:<sid>");

        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {

            con = ds.getConnection();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select * from student ");

            for (int j = 0; j < rs.getMetaData().getColumnCount(); j++) {
                System.out.print(
                    rs.getMetaData().
                    getColumnName(j + 1) + "\t");
            }

            while (rs.next()) {
                System.out.print("\n");
                for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
                    System.out.print(rs.getString(i + 1) + "\t");
                }
            }

            rs.close();
            stmt.close();
            con.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}


예제의 자바 클래스는 connection 인스턴스를 최기화 하고, 수행할 SQL문자열을 포함하는 statement 를 생성한 후
result set을 조회하는 아주 일반적인 JDBC 코딩 양식을 보여주고 있습니다. 위 코드를 DatasourceConnector.java란
이름으로 저장하고 컴파일, 실행을 하면

>javac DatasourceConnector.java
>java DatasourceConnector

아래와 같은 결과를 출력하게 됩니다.

ID    FNAME  LNAME   AGE
200  Jack      Dakota    21
100  John      Doe        26

다음편으로 ..

2008/11/09 14:30 2008/11/09 14:30
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WebRowSet 을 이용한 JDBC 활용하기 1부

RDBMS는 Data 질의와 갱신에을 위해 가장 광범위하게 이용되는 영구 저장 메카니즘(persistance storage mechanism) 입니다. Java Database Connectivity (JDBC) 는 Java 프로그램이 RDBMS 상의 데이터를 SQL을 이용하여  조작할 수 있게끔 해주는 프레임워크의 API 모임입니다.

Java 프로그램에서 데이터베이스의 데이터를 조회하거나 갱신하는데는 일련의 순서가 있습니다.
첫째로, 프로그램은 접속하고자하는 DataBase에 커넥션이 맺어져야 합니다.
이 커넥션을 맺는데는 몇 가지 다른 방법이 있습니다.. 관습적인 방법으로는 벤더에서 제공하는 JDBC드라이버를 로딩한 후 java.sql.DriverManger 클래스의 getConnection() 메소드를 호출하는 방법이 있을수 있습니다.
또 다른 한가지 방법은 접속하고자하는 데이터베이스를 개발한 회사에서 제공해 주는 java.sql.Connection 인터페이스를 구현한 클래스를 이용하는 방법이 있을수 있고,  Java EE 컨테이너에서처럼 JNDI (Java Naming Direvtory Interface) lookup을 통해 커넥션을 맺는 방법도 있겠네요.
어느 방법을 이용하든 Java 프로그램은 java.sql.Connection 인터페이스를 이용하여 데이터베이스와 커넥션을 맺게됩니다.
둘째로, 위에서 얻어온 Connection 객체로부터 Query를 DataBase로 전송하기위한 java.sql.Statement 인터페이스를 생성합니다.
마지막으로 Statement의 실행 결과를 java.sql.ResultSet 인스턴스로 돌려 받습니다.

본 포스팅에서는 JDBC version 3.0을 지원하는 JDK version 5.0에서 새로이 등장한 WebRowSet을 이용하는 방법을 알아보겠습니다.  
JDBC 3.0은 데이터의 생성과 변형을 손쉽게 해 낼 수 있는 몇 가지 기능을 제공합니다.


WebRowSet 계층구조


본격적인 WebRowSet의 이야기에 앞서 WebRowSet 인터페이스의 상속 계층 구조를 먼저 살펴 보도록 하겠습니다.
WebRowSet Hierarchy

WebRowSet inheritance Hierarchy(출처:OnJava)


상속관계에서 Root는 java.aql.ResultSet 인터페이스 입니다. 이 인터페이스의 인스턴스는 데이터베이스가 해석할수 있는 query를 포함하는 java.sql.Statement 인스턴스를 실행함으로써 얻어지는 표 형식의 데이터입니다. 기본적으로 result set은 앞으로만 탐색할 수 있고 업데이트를 할 수 없습니다. default result set을 가지고는 임의의 위치에 있는 데이터를 다룰 수 없다는 말이 됩니다.

자. result set에 담아진 임의의 위치에 있는 테이터를 제어하려면 어떤 방법이 있을까요? result set으로 무엇을 하길 원하는지에 따라 달라집니다. 예를들어 JavaBeans component model을 지원하기위해서는 java.sql.ResultSet의 서브인터페이스인 javax.sql.RowSet 인터페이스를 이용할 필요가 있겠죠.

자바프로그램에서 데이타베이스를 액세스하는것은 꽤나 무거운 오퍼레이션이기 때문에 이런 경우 메모리에 올라와있는 데이타 캐시는 성능의 주요한 key factor가 되는데요. 메모리에 적재된 데이타를 이용하기위해서 javax.sql.RowSet의 서브인터페이스인 javax.sql.rowset.CachedRowSet을 이용할 수 있습니다.CachedRowSet인터페이스의 인스턴스는 원하는 데이터를 가져오기위해 항상 데이터 베이스에 접속하지 않고 이미 메모리 상에 올라온 데이터를 통하여 원하는 결과를 가져올 수있능 능력이 있습니다. 이에 더해  CachedRowSet은 스크롤, 데이터 변경이 가능하고, serializable 합니다. 또한 스프레드시트와 같은 표형식의 데이터 소스에도 잘 작동 합니다.

위에 기술한 모든 기능들과, 거기에 더해 result set의 출력을 XML로 한다든지 하는 기능이 필요하다면 javax.sql.rowset.WebRowSet이 적절한 해답일 수 있습니다. WebRowSet인터페이스에 대해 썬에서는 JDK 5.0에 이미 reference implementation클래스로 com.sun.rowset.WebRowSetImpl 클래스를 제공하고 있습니다.

javax.sql.rowset 패키지의 마지막 서브인터페이스인 javax.sql.rowset.JoinRowSet은 result set 내의 object를 대상으로 SQL JOIN문과 같은 조작을 수행 할 수 있는 기능을 제공합니다.

다음편으로 계속..

2008/11/09 13:59 2008/11/09 13:59
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다