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:
ConexaoBancoconecta=newConexaoBanco();PreparedStatementpsmt=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+"'");ResultSetrs=psmt.executeQuery();rs.next();System.out.println(rs.getString("Total"));conecta.con.close();rs.close();
Aqui está a classe de conexão:
packageEstudo;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.swing.JOptionPane;/** * * @author Celso José Pereira */publicclassConexaoBanco{Connectioncon=null;publicConnectionconecta(){try{Stringfonte="jdbc:postgresql://localhost:5432/Testes";Stringusuario="celsojp";Stringsenha="senha";Class.forName("org.postgresql.Driver");con=DriverManager.getConnection(fonte,usuario,senha);}catch(ClassNotFoundExceptione){JOptionPane.showMessageDialog(null,"Erro em ClassNotFoundException: "+e.getMessage());}catch(SQLExceptione){JOptionPane.showMessageDialog(null,"Erro em SQLException: "+e.getMessage());}catch(NoClassDefFoundErrore){JOptionPane.showMessageDialog(null,"Erro em NoClassDefFoundError: "+e.getMessage());}returncon;}}
Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar
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.
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.
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 é.
Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.
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!
neoCortex
sergiotaborda:
Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar
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.
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.
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 é.
Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.
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:
SharedrecursosCompartilhados=newShared();ResultSetresultado=null;try{StringsqlBuscaUser="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(SQLExceptionex){Logger.getLogger(Login.class.getName()).log(Level.SEVERE,null,ex);}
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!
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!!!
julianofischer
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!