6.1 RowSet 소개

이미 알고 있듯이 JDBC 표준은 거의 20년이 되었으며 약간 구식입니다. 새로운 유형과 새로운 클래스가 천천히 추가되고 있지만 모든 곳에서 아름답게 할 수는 없습니다. 그리고 그 장소 중 하나는 ResultSet 입니다 .

데이터베이스는 더 효율적으로 만들 수 있지만 ResultSet 인터페이스 는 적합하지 않습니다. 또한 명시적으로 객체를 생성하지 않고 executeQuery().

JDBC의 제작자는 오래 생각하지 않고 이전의 모든 것과 완전히 평행한 메커니즘을 만들었습니다. 그리고 그것은 RowSet 로 알려지게 되었습니다 .

주요 이점은 다음과 같습니다.

  • RowSet은 ResultSet 인터페이스를 확장하므로 그 기능은 ResultSet보다 강력합니다.
  • RowSet은 테이블 데이터를 보다 유연하게 탐색하고 앞뒤로 스크롤할 수 있습니다.
  • RowSet은 연결이 종료된 후에도 사용할 수 있는 캐시된 데이터를 유지합니다.
  • RowSet은 새로운 연결 방법을 지원하므로 연결하지 않고도 데이터베이스에 연결할 수 있습니다. 또한 XML 데이터 원본 읽기를 지원합니다.
  • RowSet은 데이터 필터를 지원합니다.
  • RowSet은 테이블 조인 작업도 지원합니다.

행 세트 유형:

  • 캐시된 행 세트
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 RowSet 객체 생성

작업 개체를 가져오는 방법에는 세 가지가 있습니다.

첫째, 전통적인 방식으로 얻은 ResultSet 의 데이터로 채울 수 있습니다 .

예를 들어 CachedRowSet을 사용하여 ResultSet 데이터를 캐시할 수 있습니다 .

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);		// Use ResultSet to populate

둘째, 자체 데이터베이스 연결을 생성하여 완전히 독립된 RowSet 객체를 생성할 수 있습니다.

JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

셋째, 이미 존재하는 연결에 RowSet을 연결할 수 있습니다.

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

6.3 RowSet 작업의 예

예 1: 캐싱 .

CachedRowSet을 사용하여 모든 데이터를 캐시하고 이미 닫힌 연결에서 읽는 코드를 작성해 보겠습니다 .

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);	// Use ResultSet to populate

connection.close();		// Close the connection

// Cache data is still available
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

예제 2: RowSet을 통해 행 변경 :

// Connect to the database
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// This type of operation can only change standalone RowSet
// First, move the pointer to an empty (new) string, the current position is remembered
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Clone" + System.currentTimeMillis());
 crs.updateString(3, "Female");
 crs.insertRow();  // Add the current (new) line to the rest of the lines
 crs.moveToCurrentRow(); // Return a pointer to the line where it was before insertion

 crs.beforeFirst();
 while(crs.next()) {
 	System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}

// And now we can upload all our changes to the database
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Needed for synchronization
crs.acceptChanges(con);// Synchronize data to database

작동 방식에 관심이 있는 경우 공식 문서에서 주제를 읽을 수 있습니다. 현재 내 임무는 단순히 그것이 무엇인지 말하는 것입니다.