Reutilizar código

4 respostas
A

Olá

Como eu faço para reutilizar o seguinte código:

public Statement stm;
public ResultSet rs;

public void executeSelect(String vSQL) {
        try {

            stm = conexao.createStatement();
            rs = stm.executeQuery(vSQL);

        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Não foi possível "
                    + "executar o comando SQL, " + erro + ", o SQL passado foi " + vSQL);
        }
    }

acontece o seguinte… seu eu for utilizar esse rotina executarSelect no mesmo JFrame mas de duas vezes dar erro. Então eu tive que ficar criando várias rotinas

public Statement stm;
public ResultSet rs;

public Statement stm2;
public ResultSet rs2;

public Statement stm3;
public ResultSet rs3;

Tem como eu limpar a variável pra ser reutilizada novamente. Eu tentei assim:

stm.clearBatch();
        rs.clearWarnings();

mas não funcionou

Obrigado

4 Respostas

Vini_Fernandes

Cara, procure pelo design pattern chamado DAO. Ele eh usado para encapsular toda a complexidade de acesso e persistencia de dados de uma aplicacao, consequentemente voce tera um grande reaproveitamento de codigo.

ate

ViniGodoy

Seu método tem diversos problemas:

  1. Ele não fecha a conexão;
  2. Ele não fecha o Statement;
  3. Ele não fecha o ResultSet;
  4. Ele mostra um JOptionPane numa camada onde ele não deveria ser mostrado;
  5. Ele não usa PreparedStatement (e deixa o código sujeito a ataque de SQL-Injection);

Sugestão: Se você não quer usar uma API de mapeamento objeto-relacional, como o Hibernate, dê uma olhada no Spring. As classes de acesso a dados dele já fazem esse mesmo tratamento que você quer reaproveitar, mas de uma maneira segura e correta, e com uma sintaxe praticamente igual a do java padrão.

A

Galera… eu sou iniciante em java… então não entendi muita coisa ou quase nada.

Então qual seria o melhor caminho a seguir? Se possível o mas fácil inicialmente.

ViniGodoy

Fica assim, embora esse ainda tenha a desvantagem de não usar o PreparedStatement:

public RowSet runQuery(String query){  
   try {
      Connection conn = null;
      Statement stmt = null;
      ResultSet rs = null;

      try{  
         conn = createConnection(); //Abre uma conexão com o banco.
         stmt = conn.createStatement();  //Cria o statement
         rs = stmt.executeQuery(query); //Executa a query

         //Copia para um RowSet
         CachedRowSet rowset = new CachedRowSetImpl();
         rowset.populate(rs);
         //Retorna o rowset
         return rowset;  
      } finally {
         //Garante o fechamento de todos os recursos
         if (conn != null) conn.close();
         if (stmt != null) stmt.close();
         if (rs != null) rs.close();
      }
   }catch(SQLException e){  
      //Se der problema, lança uma RuntimeException para que a interface
      //possa mostrar isso num JOptionPane (ou logar).
      throw new RuntimeException(e);
   }  
}

Pelo menos esse método tentará fechar todos os recursos.

Criado 3 de novembro de 2010
Ultima resposta 3 de nov. de 2010
Respostas 4
Participantes 3