Problema : JTable + MySQL

Olá pessoal.
Eu estou fazendo um cadastrinho simples (de iniciante meeesmo)
em java, usando Desktop. Porém, enfrento sérios problemas.

Primeiro, minha JTable não inseria mais de uma linha.
Isso já resolvi.

Agora, estou com problemas com o PreparedStatement.
Ele dá erro, e eu não consigo identificar o que é esse erro.
Nem achei aqui no GUJ.

Este é meu método de conexão, que tá em outra classe:

public Connection conect() { Connection con = null; try { Class.forName("org.gjt.mm.mysql.Driver"); String user = "root", pwd = "123", url = "jdbc:mysql://localhost/clientes"; con = DriverManager.getConnection(url, user, pwd); return con; } catch (ClassNotFoundException sql) { return con; } catch (SQLException sql) { return con; } }

E esse é o método para adicionar no banco de dados.
Os campos, o SQL tá perfeito, nenhum errinho.
Se fizer direto no banco ele insere mas o erro tá aqui.

[code]public boolean gravaCliente(Cliente cliente) {
Conexao con = new Conexao();
Connection co = con.conect();
String sql;
try {

        sql = "insert into clientes values (nome, datanasc, estcivil, cpf, "
                + "endereco, rg, sexo, bairro, cidade) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";

        PreparedStatement st = (PreparedStatement) co.prepareStatement(sql);        //O erro é aqui...
        st.setString(1, cliente.getNome());
        st.setString(2, cliente.getDtnasc());
        st.setString(3, cliente.getEstcivil());
        st.setString(4, cliente.getCPF());
        st.setString(5, cliente.getEndereco());
        st.setString(6, cliente.getRG());
        st.setString(7, cliente.getSexo());
        st.setString(8, cliente.getBairro());
        st.setString(9, cliente.getCidade());
        st.execute();
        st.close();

        return true;

    } catch (SQLException e) {
        return false;
    }
}[/code]

Para terem idéia, o Netbeans nem reporta erro.
Ele dá NullPointerException quando clico no botão inserir.
O qual eu to chamando assim:

[code]conexao.gravaCliente(cliente);

    if (conexao.gravaCliente(cliente)) {
        JOptionPane.showConfirmDialog(null, "Dado inserido com sucesso!");
    } else {
        JOptionPane.showConfirmDialog(null, "Falha ao gravar no banco de dados ");
    }[/code]

Isso num evento de ActionPerformed na minha view.

Agora encuquei.

Não faço sombra de idéia de o porque de dar esse erro.

Alguém me ajuda?

Obrigado desde já amigos.
:smiley:

public boolean gravaCliente(Cliente cliente) {  
        Conexao con = new Conexao();  
        Connection co = con.conect();  
        String sql;  
        try {  
   
          
            sql = "insert into clientes values (nome, datanasc, estcivil, cpf, "  
                    + "endereco, rg, sexo, bairro, cidade) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";  
  
            PreparedStatement st = co.prepareStatement(sql);        
            //Você está fazendo o casting no prepareStatement, mas você não tem que fazê-lo  
            st.setString(1, cliente.getNome());  
            st.setString(2, cliente.getDtnasc());  
            st.setString(3, cliente.getEstcivil());  
            st.setString(4, cliente.getCPF());  
            st.setString(5, cliente.getEndereco());  
            st.setString(6, cliente.getRG());  
            st.setString(7, cliente.getSexo());  
            st.setString(8, cliente.getBairro());  
            st.setString(9, cliente.getCidade());  
            st.execute();  
            st.close();  
  
            return true;  
  
        } catch (SQLException e) {  
            return false;  
        }  
        return false; //coloque isso aqui, senão ele vai reclamar também
    } 

Seu import está errado. O cast realmente não é necessário e a classe que deve ser importada é a java.sql.PreparedStatement (e não a org.gjt.mm.mysql.PreparedStatement).

Ótimo.
Vou testar e retorno o resultado.

Verdade, ao invés de importar

Class.forName("org.gjt.mm.mysql.Driver");

você vai utilizar:

Class.forName("com.mysql.jdbc.Driver");

:frowning:

Cara.
Não deu certo.
Fiz tudo o que me sugeriram.

E ele continua dando NullPointerException.

Use o modo debug da sua IDE para ver qual das variáveis está null.

O que o método con.conecta() faz?

Outra coisa, espero sinceramente que você não esteja usando o DefaultTableModel na sua tabela. Caso contrário, já prevejo que você terá ainda mais problemas…

O con.conect() é a instancia do método conect da Classe Conexao.

Conexao con = Conexao.conect();

Ele é reponsável por me conectar ao MySQL.

public Connection conect() { Connection con = null; try { Class.forName("com.mysql.jdbc.Driver"); String user = "root", pwd = "123", url = "jdbc:mysql://localhost/clientes"; con = DriverManager.getConnection(url, user, pwd); return con; } catch (ClassNotFoundException sql) { return con; } catch (SQLException sql) { return con; } }
Eu estou usando um modelo que eu criei.

Vejam:

[code]public DefaultTableModel getTabela(Cliente cliente) {
String[] colunas = new String[]{
“Nome”, “Data de Nascimento”,
“Est. Civil”, “CPF”, “Endereço”,
“RG”, “Sexo”, “Bairro”, “Cidade”
};
String[][] obj = new String[][]{
{“Andrey Luiz”,“30121991”,“Solteiro”,
“444555666-89”,“Rua General Osorio”,
“12444555-8”,“Masculino”,“Bairro Nacoes”,
“Foz do Jordao”}
};

    DefaultTableModel modelo = new DefaultTableModel(obj, colunas);
   
    return modelo;
}[/code]

Esse dados “Andrey Luiz”… e tal, eu coloquei só pra testar, mas normalmente eu deixei vazia a célula, pra ela
receber de meus edits.
Acho que eu criei um novo modelo desse jeito.

Pela minha visão de Java, ele deveria rodar do jeito que está.
Mas não está rodando.

Eu vou seguir o conselho do companheiro ali e iniciar um Debug pra ver o que dá.

Se tiverem mais sugestões, agradeço.

:smiley:

Não, voce não criou um novo modelo desse jeito.
Voce criou só mais uma ridicula isntancia do TableModel que não deveria ser usado.

Ah tá.
Eu vou esse tópico na sua assinatura e criar um modelo então.

Será que resolve o problema?

Porque parece que o problema não é na tabela e sim na conexao com o banco.

Óbvio que os dois são interligados, então pode haver influencia.

Os dois não deviam ser tão ligados.

O papel do banco seria apenas trazer os dados em uma forma que voce possa trabalhar (Como um List) e seu TableModel devia trabalhar com isso.

O seu método conecta faz algo completamente errado:

Quando o java dispara uma exceção, seu método engole a exception de erro e faz a conexão retornar null. Então, pergunto, tem certeza que nenhuma exceção daquelas é disparada? Se for, seu conn será nulo e, em seguida, seu con.prepareStatement resultará numa nullpointerexception.

Via de regra, nunca, jamais em hipótese nenhuma ignore os erros dados por exceções. São eles é que indicam o local exato do seu programa que tem problema. Você só deve ignorar isso, quando efetivamente tiver certeza que o problema nunca vai ocorrer ou, quando tiver um tratamento padrão para quando o erro ocorre, mas um tratamento que faça sentido (no caso, retornar null na conexão jamais faz sentido, já que você usa ela em seguida).

Se sua idéia era parar de se incomodar com as exceptions, nesse caso, era melhor fazer:

public Connection conect() { Connection con = null; try { Class.forName("com.mysql.jdbc.Driver"); String user = "root", pwd = "123", url = "jdbc:mysql://localhost/clientes"; con = DriverManager.getConnection(url, user, pwd); return con; } catch (Exception e) { //Repassamos o erro na forma de uma RuntimeException. //Ainda é uma exception, não obriga mais um try...catch. throw new RuntimeException("Ocorreram problemas na conexão", e); } }

Assim, você pode até depois programar um mecanismo para capturar esse tipo de exceção e loga-lo.

Noossa.
Tem toda a razão.
Se o meu banco não responder ele vai retornar nulo.

:smiley:

E é a causa (com certeza agora) do meu NullPointerException.

Bem analisado.

Eu vou testar e retorno o resultado.

Obrigado a todos.

:wink:

Ah… fizando que vou aprender a fazer modelos para as tabelas :wink:

Uhuul.
Rodou.

Obrigado a todos galera.

Foram de grande ajuda.

Abraços.

:smiley: