Ajuda statement usando MYSQL

13 respostas
F

Pessoal, sou inciante em Java apesar de ja ter experiência em C++, Delphi e VB e estou tendo algumas dificuldades em desenvolver um sistema no qual estou trabalhando, eis o problema:

Estou começando pela parte de login da aplicação que deve checar se as credênciais (user e pass) existem e batem com os que estão na tabela do banco MYSQL, criei uma classe com os componentes gráficos e listeners dos objetos (login.java), uma que contem a conexão com o DB (ConBD.java) e estou empacado em uma outra classe que criei para que a “query” em si seja feita, vejam como está meu ConBD.java:

public class ConBD {

    public ConBD() throws ClassNotFoundException {
        Connection con = null;
        String URL = "jdbc:mysql://127.0.0.1:3306/Giga";
        String usuario = "root";
        String pass = XXXX;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(URL, usuario, pass);
            Statement stm = con.createStatement();
        } catch(SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null,"Erro na conexão com o Banco de Dados!","GigaPlast - We know plastic", JOptionPane.WARNING_MESSAGE);
        }
        }

}

Agora como fazer para que eu possa usar a variável con na classe Loga.java para criar os Statements?

13 Respostas

rodrigo.ferreira

Boa noite!

Você não deve fazer isto no construtor da classe.

Faça mais ou menos assim:

public class ConBD {  
      
        Connection con = null;  

        public ConBD() {  
        }

        public Connection getConnection() {

            String URL = "jdbc:mysql://127.0.0.1:3306/Giga";  
            String usuario = "root";  
            String pass = XXXX;  

            try {  
               Class.forName("com.mysql.jdbc.Driver");  
               con = DriverManager.getConnection(URL, usuario, pass);
            } catch(SQLException ex) {  
               ex.printStackTrace();   
            }  

            return con;

           }  
     
       }
   }

A classe acima seria apenas para obter uma connection (claro que precisa ser melhorada) mas a arquitetura seria esta…

Você deve utilizar uma outra classe que chamará esta para obter a conexão, depois, você criará o Statement na outra classe utilizando a Connection que será retornada desta e não na classe de conexão. Logo, seu projeto ficará bem mais claro e fácil de manter.

Abraço,

Visite o Blog do Perereca: http://www.blogdoperereca.blogspot.com

thundercas

Fernando,

Você deve criar um método getConnection() e retornar o objeto Connection… Esta classe deve ser utilizada somente para conectar-se ao banco (ConnectionFactory)… Daí, com o objeto Connection retornado, você consegue fazer a consulta que quiser em outras classes…

Espero ter ajudado…
abraços

F

Estou obtendo o seguinte erro:
Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code - exception java.lang.ClassNotFoundException is never thrown in body of corresponding try statement

oq seria? Não consegui entender…

A

Vc esta usando o exemplo do rodrigo ?
Se sim, esta faltando um throw ClassNotFoundException na assinatura do metodo ou um catch pra este mesmo exception, onde voce irá colocar vai depender de onde irá querer tratar o erro.

M

rodrigo.ferreira:
Boa noite!

Você não deve fazer isto no construtor da classe.

Faça mais ou menos assim:

public class ConBD {  
      
        Connection con = null;  

        public ConBD() {  
        }

        public Connection getConnection() {

            String URL = "jdbc:mysql://127.0.0.1:3306/Giga";  
            String usuario = "root";  
            String pass = XXXX;  

            try {  
               Class.forName("com.mysql.jdbc.Driver");  
               con = DriverManager.getConnection(URL, usuario, pass);
            } catch(SQLException ex) {  
               ex.printStackTrace();   
            }  

            return con;

           }  
     
       }
   }

A classe acima seria apenas para obter uma connection (claro que precisa ser melhorada) mas a arquitetura seria esta…

Você deve utilizar uma outra classe que chamará esta para obter a conexão, depois, você criará o Statement na outra classe utilizando a Connection que será retornada desta e não na classe de conexão. Logo, seu projeto ficará bem mais claro e fácil de manter.

Abraço,

Visite o Blog do Perereca: http://www.blogdoperereca.blogspot.com

Porque não se deve criar a conexão no construtor da classe ?
Agradece,

Max Carvalho

F

Obrigado a todos pela ajuda, primeiros problemas já foram resolvidos mas agora tenho um novo:

ConBD é a classe que tem um metodo Conectar para abrir a conexão com o Banco de Dados e um método Desconectar para fechar a conexão com o BD e me retorna o getconnection desta conexão, oq torna possível que eu utilize este return para criar as querys de validação em uma outra classe. Certo?

Na classe Ident.java (que fará a validação de usuário e senha do sistema) eu tenho o seguinte:
public class Ident {

    public void Ident(ConBD conexao) {
        //JOptionPane.showMessageDialog(null,"teste1");
        //conexao.Desconectar();
        Statement stm = conexao.createStatement();
    }
}

mas o problema é que deste jeito a IDE me fala que não existe o método createStatement na classe ConBD, como resolver?

M

posta sua classe ConDB atual

F
public class ConBD {

    public Connection con = null;

    public Connection Conectar() throws ClassNotFoundException, SQLException {
        String URL = "jdbc:mysql://127.0.0.1:3306/Giga";
        String usuario = "root";
        String pass = "18nando05";
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(URL, usuario, pass);
        //Statement stm = con.createStatement();
        return con;
        }

    public void Desconectar() throws SQLException {
        con.close();
    }
}
LPJava

nao seria boa pratica mas poderia colocar a variavel con como instancia publica, no seu exemplo ela eh variavel local nao é possivel invoca-la a partir de outra class.

M
Realmente do jeito que você está passando não vai existir o método createStatement, o motivo é que o parâmetro que você está passando é do tipo ConBD e não do tipo Connection o que você deve fazer é algo do tipo:
public class Ident {  
   
     public void Ident(ConBD conexao) {  
         //JOptionPane.showMessageDialog(null,"teste1");  
         //conexao.Desconectar();  
         Statement stm = conexao.Conectar().createStatement();  
     }  
 }

Acho que assim funciona

F

Eu achei que eu poderia usá-la desde que o método desse return dela quando uma outra classe chamasse este método, ou não? Na verdade eu ja estou usando ela em uma outra classe e aparentemente está funcionando.

LPJava

mas eu nao disse que nao ia funcionar, é questao de nomeacao o programador usa se achar conveniente. como por exemplo:

...
public void setNome(String nome){}

public  void NOmE(String nome){}

vc usa set se quiser seguir a nomeacao da Sun, ambos métodos compilam, claro nao na mesma classe devido eles terem o meso tipo de retorno e argumentos iguais.

Se vc usar o public em sua variavel de instancia vai compilar tranquilo ja que é um modificador valido para esse membro.

F

LPJava:
mas eu nao disse que nao ia funcionar, é questao de nomeacao o programador usa se achar conveniente. como por exemplo:

...
public void setNome(String nome){}

public  void NOmE(String nome){}

vc usa set se quiser seguir a nomeacao da Sun, ambos métodos compilam, claro nao estando na mesma classe devido eles terem o meso tipo de retorno e argumentos iguais.

Se vc usar o public em sua variavel de instancia vai compilar tranquilo ja que é um modificador valido para esse membro.

Entendi… valeu pela dica LPJava

Criado 26 de maio de 2009
Ultima resposta 5 de jun. de 2009
Respostas 13
Participantes 7