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).
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);
}
}
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);
}
}
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.
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());