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

}