Introdução à interface RowDet JDBC em Java
1. Visão geral
Neste artigo, estamos revisando a interface JDBCRowSet. A JDBC RowSet object holds tabular data in a style that makes it more adaptable and simpler to use than a result set.
A Oracle definiu cinco interfacesRowSet para os usos mais frequentes de umRowSet:
-
JdbcRowSet
-
CachedRowSet
-
WebRowSet
-
JoinRowSet
-
FilteredRowSet
Neste tutorial, revisaremos como usar essas interfacesRowSet.
2. JdbcRowSet
Vamos começar comJdbcRowSet - vamos simplesmente criar um passando um objetoConnection paraJdbcRowSetImpl:
JdbcRowSet jdbcRS = new JdbcRowSetImpl(conn);
jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
String sql = "SELECT * FROM customers";
jdbcRS.setCommand(sql);
jdbcRS.execute();
jdbcRS.addRowSetListener(new ExampleListener());
while (jdbcRS.next()) {
// each call to next, generates a cursorMoved event
System.out.println("id = " + jdbcRS.getString(1));
System.out.println("name = " + jdbcRS.getString(2));
}
No exemplo acima,jdbcRs não continha dados até definirmos a instrução SQL com o métodosetCommande executarmos o métodoexecute.
Observe também como, para realizar o tratamento de eventos, adicionamos umRowSetListener aoJdbcRowSet.
JdbcRowSet é diferente das outras quatro implementações deRowSet - porqueit’s always connected to the database e por isso é mais semelhante ao objetoResultSet.
3. CachedRowSet
Um objetoCachedRowSet é único porque pode operar sem estar conectado à sua fonte de dados. Chamamos isso de “objetoRowSet desconectado”.
CachedRowSet recebe esse nome devido ao fato de que armazena seus dados em cache na memória para que possa operar em seus próprios dados em vez dos dados armazenados em um banco de dados.
Como a interfaceCachedRowSet ésuper interface for all disconnected RowSet objects, o código que revisamos abaixo também se aplica aWebRowSet,JoinRowSet ouFilteredRowSet:
CachedRowSet crs = new CachedRowSetImpl();
crs.setUsername(username);
crs.setPassword(password);
crs.setUrl(url);
crs.setCommand(sql);
crs.execute();
crs.addRowSetListener(new ExampleListener());
while (crs.next()) {
if (crs.getInt("id") == 1) {
System.out.println("CRS found customer1 and will remove the record.");
crs.deleteRow();
break;
}
}
4. WebRowSet
A seguir, vamos dar uma olhada emWebRowSet.
Isso também é único porque, além de oferecer os recursos de um objetoCachedRowSet,it can write itself to an XML document e também pode ler esse documento XML para se converter de volta emWebRowSet:
WebRowSet wrs = new WebRowSetImpl();
wrs.setUsername(username);
wrs.setPassword(password);
wrs.setUrl(url);
wrs.setCommand(sql);
wrs.execute();
FileOutputStream ostream = new FileOutputStream("customers.xml");
wrs.writeXml(ostream);
Usando o métodowriteXml, gravamos o estado atual de um objetoWebRowSet em um documento XML.
Ao passar o métodowriteXml um objetoOutputStream, escrevemos em bytes em vez de caracteres, o que pode ser bastante útil para lidar com todas as formas de dados.
5. JoinRowSet
JoinRowSet nos permite criar um SQLJOIN entre objetosRowSet quando estes estão na memória. Isso é significativo porque nos poupa a sobrecarga de ter que criar uma ou mais conexões:
CachedRowSetImpl customers = new CachedRowSetImpl();
// configuration of settings for CachedRowSet
CachedRowSetImpl associates = new CachedRowSetImpl();
// configuration of settings for this CachedRowSet
JoinRowSet jrs = new JoinRowSetImpl();
jrs.addRowSet(customers,ID);
jrs.addRowSet(associates,ID);
Como cada objetoRowSet adicionado a um objetoJoinRowSet precisa de uma coluna de correspondência, a coluna na qual o SQLJOIN se baseia, especificamos“id” noaddRowSet método.
Observe que, em vez de usar o nome da coluna, também poderíamos ter usado o número da coluna.
6. FilteredRowSet
Finalmente, oFilteredRowSetlets us cut down the number of rows that are visible em um objetoRowSet para que possamos trabalhar apenas com os dados que são relevantes para o que estamos fazendo.
Decidimos como queremos “filtrar” os dados usando uma implementação da interfacePredicate:
public class FilterExample implements Predicate {
private Pattern pattern;
public FilterExample(String regexQuery) {
if (regexQuery != null && !regexQuery.isEmpty()) {
pattern = Pattern.compile(regexQuery);
}
}
public boolean evaluate(RowSet rs) {
try {
if (!rs.isAfterLast()) {
String name = rs.getString("name");
System.out.println(String.format(
"Searching for pattern '%s' in %s", pattern.toString(),
name));
Matcher matcher = pattern.matcher(name);
return matcher.matches();
} else
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// methods for handling errors
}
Agora, aplicamos esse filtro a um objetoFilteredRowSet:
RowSetFactory rsf = RowSetProvider.newFactory();
FilteredRowSet frs = rsf.createFilteredRowSet();
frs.setCommand("select * from customers");
frs.execute(conn);
frs.setFilter(new FilterExample("^[A-C].*"));
ResultSetMetaData rsmd = frs.getMetaData();
int columncount = rsmd.getColumnCount();
while (frs.next()) {
for (int i = 1; i <= columncount; i++) {
System.out.println(
rsmd.getColumnLabel(i)
+ " = "
+ frs.getObject(i) + " ");
}
}
7. Conclusão
Este tutorial rápido cobriu as cinco implementações padrão da interfaceRowSet disponível no JDK.
Discutimos a configuração de cada implementação e mencionamos as diferenças entre elas.
Como apontamos, apenas uma das implementações deRowSet é um objetoRowSet conectado - oJdbcRowSet. Os outros quatro são objetosRowSet desconectados.
E, como sempre, o código completo deste artigo pode ser encontradoover on Github.