1
resposta

Não é possível fazer referência estática ao método não estático listar()

Estou com um problema de referência e nãoestou conseguindo resolver. Como posso resolver ou pesquisar sobre esse tipo de erro?

Segue o código:

package loja_virtual_repository.modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import com.mysql.cj.exceptions.ConnectionIsClosedException;
import loja_virtual_repository.FabricaDeConexao;
import loja_virtual_repository.dao.ProdutoDAO;

public class TestaInsercaoEListagemComProduto {

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

        Produto comoda = new Produto("Cômoda", "Cômoda madeira");

        try (Connection connection = new FabricaDeConexao().recuperarConexao()) {
            PersistenciaProduto persistenciaProduto = new PersistenciaProduto(connection);
            persistenciaProduto.salvarProduto(comoda);

            List<Produto> listaDeProdutos = ProdutoDAO.listar();
            listaDeProdutos.stream().forEach(lp -> System.out.println(lp));

        }
    }
}

Classe ProdutoDAO

package loja_virtual_repository.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import loja_virtual_repository.modelo.Produto;

public class ProdutoDAO {

    private Connection connection;

    public ProdutoDAO(Connection connection) {
        this.connection = connection;
    }

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

    public List<Produto> listar() throws SQLException {
        List<Produto> produtos = new ArrayList<>();
        String sql = "SELECT ID, NOME, DESCRICAO FROM PRODUTO ";

        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;
    }
}
1 resposta

Olá, tudo bem?

Esse erro acontece porque dentro do método main você está chamando o método listar() a partir de uma referência à classe ProdutoDAO. Nós só podemos chamar um método a partir de uma referência à classe quando este método é static, do contrário precisamos criar uma instância da classe e chamar o método a partir do objeto. Nesse caso, como o ProdutoDao precisa da conexão, é interessante fazermos a instanciação da classe. No seu método main, criar a linha:

ProdutoDao dao = new ProdutoDao(connection);

devido ao construtor da classe, que recebe uma Connection. Após isso, basta alterar a referência no método listar para:

List<Produto> listaDeProdutos = dao.listar();

E assim o código deve rodar!

Fico à disposição.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software