jTable - MySQL (AJUDA PLEASE) [RESOLVIDO]

Tenho 1 frame, que contem uma tabela vazia, e 1 Botão “Inserir” que chama a classe ConectaBanco…

Botão:

[code] private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

    String Inome, Iendereco, Itelefone, Icelular, Iemail;
    Inome = jTextField1.getText();
    Iendereco = jTextField2.getText();
    Itelefone = jTextField3.getText();
    Icelular = jTextField4.getText();
    Iemail = jTextField5.getText();


    ConectaBanco c = new ConectaBanco();
    Connection conec = null;
    try {
        conec = c.conecta();
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(FrameCadastroCliente.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(FrameCadastroCliente.class.getName()).log(Level.SEVERE, null, ex);
    }

    InsereBanco insereBanco = new InsereBanco();
    try {
        insereBanco.insertCliente(conec, Inome, Iendereco, Itelefone, Icelular, Iemail);
    } catch (SQLException ex) {
        Logger.getLogger(FrameCadastroCliente.class.getName()).log(Level.SEVERE, null, ex);
    }
}

[/code]

ConectaBanco:

public class ConectaBanco {

    public Connection conecta() throws ClassNotFoundException, SQLException {
        Connection connection = null;

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

        String url = "jdbc:mysql://" + "localhost" + ":3306/" + "restaurante"; 
        connection = DriverManager.getConnection(url, "root", "admin");    


        return connection;
}       

Ele retorna a conexão… Caso o botão seja o inserir por exemplo, ele chama a classe InseriBanco, passa a conexão e os dados, ae ela insere no banco de dados…

Até ai deu certo, mas o que eu quero eh que o usuário possa ver a tabela preenchida
Como faço isso?

Ps: A tabela do MySQL chama cliente, e seus campos são: id, Nome, Endereço (com ç mesmo), Telefone, Celular, Email

"

Se vc estiver usando DefaultTableModel existem um método chamado addRow(object[])

basta capturar tudo que for digitado nos JTextFields com getText() e ir colocando em um array de objetos, depois e só usar o metodo addRow e passar esse array como parametro. Prontinho os dados são inseridos na JTable assim que a tala de cadastro for fechada.

te+

  1. Crie uma classe chamada “Cliente”, para receber os dados de cliente do seu banco.
  2. Faça o método “LerClientes” para criar um List<Cliente> com os clientes que você quer.
  3. Crie um TableModel para a sua tabela, que diz ao java o que você quer desenhar. Se você não sabe fazer isso, veja esse link:
    http://www.guj.com.br/posts/list/132698.java#714736
    É importante não utilizar o DefaultTableModel pois, além de difícil, duplica dados e torna o código mais difícil de entender.
  4. Quando o cliente alterar alguma coisa no banco, altere também no model. O model tem um método chamado “fireRowInserted” que permite avisar que a linha da tabela foi inserida.

Por exemplo, esse método poderia ser usado para inserir um cliente no seu model:

public void inserirCliente(Cliente cliente) { clientes.add(cliente); fireTableRowsInserted(clientes.size()-1, clientes.size()-1); }

  1. Outra opção é trabalhar com o model do Mark, que está na minha assinatura.

Man uma coisa nunk coloque nome nas tabelas do banco de dados com acento, ç, tio… sempre no seco…
veja aí essa é um metodo de atualizar de um programinha meu…

[code]
public void upDate(ClienteDTO c) {
String sql = “UPDATE cliente SET nome = '” + c.getNome() + " ’ "
+ “,data_de_nascimento = ’ " + c.getDataDeNascimento() + " '”
+ ", sexo = ’ " + c.getSexo() + " ’ "
+ ", rg = ’ " + c.getRg() + " ’ "
+ ", cpf = ’ " + c.getCpf() + " ’ "
+ ", endereco = ’ " + c.getEndereco() + " ’ "
+ ", complemento = ’ " + c.getComplemento() + " ’ "
+ “, n_da_casa = '” + c.getnDaCasa() + " ’ "
+ ", bairro = ’ " + c.getBairro() + " ’ "
+ ", cep = ’ " + c.getCep() + " ’ "
+ ", cidade = ’ " + c.getCidade() + " ’ "
+ ", estado = ’ " + c.getEstado() + " ’ "
+ ", casa_propria = ’ " + c.getCasaPropria() + " ’ "
+ ", telefone1 = ’ " + c.getTelefone1() + " ’ "
+ ", telefone2 = ’ " + c.getTelefone2() + " ’ "
+ ", fax = ’ " + c.getFax() + " ’ "
+ ", cel1 = ’ " + c.getCel1() + " ’ "
+ ", cel2 = ’ " + c.getCel2() + " ’ "
+ ", email1 = ’ " + c.getEmail1() + " ’ "
+ ", email2 = ’ " + c.getEmail2() + " ’ "
+ ", email3 = ’ " + c.getEmail3() + " ’ "
+ ", firma_ou_razao_social = ’ " + c.getFirmaOuRazaoSocial() + " ’ "
+ ", nome_fantasia = ’ " + c.getNomeFantasia() + " ’ "
+ ", inscricao_estadual = ’ " + c.getInscricaoEstadual() + " ’ "
+ ", telefone_loja = ’ " + c.getTelefoneLoja() + " ’ "
+ ", telefone_loja2 = ’ " + c.getTelefoneLoja2() + " ’ "
+ ", fax_loja = ’ " + c.getFaxLoja() + " ’ "
+ ", email_loja1 = ’ " + c.getEmailLoja1() + " ’ "
+ ", email_loja2 = ’ " + c.getEmailLoja2() + " ’ "
+ ", endereco_loja = ’ " + c.getEnderecoLoja() + " ’ "
+ ", n_da_loja = ’ " + c.getnDaLoja() + " ’ "
+ ", complemento_loja = ’ " + c.getComplementoLoja() + " ’ "
+ ", bairro_loja = ’ " + c.getBairroLoja() + " ’ "
+ ", municipio = ’ " + c.getMunicipio() + " ’ "
+ ", uf = ’ " + c.getuF() + " ’ "
+ ", cep_loja = ’ " + c.getCepLoja()
+ " WHERE cod_cliente = " + c.getCodigo();
Connection con = banco.abrirConexcao();
Statement st = banco.abrirStatement(con);
banco.executarComando(sql, st);
banco.fechar(st, con);

}[/code]

Nunca concatene strings diretamente no SQL. Isso tem os seguintes problemas:

a) Permite o ataque de SQL Injection, que pode simplesmente destruir seu banco de dados.
b) Traz problemas caso o usuário use ’ em um dos campos. Por exemplo, digamos que seu usuário digite como complemento: “Ao lado do Mark’s supermercado”. Sua SQL vai falhar, pois o 's do Marks irá fechar a query, e resultar num SQL inválido.
c) Formatos de entrada de números e datas podem ser específicos de banco de dados. Por exemplo, o MySQL aceita datas no formato yyyy-dd-mm enquanto o SQL server no mm/dd/yyyy.

Use PreparedStatement no lugar do Statement para evitar todos esses problemas.
Fora que deixa o código consideravalmente mais limpo.

Perceba como eu faço no nomes das tabelas do BD. foi assim que meu professor mim ensinou…

Então peça para seu professor ler esse tópico também. Mas quanto a nomenclatura de tabelas, está certo. Não só em tabelas, mas em nomes de variáveis e funções, não é uma boa prática usar caracteres especiais (como acentos).

Rapaz eu pesso ajuda hoje a meu professor ele só responde a 1 ano eu vou passar o link pra ele…

vini

oi vini
esse PreparedStatement eu vou subistituir lá na minha classe que se conecta ao banco né isso?
e refatorar(renomear) onde aparece em meu projeto né?

vlw

oi vini
o q eu preciso fazer pra alterar os Statement do meu projeto

[code]package classeDAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
*

  • @author los’p Sys Milar Flores
    */
    public class ConectionBD {

    private String driver = “com.mysql.jdbc.Driver”; //Classe do driver JDBC
    private String base_dados = “kami”; //Nome do Banco criado
    private String host = “localhost”; //Maquina onde está o banco
    private String str_conn = “jdbc:mysql://” + host + “:3306/” + base_dados; //URL de conexão
    private String usuario = “root”; //Usuário do banco
    private String senha = “123456”; //Senha de conexão
    private Connection conn;
    private Statement stmt;
    private ResultSet rs;

    public Connection abrirConexcao() {
    try {
    try {
    //Carrega o driver
    Class.forName(driver);
    //Obtém a conexão com o banco
    conn = DriverManager.getConnection(str_conn, usuario, senha);
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(ConectionBD.class.getName()).log(Level.SEVERE, null, ex);
    }
    } catch (SQLException ex) {
    aviso(ex);
    }
    return conn;
    }

    public void fecharConexcao(Connection conn) {
    try {
    conn.close();
    } catch (SQLException ex) {
    aviso(ex);
    }
    }

    public Statement abrirStatement(Connection conn_stmt) {
    try {
    //Cria um statement para podermos mandar um SQL para o banco
    stmt = conn_stmt.createStatement();
    } catch (SQLException ex) {
    aviso(ex);
    }
    return stmt;
    }

    public void fecharStatement(Statement stmt) {
    try {
    stmt.close();
    } catch (SQLException ex) {
    aviso(ex);
    }
    }

    public void executarComando(String sql, Statement stmt_consulta) {
    try {
    stmt_consulta.executeUpdate(sql);
    } catch (SQLException ex) {
    aviso(ex);
    }
    }

    public ResultSet executarConsulta(String sql, Statement stmt_consulta) {
    try {
    rs = stmt_consulta.executeQuery(sql);
    } catch (SQLException ex) {
    aviso(ex);
    }
    return rs;
    }

    public void fecharConsulta(ResultSet rs_comando) {
    try {
    rs_comando.close();
    } catch (SQLException ex) {
    aviso(ex);
    }
    }

    public void aviso(SQLException aviso) {
    JOptionPane.showMessageDialog(null, aviso);
    }

    void fechar(Statement stmt, Connection conn) {
    this.fecharStatement(stmt);
    this.fecharConexcao(conn);
    }
    }
    [/code]

Milar o ViniGodoy esta totalmente correto, da forma que fizemos em sala de aula tivemos apenas o propósito de facilitar a compreensão do assunto pela turma. O PreparedStatement (Pesquise sobre isso) é o mais adequado e o que eu usava a anos atrais,na verdade faço uso do hibernate(Pesquise sobre isso) para trabalhar com o banco. A parte referente a banco de dados vista no curso foi extremamente superficial e serviu como base pra quem quiser realmente correr e estudar por fora, não estava nem previsto inicialmente. Tem muita coisa que voce teria que mudar no seu projeto para ele se tornar comercial, Ex: remover a coluna endereço da sua tabela cliente e criar um tabela endereço no banco de dados e referenciar-la através de uma chave estrangeira para evitar Campos Multi-valorados (Pesquise sobre isso), assim como seria bom tornar sua classe de conexão ao banco um Singleton (Pesquise sobre isso). Lembra o quanto eu falava em sala que não daria as respostas e sim mostraria a vocês onde encontra-las, pois te falo novamente o google tem que virar o seu melhor amigo rsrsrs. A respeito do “demora um ano para responder” foram 1200 alunos no projeto e eu ainda tenho que tratar da minha vida pessoal. rsrsrsrs
Abração.

vlw já comecei a pesquisar… mais primeiro antes de estdar tenho qye dormir um pouco tem alguns dias que num durmo bem …

Bons estudos e bom sono rsrsrsrs… 8)

Nossaa…
reviveram um tópico moh antigo meu…
Hoje essa dúvida que eu tive parece incrivelmente boba…
Eh… Vivendo e aprendendo, errando e se fudendo !

xD