Aprenda Java com Banco de Dados

  • Página Inicial
  • Contato!
  • Tudo sobre Java com Banco de Dados Parte 1!
  • Tudo sobre Java com Banco de Dados Parte 2!
  • Tudo sobre Java com Banco de Dados Parte 3!
  • Tudo sobre Java com Banco de Dados Parte 4!
  • Tudo sobre Java com Banco de Dados Parte 5!
  • Tudo sobre Java com Banco de Dados Parte 6!
  • Tudo sobre Java com Banco de Dados Parte 7!
  • Tudo sobre Java com Banco de Dados Parte 4

    Preenchendo JTable

    Para preencher a JTable, vá em ProdutoDAO e crie um método com esse código:

    
    public List<Produto> read() { // Importe java.util.List
        PreparedStatement stmt = null;
        ResultSet rs = null; // Importe
        String sql = "select * from produto";
    
        List<Produto> produtos = new ArrayList<>();
    
        try {
            stmt = con.prepareStatement(sql);
            rs = stmt.executeQuery();
    
            while(rs.next()) {
                Produto prod = new Produto();
    
                prod.setId(rs.getInt("id"));
                prod.setDescricao(rs.getString("descricao"));
                prod.setQtd(rs.getInt("qtd"));
                prod.setPreco(rs.getDouble("preco"));
                
                produtos.add(prod);
            }
        }
        catch(SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Consultar!\n\n" + ex, "Erro", JOptionPane.ERROR_MESSAGE);
        }
        finally {
            ConnectionFactory.closeConnection(con, stmt, rs);
        }
    
        return produtos;
    }
    
    

    Adicione uma coluna ID na tabela do frame. Não esqueça de alterar também o número das colunas nos eventos de teclas e do clique do mouse.

    No código do frame do Table, crie esse método (coloque abaixo do construtor):

    
    public void lerTable() {
        DefaultTableModel mode = (DefaultTableModel)paneProds.getModel();
    
        ProdutoDAO pdao = new ProdutoDAO();
        
        mode.setNumRows(0); // Isso é pra evitar duplicação nas consultas.
    
        for(Produto p: pdao.read()) {
            mode.addRow(new Object[] {
                p.getId(),
                p.getDescricao(),
                p.getQtd(),
                p.getPreco()
            });
        }
    }
    
    

    E no construtor, coloque a invocação desse método simplesmente com this.lerTable();. A mesma invocação também será colocada no action do botão cadastrar, abaixo do dao.create() (dentro dos if, caso existam, na última linha).

    Atualizando Dados - Update

    Simplesmente copie o método create em ProdutoDAO e faça alterações nele, e mude o nome para update, na mesma classe, dessa forma:

    
    public void update(Produto p) {
        PreparedStatement stmt = null;
        String sql = "update produto set descricao = ?, qtd = ?, preco = ? where id = ?"; // Inserir os dados do MySQL.
    
        try {
            stmt = con.prepareStatement(sql);
            stmt.setString(1, p.getDescricao());
            stmt.setInt(2, p.getQtd());
            stmt.setDouble(3, p.getPreco());
            stmt.setInt(4, p.getId());
    
            stmt.executeUpdate();
    
            JOptionPane.showMessageDialog(null, "Atualizado com Sucesso!", "Informação", JOptionPane.INFORMATION_MESSAGE);
        }
        catch(SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Atualizar!\n\n" + ex, "Erro", JOptionPane.ERROR_MESSAGE);
        }
        finally {
            ConnectionFactory.closeConnection(con, stmt);
        }
    }
    
    

    E no action no botão atualizar do Frame, coloque assim:

    
    private void btnAtActionPerformed(java.awt.event.ActionEvent evt) {                                      
        if(paneProds.getSelectedRow() != -1) {
            if(!txtDesc.getText().trim().equals("") && !txtQtd.getText().trim().equals("") && !txtPrec.getText().trim().equals("")) {
                Produto p = new Produto(); // Importe
                ProdutoDAO dao = new ProdutoDAO(); // Importe
    
                p.setDescricao(txtDesc.getText().trim());
                p.setQtd(Integer.parseInt(txtQtd.getText().trim()));
                p.setPreco(Double.parseDouble(txtPrec.getText().replace(",", ".").trim()));
                p.setId((int)paneProds.getValueAt(paneProds.getSelectedRow(), 0));
    
                dao.update(p);
    
                txtDesc.setText("");
                txtQtd.setText("");
                txtPrec.setText("");
    
                this.lerTable();
            }
            else {
                JOptionPane.showMessageDialog(null, "Preencha todos os Campos!", "Aviso!", JOptionPane.WARNING_MESSAGE);
            }
        }
        else {
            JOptionPane.showMessageDialog(null, "Selecione um Produto para Atualizar!", "Aviso!", JOptionPane.WARNING_MESSAGE);
        }
    }
    
    

    Removendo Dados - Delete

    Da mesma forma, copie em ProdutoDAO o método update e altere para delete dessa forma:

    
    public void delete(Produto p) {
        PreparedStatement stmt = null;
        String sql = "delete from produto where id = ?"; // Inserir os dados do MySQL.
    
        try {
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, p.getId());
    
            stmt.executeUpdate();
    
            JOptionPane.showMessageDialog(null, "Excluído com Sucesso!", "Informação", JOptionPane.INFORMATION_MESSAGE);
        }
        catch(SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Excluir!\n\n" + ex, "Erro", JOptionPane.ERROR_MESSAGE);
        }
        finally {
            ConnectionFactory.closeConnection(con, stmt);
        }
    }
    
    

    E no Frame, no action do botão excluir, altere dessa forma:

    
    private void btnExclActionPerformed(java.awt.event.ActionEvent evt) {                                        
         if(paneProds.getSelectedRow() != -1) {
             Produto p = new Produto(); // Importe
             ProdutoDAO dao = new ProdutoDAO(); // Importe
    
             p.setId((int)paneProds.getValueAt(paneProds.getSelectedRow(), 0));
    
             dao.delete(p);
    
             txtDesc.setText("");
             txtQtd.setText("");
             txtPrec.setText("");
    
             this.lerTable();
         }
         else {
             JOptionPane.showMessageDialog(null, "Selecione um Produto para Excluir!", "Aviso!", JOptionPane.WARNING_MESSAGE);
         }
     }
    
    

    Tela de Login

    Crie um novo JFrame com o nome TelaLogin, e coloque nele um JPanel (painel), de forma que ele cubra um pouco mais da metade do frame. Agora coloque, dentro do painel, um label (escrito Login, clique nele com o botão direito para editar) e um campo de texto pro login (variável txtLogin), e também outro label (escrito senha) e um campo de senha para a senha (variável txtSenha). Coloque também um botão com o texto Entrar (variável btnEntr). Crie um pacote também para imagens.

    No frame, fora do painel, coloque um label para colocar a imagem (clicando com o botão direito em propriedades, em icon e selecionando ela no pacote que ela está), e apague o texto do label.

    PS: Cuidado com a centralização dos componentes, principalmente imagens, para não desalinharem ao maximixar, para isso, deixe as laterais do layout como "redimensionável", clicando com o botão direito.

    No botão, clique em Action e em Action Performed, e coloque esse código, só para testarmos:

    
    private void btnEntrActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if(txtLogin.getText().trim().equals("usuario") && String.valueOf(txtSenha.getPassword()).trim().equals("1234")) {
            JOptionPane.showMessageDialog(null, "Bem-vindo", "Login", JOptionPane.INFORMATION_MESSAGE); // Importe javax.swing.JOptionPane
        }
        else {
            JOptionPane.showMessageDialog(null, "Acesso Negado", "Login", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    

    PS: Veja que tivermos que formar uma criação de String no txtSenha, porque o campo de senha envia um vetor de char, mas o Java precisa trabalhar com string, nesse caso.

    Para verificar o resultado, dê Shift F6.

    Crie uma nova tabela com esse código aqui:

    
    use dbmercadinho;
    
    create table usuario (
        id int not null auto_increment,
        login varchar(30) unique,
        senha varchar(40),
        primary key(id)
    )
    default charset = utf8;
    
    

    Crie no pacote model.bean a classe Usuario, com esse código:

    
    package model.bean;
    
    public class Usuario {
        private int id;
        private String login;
        private String senha;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getLogin() {
            return login;
        }
    
        public void setLogin(String login) {
            this.login = login;
        }
    
        public String getSenha() {
            return senha;
        }
    
        public void setSenha(String senha) {
            this.senha = senha;
        }
    }
    
    

    E no pacote model.dao crie a classe UsuarioDAO com esse código:

    
    package model.dao;
    
    import connection.ConnectionFactory;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.swing.JOptionPane;
    
    public class UsuarioDAO {
        private Connection con = null; // Importar java.sql.Connection
        
        public UsuarioDAO() {
            con = ConnectionFactory.getConnection(); // Importar connection.ConnectionFactory
        }
    
        public boolean checkLogin(String login, String senha) {
            PreparedStatement stmt = null;
            ResultSet rs = null; // Importe
            String sql = "select * from usuario where login = ? and senha = ?";
            
            boolean checkagem = false;
    
            try {
                stmt = con.prepareStatement(sql);
                stmt.setString(1, login);
                stmt.setString(2, senha);
                
                rs = stmt.executeQuery();
    
                if(rs.next()) {
                    checkagem = true;
                }
            }
            catch(SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro ao Autenticar!\n\n" + ex, "Erro", JOptionPane.ERROR_MESSAGE);
            }
    
            return checkagem;
        }
    }
    
    

    Na tela de Login, coloque isso no método de entrada de dados:

    
    UsuarioDAO dao = new UsuarioDAO();
    
    if(dao.checkLogin(txtLogin.getText().trim(), new String(txtSenha.getPassword()).trim())) {
        new ViewJTable().setVisible(true);
        this.dispose();
    }
    else {
        JOptionPane.showMessageDialog(null, "Acesso Negado!", "Acesso Negado!", JOptionPane.ERROR_MESSAGE);
    }
    
    

    PS: Caso necessite criptografar as senhas, podemos criar uma classe com um método estático pra isso:

    
    package hashsdesenha;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class CriptSenha {
        private static byte vetor[] = null;
        private static StringBuilder cript = null;
        private static String hash = "";
        
        public static String encripta(String sen, String tipo) {
            try {
                vetor = MessageDigest.getInstance(tipo).digest(sen.getBytes()); // Importe java.security.MessageDigest;
                cript = new StringBuilder();
                
                for(int i = 0; i < vetor.length; i++) {
                    cript.append(Integer.toHexString((vetor[i] & 0xFF) | 0x100).substring(1, 3));
                }
                
                hash = cript.toString();
                
                return hash;
            } 
            catch(NoSuchAlgorithmException ex) { // Importe java.security.NoSuchAlgorithmException;
                System.err.println("ERRO: " + ex.getMessage());
                
                return null;
            }
        }
    }
    
    

    Essa classe acima pode ser usada em vários projetos do tipo, mas no nosso projeto, basta alterar o stmt.setString() da senha assim:

    
    stmt.setString(2, CriptSenha.encripta(senha, "SHA-1"));
    
    

    Obviamente, no caso acima, o hash deverá estar no banco de dados guardado como SHA-1. Podemos também escolher MD5 e SHA-256 como opções de hash.

    Pesquisa no JTable usando Like

    Crie um campo de texto e um botão no ViewJTable, com os nomes txtPesq e btnPesq, respectivamente.

    Vá em ProdutoDAO e crie esse método:

    
    public List<Produto> read(String desc) { // Importe Java.util.List
        PreparedStatement stmt = null;
        ResultSet rs = null; // Importe
        String sql = "select * from produto where descricao like ?";
    
        List<Produto> produtos = new ArrayList<>();
    
        try {
            stmt = con.prepareStatement(sql);
            stmt.setString(1, '%' + desc + '%');
            rs = stmt.executeQuery();
    
            while(rs.next()) {
                Produto prod = new Produto();
    
                prod.setId(rs.getInt("id"));
                prod.setDescricao(rs.getString("descricao"));
                prod.setQtd(rs.getInt("qtd"));
                prod.setPreco(rs.getDouble("preco"));
    
                produtos.add(prod);
            }
        }
        catch(SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Consultar!\n\n" + ex, "Erro", JOptionPane.ERROR_MESSAGE);
        }
    
        return produtos;
    }
    
    

    PS: Caso use PostgreSQL, use ilike ao invés de like para não diferenciar maiúsculas de minúsculas.

    No ViewTable, crie um método dessa forma:

    
    public void lerPesq(String desc) {
        DefaultTableModel mode = (DefaultTableModel)paneProds.getModel();
    
        ProdutoDAO pdao = new ProdutoDAO();
    
        mode.setNumRows(0);
    
        for(Produto p: pdao.read(desc)) {
            mode.addRow(new Object[] {
                p.getId(),
                p.getDescricao(),
                p.getQtd(),
                p.getPreco()
            });
        }
    }
    
    

    E no action do botão de busca, coloque isso:

    
    this.lerPesq(txtPesq.getText().trim());