Tentando modularizar Connection!

Senhores!!!

Estou tentando criar uma classe só para conexão e possivelmente para recordset com retorno porém isso está me dando uma série de dores de cabeça e erros não entendo o que está acontecendo e gostaria de uma ajuda dos universitários :D.
Estou chamando ela nas outras classes dessa forma:

ConexaoBanco conecta = new ConexaoBanco();
PreparedStatement psmt = conecta.con.prepareStatement("SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'" );
              System.out.println("SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'" );
               
               ResultSet rs = psmt.executeQuery(); 
               rs.next();
               System.out.println(rs.getString("Total"));
           conecta.con.close();
           rs.close();

Aqui está a classe de conexão:

[code]
package Estudo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
*

  • @author Celso José Pereira
    */
    public class ConexaoBanco {
    Connection con = null;
    public Connection conecta(){

     try{
         String fonte = "jdbc:postgresql://localhost:5432/Testes";
         String usuario = "celsojp";
         String senha = "senha";
         Class.forName("org.postgresql.Driver");
         
       con = DriverManager.getConnection(fonte,usuario,senha);
       
          
        
    
     }
     catch(ClassNotFoundException e){
         JOptionPane.showMessageDialog(null, "Erro em ClassNotFoundException: " + e.getMessage());
     
      }
     catch(SQLException e){
         JOptionPane.showMessageDialog(null, "Erro em SQLException: " + e.getMessage());
     }
     catch(NoClassDefFoundError e){
         JOptionPane.showMessageDialog(null, "Erro em NoClassDefFoundError: " + e.getMessage());
     }
    

    return con;
    }
    } [/code]

Um Grande Abraço!!!

Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar

  1. Não use Comunicação com o usuário dentro de um catch a menos que a classe seja a ultima na hierarquia ( ou seja, ou passa para o usuário ou vai para a JVM) . Use exceções especificas agrupadas numa exção maior como DataSourceException ou DataBaseConnectionException.
  2. Use try/catch durante a execução do processo. Use finally para fechar a conexão. Ele tem que se ser fechada independentemente se houve erro ou não.
  3. Não use Connexção.con.prepared crie um método onde vc passa o SQL e internamente é criado statement. Vc não pode usar um statement estático porque quando a conexõ é fechada o statement tb é.
  4. Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.

Você poderia fazer um construtor com parâmetros para que possa alterar o host, login e senha de sua conexão…
um sem nada seria bom também, assim você usaria os sets para criar uma conexão!

[quote=sergiotaborda]Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar

  1. Não use Comunicação com o usuário dentro de um catch a menos que a classe seja a ultima na hierarquia ( ou seja, ou passa para o usuário ou vai para a JVM) . Use exceções especificas agrupadas numa exção maior como DataSourceException ou DataBaseConnectionException.
  2. Use try/catch durante a execução do processo. Use finally para fechar a conexão. Ele tem que se ser fechada independentemente se houve erro ou não.
  3. Não use Connexção.con.prepared crie um método onde vc passa o SQL e internamente é criado statement. Vc não pode usar um statement estático porque quando a conexõ é fechada o statement tb é.
  4. Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.
    [/quote]

Bom dia Sergio!!!

Primeiramente Agradeço pela sua ajuda.
Resolvi retornar o recordset pra variar e funcionou, acho que estou pensando de forma muito estruturada ainda rs!!!

Não entendi o 1º e o 4º itens se puder ser um pouco mais específico eu agradeceria más, consegui resolver o problema olha como ficou o código:

Chamada:

Shared recursosCompartilhados = new Shared();
 ResultSet resultado =null;

try {
      String sqlBuscaUser = "SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'";     
      resultado = recursosCompartilhados.conecta(sqlBuscaUser);
      resultado.next();
      System.out.println(resultado.getInt("Total"));
      if(resultado.getInt("Total")==1){
      JOptionPane.showMessageDialog(null,"Logou");
      }else{
      JOptionPane.showMessageDialog(null,"Nome de Usuário e/ou Senha Incorretos!","Informação de Login",JOptionPane.ERROR_MESSAGE);
      }
      }catch (SQLException ex) {
      Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
      }

Função:

private ResultSet rs = null;
private Connection con = null;

 public ResultSet conecta(String sql) throws SQLException{
            
        try{
            String fonte = "jdbc:postgresql://localhost:5432/Testes";
            String usuario = "celsojp";
            String senha = "senhazinha";
            Class.forName("org.postgresql.Driver");
            
      con = DriverManager.getConnection(fonte,usuario,senha);
      PreparedStatement psmt = con.prepareStatement(sql);
      rs  = psmt.executeQuery();
          }
        catch(ClassNotFoundException e){
            JOptionPane.showMessageDialog(null, "Erro em ClassNotFoundException: " + e.getMessage());
        
         }
        catch(SQLException e){
            JOptionPane.showMessageDialog(null, "Erro em SQLException: " + e.getMessage());
        }
        catch(NoClassDefFoundError e){
            JOptionPane.showMessageDialog(null, "Erro em NoClassDefFoundError: " + e.getMessage());
        }
        finally{
            con.close();
        }
       
       
    return rs;  
    } 

Um grande Abraço!!!

[quote=julianofischer]Você poderia fazer um construtor com parâmetros para que possa alterar o host, login e senha de sua conexão…
um sem nada seria bom também, assim você usaria os sets para criar uma conexão![/quote]

Bom dia Juliano tudo bem?

Na verdade host, login e senha são padrões mesmo, vai acessar um único banco somente. Já o bom e velho sql é o que muda com água rs…
Postei a função logo acima, não consigo fechar o rs dessa forma mas a conexão fica padrão.

Um grande abraço!!!

Tudo bem Neo (posso chamá-lo assim certo?)…
Mas já que java está muito ligada a reaproveitamento de código, você poderia criar a classe da maneira que eu lhe disse para que possa utilizá-la em outras conexões sem ter de alterar a classe para cada nova conexão!
:smiley: