Duvida 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?

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 divida:

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 BigDecima, e qual o metodo SET para inserir um valor?

Você poderia gerar os ids automaticamente de acordo com o banco de dados utilizado, auto_increment no MySQL, identity no SQL Server, etc…

Utilize setInt para inteiro e setTimestamp para datas.

BigDecimal é bom, mas como você esta começando utilize double, utilizando setDouble.

Abraço