Classe DAO

Sou iniciante e gostaria de saber se estou no caminho certo em relação a classe DAO

Postei como eu tinha feito minha classe:

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

Usuario falou que estava certo mas me deu umas dicas:

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

minha duvida e saber se a dica que ele deu e a mesma que fiz na classe abaixo, ou seja mudei a de cima para a de baixo e se tem algum erro?

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,produto,estoque,custo,venda,datacompra,validade) VALUES (?,?,?,?,?,?,?,?)");     
            stm.setColumns(1, p.getCodigo());     
            stm.setStringl(2, p.getGrupo());     
            stm.setString(3, p.getProduto());
            stm.setColumns(4, p.getEstoque());  // setColumns é o certo para usar com numeros inteiros.
            stm.setColumns(5, p.getCusto()); // qual o melhor tipo de variavel para preço, se é float ou 
            stm.setColumns(6, p.getVenda());
            stm.setString(7, p.getDataCompra());   
            stm.setString(8, p.getValidade());   // setString e o melhor para DATAS.
            stm.executeUpdate();     
            stm.close();     
      }     
} 

tenho mais uma duvida:

setColumns e o certo para numeros inteiros?
setString é o certo para manipular DATA?

qual o melhor tipo para variavel do tipo preço, se é float ou BigDecimal, e qual o metodo SET para inserir um valor BigDecimall?

Existe o setInt para inteiros e o setDate para datas.

Com alguns detalhes:
setDate recebe como argumento um java.sql.Date.
Este pode ser construído, recebendo como argumento o retorno do método getTime de um java.util.Date

//suponha q dataCompra seja do tipo java.util.Date
stm.setDate(7, new java.sql.Date(p.getDataCompra().getTime()));

[quote=alucardmaas]Sou iniciante e gostaria de saber se estou no caminho certo em relação a classe DAO

Postei como eu tinha feito minha classe:

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

Usuario falou que estava certo mas me deu umas dicas:

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

minha duvida e saber se a dica que ele deu e a mesma que fiz na classe abaixo, ou seja mudei a de cima para a de baixo e se tem algum erro?

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,produto,estoque,custo,venda,datacompra,validade) VALUES (?,?,?,?,?,?,?,?)");     
            stm.setColumns(1, p.getCodigo());     
            stm.setStringl(2, p.getGrupo());     
            stm.setString(3, p.getProduto());
            stm.setColumns(4, p.getEstoque());  // setColumns é o certo para usar com numeros inteiros.
            stm.setColumns(5, p.getCusto()); // qual o melhor tipo de variavel para preço, se é float ou 
            stm.setColumns(6, p.getVenda());
            stm.setString(7, p.getDataCompra());   
            stm.setString(8, p.getValidade());   // setString e o melhor para DATAS.
            stm.executeUpdate();     
            stm.close();     
      }     
} 

tenho mais uma duvida:

setColumns e o certo para numeros inteiros?
setString é o certo para manipular DATA?

qual o melhor tipo para variavel do tipo preço, se é float ou BigDecimal, e qual o metodo SET para inserir um valor BigDecimall?
[/quote]

A primeira vista esta correto…para manipular Datas vc pode usar setDate(), horas use setTime(), inteiros use setInt, long use setLong, double use setDouble, bigdecimal use setBigDecimal()

t+ e boa sorte.

Entao a parte de inserir dados está conforme você me falou:

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

tenho mais uma duvida:

sobre esta outra dica que você me deu:

Faltou o equals/hashcode da classe produto

???