O Resultset é uma classe da API JAVA que permite percorrermos um DataTable de alguma consulta em um banco de dados.
Ao ser inicializado, o Resultset coloca seu cursor na primeira linha do DataTable, o método next() permite que o ponteiro seja direcionado para a próxima linha caso exista.
Além de conseguirmos carregar dados de uma consulta a alguma tabela de um banco de dados, conseguimos armazenar vários DataTable’s que podem ser por exemplo vários retornos de um procedure. O método getMoreResults() faz com que o ponteiro seja direcionado para a primeira posição do próximo DataTable caso ele exista. Isso possibilita uma única requisição ao banco de dados e obter vários retornos visando performance e centralização de processos.
Um exemplo de uma procedure que retorna os dados de clientes e os dados de fornecedores que estão em tabelas diferentes e sem qualquer ligação, em uma mesma consulta pode ser chamada de RETORNA_CLI_FORN() que tem as consultas das duas tabelas.
Usaremos uma classe para a conexão com banco chamada Conexao:
package multiplosResults;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
*
* @author Adaylon
*/
public class Conexao {
public Connection conPostgree() {
Connection con = null;
String driver = "org.postgresql.Driver";
String user = "postgres";
String senha = "ms6tgs";
String url = "jdbc:postgresql://localhost:5432/VENDAS";
try {
Class.forName(driver);
con = (Connection) DriverManager.getConnection(url, user, senha);
System.out.println("Conexão realizada com sucesso.");
}
catch (ClassNotFoundException ex) {
System.err.println(ex.getMessage());
} catch (SQLException e) {
System.err.println(e.getMessage());
}
return con;
}
}
A classe instancia um driver do banco de dados escolhido e retorna um objeto do tipo Connection.
Criamos uma classe para representar o objeto Cliente com seus atributos encapsulados:
/*
*
*
*/
package multiplosResults;
import java.util.Date;
/**
*
* @author Adaylon
*/
public class Clientes {
private static String nome;
private static String cpf;
private static String tel;
private static Date dataNasc;
/**
* @return the nome
*/
public static String getNome() {
return nome;
}
/**
* @param aNome the nome to set
*/
public static void setNome(String aNome) {
nome = aNome;
}
/**
* @return the cpf
*/
public static String getCpf() {
return cpf;
}
/**
* @param aCpf the cpf to set
*/
public static void setCpf(String aCpf) {
cpf = aCpf;
}
/**
* @return the tel
*/
public static String getTel() {
return tel;
}
/**
* @param aTel the tel to set
*/
public static void setTel(String aTel) {
tel = aTel;
}
/**
* @return the dataNasc
*/
public static Date getDataNasc() {
return dataNasc;
}
/**
* @param aDataNasc the dataNasc to set
*/
public static void setDataNasc(Date aDataNasc)
{
dataNasc = aDataNasc;
}
}
Criamos uma classe para representar o objeto Fornecedor com seus atributos encapsulados:
/*
*
*
*/
package multiplosResults;
/**
*
* @author Adaylon
*/
public class Fornecedores {
private static String nome;
private static String cnpj;
/**
* @return the nome
*/
public static String getNome() {
return nome;
}
/**
* @param aNome the nome to set
*/
public static void setNome(String aNome) {
nome = aNome;
}
/**
* @return the cnpj
*/
public static String getCnpj() {
return cnpj;
}
/**
* @param aCnpj the cnpj to set
*/
public static void setCnpj(String aCnpj) {
cnpj = aCnpj;
}
}
Criamos uma classe com o nome Consultas que executa a procedure RETORNA_CLI_FORN() e carrega os Resultsets:
/*
*
*
*/
package multiplosResults;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Adaylon
*/
public class Consultas {
private static ArrayList<Clientes> c;
private static ArrayList<Fornecedores> f;
public Consultas() {
try {
ResultSet[] rs = new ResultSet[2];
Connection con = new Conexao().conPostgree();
CallableStatement cs = null;
String sql = "{CALL RETORNA_CLI_FORN()}";
cs = con.prepareCall(sql);
//Execução da query sql e obtendo o resultado da primeira consulta
rs[0] = cs.executeQuery();
c = new ArrayList<Clientes>();
Clientes cl = new Clientes();
while(rs[0].next()){
cl.setNome(rs[0].getString("NOME"));
cl.setCpf(rs[0].getString("CPF"));
cl.setTel(rs[0].getString("TEL"));
cl.setDataNasc(rs[0].getDate("DATA_NASCIMENTO"));
c.add(cl);
}
//Verificação de novos DataTables
if (cs.getMoreResults()) {
//Obtendo o próximo Resultset
rs[1] = cs.getResultSet();
f = new ArrayList<Fornecedores>();
Fornecedores fo = new Fornecedores();
while(rs[1].next()){
fo.setNome(rs[1].getString("NOME"));
fo.setCnpj(rs[1].getString("CNPJ"));
f.add(fo);
}
}
} catch (SQLException ex) {
Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
}
}
public Iterator retornaClientes() {
Iterator i = c.iterator();
return i;
}
public Iterator retornaFornecedores() {
Iterator i = f.iterator();
return i;
}
}
Na classe Main instanciamos um objeto Consultas que faz a execução da procedure no seu construtor, e após chamarmos os métodos que retornam uma lista de Clientes e uma lista de Fornecedores, fazemos um loop mostrando o resultado das duas consultas que foram retornadas no mesmo bloco de execução.
/*
*
*
*/
package multiplosResults;
import java.util.Iterator;
/**
*
* @author Adaylon
*/
public class Main {
public static void main(String[] args){
Consultas c = new Consultas();
Iterator _ic = null;
Iterator _if = null;
Clientes cl = new Clientes();
Fornecedores fo = new Fornecedores();
_ic = c.retornaClientes();
_if = c.retornaFornecedores();
while(_ic.hasNext()){
cl = (Clientes) _ic.next();
System.out.println(cl.getNome()+" - "+cl.getCpf()+" -"+cl.getTel()+"
- "+cl.getDataNasc());
}
while(_if.hasNext()){
fo = (Fornecedores) _if.next();
System.out.println(fo.getNome()+" - "+fo.getCnpj());
}
}
}