Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Desafio Refatoração

Extraí a função criada em aula para um método estático de uma interface, e depois implementei essa interface no modelo produto. A classe de testes ficou assim:

public class TestaInsercaoModelo {

    public static void main(String[] args) throws SQLException {

        Produto produto = new Produto("Cômoda", "Cômoda Vertical");

        DbActions.insertProduto(produto);
    }
}

Gostaria de saber se essa seria realmente uma boa abordagem.

4 respostas

Ítalo, boa tarde. Vc poderia colocar todas as classes para avaliarmos? =)

Claro!

Depois continuando o curso vi que existe a convenção de utilizar a solução DAO, mas a título de curiosidade e estudo, queria saber como essa solução se sairia. Agradeço desde já, João!

Interface DbActions

public interface DbActions {
   static void insertProduto(Connection connection, Produto produto) throws SQLException {

            String sql = "INSERT INTO PRODUTO (nome, descricao) VALUES(? , ?)";

            try(PreparedStatement pstm = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
                pstm.setString(1, produto.getNome());
                pstm.setString(2, produto.getDescricao());
                pstm.execute();

                try(ResultSet rst = pstm.getGeneratedKeys()) {
                    while (rst.next()) {
                        produto.setId(rst.getInt(1));
                    }
            }
        }
        System.out.println(produto);
    }

    static List<Produto> listarProduto(Connection connection) throws SQLException {
        String sql = "SELECT * FROM PRODUTO";
        List<Produto> produtos = new ArrayList<>();

        try(PreparedStatement pstm = connection.prepareStatement(sql)) {
            pstm.execute();

            try(ResultSet rst = pstm.getResultSet()) {
                while (rst.next()) {
                    Produto produto = new Produto(rst.getInt(1), rst.getString(2), rst.getString(3));
                    produtos.add(produto);
                }
            }
        }
        return produtos;
    }
}

Classe Produto

public class Produto implements DbActions {
    private Integer id;
    private String nome;
    private String descricao;

    public Produto(String nome,String descricao) {
        this.nome = nome;
        this.descricao = descricao;
    }

    public Produto(Integer id, String nome, String descricao) {
        this.nome = nome;
        this.descricao = descricao;
        this.id = id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return this.nome;
    }

    public String getDescricao() {
        return this.descricao;
    }

    @Override
    public String toString() {
        return String.format("O produtocriado é: Id = %d, Nome: %s, Descrição: %s",
                this.id, this.nome, this.descricao);
    }

}
solução!

Ítalo, bom dia. Eu particularmente prefiro o padrão DAO, pq dessa forma, vc acaba criando uma interface e a acoplando com outra classe. Talvez se ela fosse uma interface com todos os métodos abstratos e vc a implementasse numa classe DAO, faria mais sentido, pois dessa forma, se vc precisasse trocar a implementação de JDBC para JPA, por exemplo, vc não precisaria mudar a chamada para classe, pois a classe que chama o repositório estaria chamando a interface. Faz sentido?

Sim sim, faz total sentido! O padrão DAO realmente atende a todos os aspectos. Mas gostei da ideia de uma interface abstrata também que se vincula à classe DAO também.

Grato pela análise e pelo feedback, João!