Classe DAO

3 respostas
A

Boa noite gostaria de saber se a minha classe DAO esta bem feita:

package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

import model.Produto;
import dao.banco.ConFactory;

public class DaoProduto {
   // Configura essas variáveis de acordo com o seu banco
   private final String URL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:/meubd/banco.mdb",
         NOME = "", SENHA = "";

   private Connection con;
   private Statement comando;

   public void apagar(String codigo) {
      conectar();
      try {
         comando.executeUpdate("DELETE FROM produto WHERE codigo = '" + codigo + "';");
               JOptionPane.showMessageDialog(null,"Exclusão realizada com sucesso");
      } catch (SQLException e) {
         imprimeErro("Erro ao apagar Produto", e.getMessage());
      } finally {
         fechar();
      }
   }

   public Vector<Produto> buscarTodos() {
      conectar();
      Vector<Produto> resultados = new Vector<Produto>();
      ResultSet rs;
      try {
         rs = comando.executeQuery("SELECT * FROM produto");
         while (rs.next()) {
            Produto temp = new Produto();
            // pega todos os atributos da pessoa
            temp.setCodigo(rs.getInt("codigo"));
            temp.setGrupo(rs.getString("grupo"));
            temp.setProduto(rs.getString("produto"));
            temp.setEstoque(rs.getInt("estoque"));
            temp.setCusto(rs.getFloat("custo"));
            temp.setVenda(rs.getFloat("venda"));
            temp.setDataCompra(rs.getString("datacompra"));
            temp.setValidade(rs.getString("validade"));
            resultados.add(temp);
         }
         return resultados;
      } catch (SQLException e) {
         imprimeErro("Erro ao buscar Produto", e.getMessage());
         return null;
      }
   }

   public void atualizar(Produto produto) {
      conectar();
      String com = "UPDATE Produto SET " +
                   "codigo= '" + produto.getCodigo() + "'," +
                   "grupo= '" + produto.getGrupo() + "'," +
   	   "produto='" + produto.getProduto() + "'," +
   	   "estoque='" + produto.getEstoque() + "'," +
   	   "custo='" + produto.getCusto() + "'," +
                   "venda='" + produto.getVenda() + "'," +
                   "datacompra='" + produto.getDataCompra() + "'," +
                   "validade='" + produto.getValidade() + "' " +
   	  " WHERE codigo = '" + produto.getCodigo() + "'";
      try {
         comando.executeUpdate(com); 
         JOptionPane.showMessageDialog(null,"Operação realizada com sucesso!");
      } catch (SQLException e){
         e.printStackTrace();
      } finally {
         fechar();
      }
   }

   public Vector<Produto> buscar(String codigo) {
      conectar();
      Vector<Produto> resultados = new Vector<Produto>();
      ResultSet rs;
      try {
         rs = comando.executeQuery("SELECT * FROM produto WHERE codigo LIKE '"
               + codigo + "%';");
         while (rs.next()) {
            Produto temp = new Produto();
            // pega todos os atributos da pessoa
            temp.setCodigo(rs.getInt("codigo"));
            temp.setGrupo(rs.getString("grupo"));
            temp.setProduto(rs.getString("produto"));
            temp.setEstoque(rs.getInt("estoque"));
            temp.setCusto(rs.getFloat("custo"));
            temp.setVenda(rs.getFloat("venda"));
            temp.setDataCompra(rs.getString("datacompra"));
            temp.setValidade(rs.getString("validade"));
            resultados.add(temp);
         }
         return resultados;
      } catch (SQLException e) {
         imprimeErro("Erro ao buscar Produto", e.getMessage());
         return null;
      }

   }

   public void insere(Produto produto){
      conectar();
      try {
         comando.executeUpdate("INSERT INTO Produto VALUES('"
               + produto.getCodigo() + "','"
               + produto.getGrupo() + "','"
               + produto.getProduto() + "','"
               + produto.getEstoque() + "','"
               + produto.getCusto() + "','"
               + produto.getVenda() + "','"
               + produto.getDataCompra() + "','"
               + produto.getValidade() + "')");
        JOptionPane.showMessageDialog(null,"Operação realizada com sucesso!");
      } catch (SQLException e) {
         imprimeErro("Problemas na operação, verifique se você digitou os campos corretamente!", e.getMessage());
      } finally {
         fechar();
    }
 }

   private void conectar() {
      try {
         con = ConFactory.conexao(URL, NOME, SENHA, ConFactory.MYSQL);
         comando = con.createStatement();
         System.out.println("Conectado!");
      } catch (ClassNotFoundException e) {
         imprimeErro("Erro ao carregar o driver", e.getMessage());
      } catch (SQLException e) {
         imprimeErro("Erro ao conectar", e.getMessage());
      }
   }

   private void fechar() {
      try {
         comando.close();
         con.close();
         System.out.println("Conexão Fechada");
      } catch (SQLException e) {
         imprimeErro("Erro ao fechar conexão", e.getMessage());
      }
   }

   private void imprimeErro(String msg, String msgErro) {
      JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);
      System.err.println(msg);
      System.out.println(msgErro);
      
   }
}

Classe conexão:

package dao.banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConFactory {

   public static final int MYSQL = 0;
   private static final String MySQLDriver = "sun.jdbc.odbc.JdbcOdbcDriver";

   public static Connection conexao(String url, String nome, String senha,
         int banco) throws ClassNotFoundException, SQLException {
      switch (banco) {
      case MYSQL:
         Class.forName(MySQLDriver);
         break;
      }
      return DriverManager.getConnection(url, nome, senha);
   }
}

Classe Produto:

package model;

public class Produto {
   private int codigo;
   private String grupo;
   private String produto;
   private String datacompra;
   private int estoque;
   private float custo;
   private float venda;
   private String validade;
   public void setCodigo(int codigo) {
      this.codigo = codigo;
   }
   public void setGrupo(String grupo) {
      this.grupo = grupo;
   }
   public void setProduto(String produto) {
      this.produto = produto;
   }
   public void setDataCompra(String datacompra) {
      this.datacompra = datacompra;
   }
   public void setEstoque(int estoque) {
      this.estoque = estoque;
   }
   public void setCusto(float custo) {
      this.custo = custo;
   }
   public void setVenda(float venda) {
      this.venda = venda;
   }
   public void setValidade(String validade) {
      this.validade = validade;
   }

   public int getCodigo() {
      return this.codigo;
   }
   public String getGrupo() {
      return this.grupo;
   }
   public String getProduto() {
      return this.produto;
   }
   public int getEstoque() {
      return this.estoque;
   }
   public double getCusto() {
      return this.custo;
   }
   public double getVenda() {
      return this.venda;
   }
   public String getDataCompra() {
      return this.datacompra;
   }
   public String getValidade() {
      return this.validade;
   }
}

3 Respostas

Hebert_Coelho

Opa, blz?

Seu código está bem formatado e fácil de ler.

Que bom que você quer melhorar mano, então eu tenho algumas dicas para você:

[list]buscarTodos() e buscar() -> Nao fechou conexão[/list][list]Nao está utilizando query com ? ou :Id (passando parâmetros), com isso possibilita SQL Injection para web, para Desktop dificulta a leitra e é uma má prática[/list][list]Ao chamar comando.close(); é uma boa você utilizar um try/catch pois esse método pode jogar uma exception (SQLException) e você não iria finalizar a coneção (li essa num livro! ^o^). http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html#close()[/list][list]Faltou o equals/hashcode da classe produto.[/list]

A

Sou Iniciante,

se tiver como me ajudar agradeço, tenho algumes duvidas

Nao está utilizando query com ? ou :Id (passando parâmetros), com isso possibilita SQL Injection para web, para Desktop dificulta a leitra e é uma má prática - Não entendi este query com? e :id se tiver um exemplo ja coloco no meu codigo

Faltou o equals/hashcode da classe produto. : Tambem não entendi este se me mostrar aonde coloco já fico sabendo por que irei colocar mais tela no meu sistema podendo adaptar tudo que aprendo com voceis

Quero sempre melhorar para poder programar com boa pratica

obrigado!!!

A

Ficaria Assim:

public class ProdutosDAO{   
        private Connection con;   
  
        public DAOProduto(){   
               this.con = ConexaoMySQL.getConnection(); //aqui pego a conexao da factory, veja q nao preciso conectar e desconectar   
        }   
  
      public void insere(Produto p){   
            PreparedStatement stm = this.con.prepareStatement("INSERT INTO produtos (codigo,grupo) VALUES (?,?)");   
            stm.setColumns(1, p.getCodigo());   
            stm.setStringl(2, p.getGrupo());   
            stm.executeUpdate();   
            stm.close();   
      }   
}

???

Criado 24 de janeiro de 2012
Ultima resposta 24 de jan. de 2012
Respostas 3
Participantes 2