6.1 Introdução ao RowSet

Como você já sabe, o padrão JDBC tem quase 20 anos e está um pouco desatualizado. Novos tipos e novas classes estão sendo adicionados lentamente a ele, mas isso não pode ser feito de maneira bonita em todos os lugares. E um desses lugares é ResultSet .

O banco de dados pode se tornar mais eficiente, mas a interface ResultSet não é adequada. Além disso, não criamos explicitamente seus objetos em nenhum lugar, eles são retornados para nós pelo executeQuery().

Os criadores do JDBC não pensaram muito e criaram um mecanismo totalmente paralelo a tudo o que existia antes. E ficou conhecido como RowSet .

Aqui estão seus principais benefícios:

  • RowSet estende a interface ResultSet, portanto, suas funções são mais poderosas que as do ResultSet.
  • RowSet navega com mais flexibilidade pelos dados da tabela e pode rolar para frente e para trás.
  • RowSet mantém dados em cache que podem ser usados ​​mesmo após o fechamento da conexão.
  • RowSet suporta novo método de conexão, você pode se conectar ao banco de dados sem conexão. Ele também suporta a leitura da fonte de dados XML.
  • RowSet suporta filtro de dados.
  • RowSet também oferece suporte a operações de junção de tabela.

Tipos de conjunto de linhas:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSetName
  • JoinRowSet
  • WebRowSet

6.2 Criando um objeto RowSet

Existem três maneiras diferentes de obter um objeto de trabalho.

Primeiro, ele pode ser preenchido com dados de um ResultSet obtido da maneira clássica.

Por exemplo, podemos armazenar em cache os dados ResultSet usando 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

Em segundo lugar, você pode criar um objeto RowSet completamente independente criando sua própria conexão de banco de dados para ele:


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();

E em terceiro lugar, você pode conectar o RowSet a uma conexão já existente:

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 Exemplos de trabalho com RowSet

Exemplo um: cache .

Vamos escrever um código onde usamos CachedRowSet para armazenar em cache todos os dados e lê-los de uma conexão já fechada:

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));
}

Exemplo dois: alterando linhas via 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

Se você estiver interessado em saber como funciona, pode ler o tópico na documentação oficial. Minha tarefa no momento é simplesmente dizer o que é.