Using JdbcRowSet Objects
JdbcRowSet 객체 사용하기
JdbcRowSet 객체는 향상된 ResultSet 객체입니다. ResultSet 객체처럼 데이터 소스에 대한 연결을 유지하지만, 속성과 리스너 알림 메커니즘을 갖춘 JavaBeans 컴포넌트라는 점에서 차이가 있습니다.
JdbcRowSet 객체의 주요 용도 중 하나는 스크롤 및 업데이트가 불가능한 ResultSet 객체를 스크롤 가능하고 갱신 가능한 객체로 만드는 것입니다.
이 섹션에서는 다음 주제를 다룹니다:
- JdbcRowSet 객체 생성하기
- 기본 JdbcRowSet 객체
- 속성 설정하기
- JdbcRowSet 객체 사용하기
- 코드 예제
JdbcRowSet 객체 생성하기
JdbcRowSet 객체는 RowSetProvider 클래스에서 생성된 RowSetFactory 인스턴스를 사용하여 생성합니다. 다음 예제는 JdbcRowSetSample.java
에서 가져온 것입니다:
RowSetFactory factory = RowSetProvider.newFactory();
try (JdbcRowSet jdbcRs = factory.createJdbcRowSet()) {
jdbcRs.setUrl(this.settings.urlString);
jdbcRs.setUsername(this.settings.userName);
jdbcRs.setPassword(this.settings.password);
jdbcRs.setCommand("select * from COFFEES");
jdbcRs.execute();
// ...
}
RowSetFactory
인터페이스에는 다음과 같은 다양한 RowSet 구현을 생성할 수 있는 메서드가 포함되어 있습니다:
createCachedRowSet
createFilteredRowSet
createJdbcRowSet
createJoinRowSet
createWebRowSet
디폴트 JdbcRowSet 객체
RowSetFactory를 통해 JdbcRowSet 객체를 생성하면 다음과 같은 속성이 설정됩니다:
type
:ResultSet.TYPE_SCROLL_INSENSITIVE
(스크롤 가능한 커서)concurrency
:ResultSet.CONCUR_UPDATABLE
(업데이트 가능)escapeProcessing
: true (드라이버가 이스케이프 구문을 처리)maxRows
: 0 (행 수 제한 없음)maxFieldSize
: 0 (열 값의 바이트 수 제한 없음)queryTimeout
: 0 (쿼리 실행 시간 제한 없음)showDeleted
: false (삭제된 행 보이지 않음)transactionIsolation
:Connection.TRANSACTION_READ_COMMITTED
(커밋된 데이터만 읽음)typeMap
: null (연결에 연관된 타입 매핑 없음)
핵심은 JdbcRowSet 및 다른 모든 RowSet 객체는 기본적으로 스크롤 가능하며 업데이트도 가능하다는 점입니다.
속성 설정하기
디폴트 생성자를 사용하는 경우, 새 JdbcRowSet 객체를 데이터로 채우기 전에 다음 속성들을 설정해야 합니다.
JdbcRowSet 객체가 데이터를 가져오려면 데이터베이스에 연결해야 합니다. 연결을 위해 다음 네 가지 속성이 사용됩니다:
username
: 데이터베이스 사용자 이름password
: 사용자 비밀번호url
: 연결할 데이터베이스의 JDBC URLdatasourceName
: JNDI 이름 서비스에 등록된 DataSource 객체 이름
JNDI 등록이 어렵다면, 예제 코드들처럼 DriverManager
메커니즘을 사용하여 url
속성을 통해 연결할 수 있습니다.
또한, command
속성도 반드시 설정해야 합니다. 이는 JdbcRowSet 객체가 가질 데이터의 쿼리를 나타냅니다:
jdbcRs.setCommand("select * from COFFEES");
jdbcRs.execute();
execute
메서드는 다음 작업을 수행합니다:
- 지정된 URL, 사용자 이름, 비밀번호로 DB에 연결
command
속성에 지정된 쿼리를 실행- 결과 ResultSet의 데이터를 JdbcRowSet 객체로 읽어들임
JdbcRowSet 객체 사용하기
JdbcRowSet 객체에서의 행 업데이트, 삽입, 삭제는 ResultSet 객체에서와 동일하게 동작합니다. 커서 이동 역시 스크롤 가능한 ResultSet과 동일하게 가능합니다.
예를 들어, Coffee Break 체인이 인수한 이전 시스템은 스크롤 및 업데이트를 지원하지 않는 ResultSet만 제공합니다. 이 경우 JdbcRowSet 객체를 사용하면 해당 기능을 추가할 수 있습니다.
JdbcRowSet 객체는 데이터베이스에 지속적으로 연결되어 있기 때문에, 데이터 변경 사항은 즉시 DB에 반영됩니다.
JdbcRowSet 탐색하기
비스크롤 ResultSet은 next()
만 사용할 수 있지만, JdbcRowSet은 absolute()
, previous()
등 모든 커서 이동 메서드를 사용할 수 있습니다.
jdbcRs.absolute(4); // 4번째 행으로 이동
jdbcRs.previous(); // 다시 3번째 행으로 이동
컬럼 값 업데이트
예: Espresso 커피의 가격을 10.99로 변경
jdbcRs.absolute(3);
jdbcRs.updateFloat("PRICE", 10.99f);
jdbcRs.updateRow();
updateRow()
호출로 데이터베이스도 함께 업데이트됩니다.
행 삽입
HouseBlend와 HouseDecaf 커피를 COFFEES 테이블에 추가:
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "HouseBlend");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateFloat("PRICE", 7.99f);
jdbcRs.updateInt("SALES", 0);
jdbcRs.updateInt("TOTAL", 0);
jdbcRs.insertRow();
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "HouseDecaf");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateFloat("PRICE", 8.99f);
jdbcRs.updateInt("SALES", 0);
jdbcRs.updateInt("TOTAL", 0);
jdbcRs.insertRow();
두 행이 jdbcRs
와 데이터베이스 모두에 삽입됩니다.
행 삭제
마지막 행 (예: French Roast Decaf)을 삭제:
jdbcRs.last();
jdbcRs.deleteRow();
코드 예제
JdbcRowSetSample.java
는 다음 작업을 수행합니다:
- COFFEES 테이블에서 모든 행을 조회하는 쿼리 실행 결과로 JdbcRowSet 객체 생성
- 세 번째 행의 PRICE 값을 10.99로 업데이트
- HouseBlend, HouseDecaf 두 개의 새 행 삽입
- 마지막 행 삭제
출처 : https://docs.oracle.com/javase/tutorial/jdbc/basics/jdbcrowset.html
Using JdbcRowSet Objects (The Java™ Tutorials > JDBC Database Access > JDBC Basics)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag
docs.oracle.com