Java 6 - Não consigo imprimir dados do Banco usando Datatable/ListDataModel

Boa tarde, eu estou começando a estudar Java. Estou seguindo um curso online, mas estou com um erro e não consigo prosseguir. Gostaria de compartilhar minha dificuldade com vcs para ver se alguém pode me ajudar.
Meu projeto até então, tem duas tabelas, mas a tabela que estou mexendo atualmente e tentando listar os dados dela na tela, é fornecedores. Não dá nenhum erro. O código exibe a msg de que não foram encontrados nenhum registro. Meu código está igual ao do professor, mas como o curso foi barato e on line, o professor não está com boa vontade para me ajudar.

Se alguem puder me ajudar, seguem abaixo meus arquivos:


fornecedores.xhtml

<ui:composition xmlns="link"
xmlns:h="link"
xmlns:f="link"
xmlns:p="link"
xmlns:ui="link"
template=“link”>

<ui:define name="menu">
	<ui:include src="/includes/menu.xhtml" />
	<!-- Puxando o menu p/ a página principal -->
</ui:define>

<ui:define name="fornecedores">
	<h:form>
	<p:dataTable emptyMessage="Nenhum registro encontrado." value="#{mbfornecedores.itens}" var="item">

		<p:column headerText="Código do Fornecedor">
			<h:outputText value="#{item.codfornecedor}" />
		</p:column>

		<p:column headerText="Nome do Fornecedor">
			<h:outputText value="#{item.descricao}" />
		</p:column>

	</p:dataTable>
	</h:form>
</ui:define>

</ui:composition>


Classe FornecedoresBean

package br.com.farmacia.bean;

import java.sql.SQLException;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.ListDataModel;
import br.com.farmacia.DAO.FornecedoresDAO;
import br.com.farmacia.domain.Fornecedores;

@ManagedBean(name=“mbfornecedores”)
@ViewScoped
public class FornecedoresBean {
private ListDataModel itens;

//get e set
public ListDataModel<Fornecedores> getItens() {
	return itens;
}

public void setItens(ListDataModel<Fornecedores> itens) {
	this.itens = itens;
}
	
	//o comando @PostConstruct serve para informar ao sistema, que assim que eu entrar na pagina (a pagina for iniciada, o evento 	 
	//seja executado, sem q haja a necessidade de um clique
	@PostConstruct
	public void prepararPesquisa() {
		
		try {
			FornecedoresDAO fdao = new FornecedoresDAO();
			ArrayList<Fornecedores>lista = fdao.listar();
			itens = new ListDataModel<Fornecedores>(lista);				
			//estou convertendo minha variavel LISTA em DATAMODEL, pois meu array 
			//pois meu array principal estah assim. (estou instanciando minha variavel e dizendo q ela eh do tipo ListDataModel
			//coloco lista entre parenteses pq estou colocando itens dentro dela
							
		} catch (SQLException  ex) {
			ex.printStackTrace();
		} 
	}	

}


FornecedoresDao

package br.com.farmacia.DAO;

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

import br.com.farmacia.domain.Fornecedores;
import br.com.farmacia.factory.ConexaoFactory;

public class FornecedoresDAO {

public void salvar(Fornecedores f) throws SQLException{
	StringBuilder sql = new StringBuilder();
	sql.append("INSERT INTO fornecedores ");
	sql.append("(descricao) ");
	sql.append("VALUES (?)");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setString(1, f.getDescricao());
	comando.executeUpdate();
}

public void excluir (Fornecedores f) throws SQLException{
	StringBuilder sql = new StringBuilder();
	sql.append("DELETE FROM fornecedores ");
	sql.append("WHERE codfornecedor = ? ");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setInt(1, f.getCodFornecedor());
	comando.executeUpdate();		
}

public void editar(Fornecedores f) throws SQLException{
	StringBuilder sql = new StringBuilder();
	sql.append("UPDATE fornecedores ");
	sql.append("SET descricao = ? ");
	sql.append("WHERE codfornecedor = ? ");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setString(1, f.getDescricao());
	comando.setInt(2, f.getCodFornecedor());
	comando.executeUpdate();				
	
}	

public Fornecedores buscaPorCodigo(Fornecedores f) throws SQLException{
	
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT codfornecedor, descricao ");
	sql.append("FROM fornecedores ");
	sql.append("WHERE codfornecedor = ? ");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	
	comando.setInt(1, f.getCodFornecedor());
	
	ResultSet resultado = comando.executeQuery();
	Fornecedores retorno = null;
	
	if (resultado.next()) {
		retorno = new Fornecedores();
		retorno.setCodFornecedor(resultado.getInt("codfornecedor"));
		retorno.setDescricao(resultado.getString("descricao"));
	}
	
	return retorno;		
	
}	

public ArrayList<Fornecedores>listar() throws SQLException{
	
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT codfornecedor, descricao ");
	sql.append("FROM fornecedores ");
	sql.append("ORDER BY descricao ASC ");
	
	Connection conn = ConexaoFactory.conectar();
	
	PreparedStatement comando = conn.prepareStatement(sql.toString());		
			
	ResultSet resultado = comando.executeQuery();
	
	ArrayList<Fornecedores>lista = new ArrayList<Fornecedores>();
	
	while(resultado.next()) {
		Fornecedores f = new Fornecedores();
		f.setCodFornecedor(resultado.getInt("codfornecedor"));
		f.setDescricao(resultado.getString("descricao"));
		
		lista.add(f);
	}
	
	return lista;
	
}	

public ArrayList <Fornecedores> buscarPorDescricao(Fornecedores f) throws SQLException{
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT codfornecedor, descricao ");
	sql.append("FROM fornecedores ");
	sql.append("WHERE descricao LIKE ? "); //toda vez que eu utilizar o like, la na exibicao devo colocar "%"
	sql.append("ORDER BY descricao ASC ");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());	
	
	comando.setString(1, "%" + f.getDescricao() + "%");
	
	ResultSet resultado = comando.executeQuery();
	
	ArrayList <Fornecedores> lista = new ArrayList <Fornecedores>();
	
	while(resultado.next()) {
		Fornecedores item = new Fornecedores();
		item.setCodFornecedor(resultado.getInt("codfornecedor"));
		item.setDescricao(resultado.getString("descricao"));
		
		lista.add(item);
	}
	
	return lista;
}	

public static void main(String[] args) {/*
	 Fornecedores f1 = new Fornecedores();
	f1.setDescricao("Fornecedor Paulista");
	Fornecedores f2 = new Fornecedores();
	f2.setDescricao("Fornecedor Portugues");
	
	FornecedoresDAO fdao = new FornecedoresDAO();
	
	try {
		fdao.salvar(f1);
		fdao.salvar(f2);
		System.out.println("Dados salvos com sucesso!!!");
	} catch (SQLException ex) {			
		ex.printStackTrace();
		System.out.println("Dados não foram salvos. Verifique o ocorrido.");
	}
	
	
	Fornecedores f1 = new Fornecedores();
	f1.setCodFornecedor(2);
	
	FornecedoresDAO fdao = new FornecedoresDAO();
	
	try {
		fdao.excluir(f1);
		
		System.out.println("Dados deletados com sucesso!!!");
	} catch (SQLException ex) {			
		ex.printStackTrace();
		System.out.println("Dados não foram deletados. Verifique o ocorrido.");
	}
	
	
	Fornecedores f1 = new Fornecedores();
	f1.setCodFornecedor(1);
	f1.setDescricao("Rodrigues");
	
	FornecedoresDAO fdao = new FornecedoresDAO();
	
	try {
		fdao.editar(f1);
		
		System.out.println("Dados editados com sucesso!!!");
	} catch (SQLException ex) {			
		ex.printStackTrace();
		System.out.println("Dados não foram editados. Verifique o ocorrido.");
	}
	
	
	
	
	 Fornecedores f1 = new Fornecedores();
		f1.setCodFornecedor(3);
		Fornecedores f2 = new Fornecedores();
		f2.setCodFornecedor(10);
		
		FornecedoresDAO fdao = new FornecedoresDAO();
		
		try {
			Fornecedores f3 = fdao.buscaPorCodigo(f1);
			Fornecedores f4 = fdao.buscaPorCodigo(f2);
			System.out.println("Resultado 1: " + f3);
			System.out.println("Resultado 2: " + f4);
		} catch (SQLException ex) {			
			ex.printStackTrace();
			System.out.println("Erro ao buscar. Verifique o ocorrido.");
		}
	
		
		
		FornecedoresDAO fdao = new FornecedoresDAO();
		
		try {
		
			ArrayList<Fornecedores> lista = fdao.listar();
			for(Fornecedores f: lista) {
				System.out.println("Resultado:" + f);
			}
		} catch (SQLException ex) {			
			ex.printStackTrace();
			System.out.println("Erro ao buscar. Verifique o ocorrido.");
		}
	
	
	Fornecedores f1 = new Fornecedores();
	f1.setDescricao("Tes");
	FornecedoresDAO fdao = new FornecedoresDAO();
	
	try {
		
		ArrayList<Fornecedores> lista = fdao.buscarPorDescricao(f1);
		for(Fornecedores f: lista) {
			System.out.println("Resultado:" + f);
		}
	} catch (SQLException ex) {			
		ex.printStackTrace();
		System.out.println("Erro ao buscar. Verifique o ocorrido.");
	}
}

*/

FornecedoresDAO fdao = new FornecedoresDAO();

try {

	ArrayList<Fornecedores> lista = fdao.listar();
	for(Fornecedores f: lista) {
		System.out.println("Resultado:" + f);
	}
} catch (SQLException ex) {			
	ex.printStackTrace();
	System.out.println("Erro ao buscar. Verifique o ocorrido.");
}
}

}


Como sou nova aqui, se eu postei errado, me perdoem.

Espero que alguém possa me ajudar e desde já sou grata.

Muito obrigada.

Antes de mais nada, uma dúvida: Por que está usando Java 6?

Eu não sabia que o curso era Java 6. Só depois que paguei. Quero aprender Java, depois que eu aprender, que seja o J6, posso migrar para o Java 7 ou 8. Mas aprendendo através de projeto, acho que fica menos dificil de aprender.

Obrigada

Bom dia @FabiRJ
Voce disse que seu código esta igual ao do professor, Entao estou considerando que não a erro. Repare que nesta linha aqui
<p:dataTable emptyMessage="Nenhum registro encontrado." value="#{mbfornecedores.itens}" var="item">
da tua pagina fornecedores.xhtml tem essa validação. de nenhum registro encontrado. então se no bean mbfornecedores.itens não estiver retornando valores corretamente. vai aparecer a mensagem. e se estiver tudo certo, mas não tiver nenhum registro inserido na tabela fornecedores vai aparecer essa mensagem também. abre o banco de dados e da um select * from fornecedores para ver se tem algum registro inserido na tabela fornecedores. e se puder posta um print da mensagem que você disse que aparece para você. fica mais fácil para eu ou outra pessoa que souber. entender seu problema e te ajudar.

Repare também que na sua classe FornecedoresDAO tem o comando de inserir registros na tabela
tabela fornecedores. então primeiro vc tem que fazer a tela do teu projeto que insere registros funcionar, para só depois listar a tabela fornecedores. ou inserir os registros manualmente na tabela fornecedores via banco de dados só para teste

public class FornecedoresDAO {
public void salvar(Fornecedores f) throws SQLException{
	StringBuilder sql = new StringBuilder();
	sql.append("INSERT INTO fornecedores ");
	sql.append("(descricao) ");
	sql.append("VALUES (?)");
	
	Connection conexao = ConexaoFactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setString(1, f.getDescricao());
	comando.executeUpdate();
}

Boa tarde Elanod, muito obrigada pela disponibilidade em querer me ajudar.

Então, eu criei um método void main dentro da classe FornecedoresDao para inserir alguns fornecedores e testar se realmente a conexão funciona. Dessa forma que inseri alguns dados. Na tabela existem registros com fornecedores. Segue a imagem.
bd-tbfornecedor

No console está aparecendo um erro que não sei o que pode ser:

O jar do mysql está na pasta lib e funciona, pois consegui inserir dados pela classe. Tenho outros projetos no eclipse que tbm funcionam com este jar.

Quem puder me ajudar, ficarei muito agradecida.

Boa tarde

Boa tarde. vc disse que consegui testar a classe FornecedoresDAO. testa somente a classe de conexão via java, e ve no console se o erro esta aparecendo. e se não tiver erro na conexão via java, teste por um método void main, ou teste de alguma forma a classe onde acha que esta dando o erro. pode ser erro de sql também. porque esta parecendo que teu erro é na conexão, ou ema algum sql que esta sendo informado com erro. se puder, faz assim por exemplo. testa via java a conexão e testa via java também a listagem que é onde “você disse que acontece o erro” e e vai colocando System.out.println onde vc tem certeza que passou sem erro. e quando executar, acompanha visualmente pelo console essas mensagens que vc inseriu. com objetivo de saber apartir de qual linha do código é que é gerado o erro java.sql.SQLException.
. por exemplo assim

public ArrayList<Fornecedores>listar() throws SQLException{
	System.out.println("passou sem erro aqui1");
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT codfornecedor, descricao ");
	sql.append("FROM fornecedores ");
	sql.append("ORDER BY descricao ASC ");
	
	Connection conn = ConexaoFactory.conectar();
	System.out.println("passou sem erro aqui2");
	PreparedStatement comando = conn.prepareStatement(sql.toString());		
			
	ResultSet resultado = comando.executeQuery();
	System.out.println("passou sem erro aqui3");
	ArrayList<Fornecedores>lista = new ArrayList<Fornecedores>();
	
	while(resultado.next()) {
		Fornecedores f = new Fornecedores();
		f.setCodFornecedor(resultado.getInt("codfornecedor"));
		f.setDescricao(resultado.getString("descricao"));
		
		lista.add(f);
	}
	System.out.println("passou sem erro aqui4");
	return lista;
	System.out.println("passou sem erro aqui5");
}

se puder. De uma lida neste link aqui também para ver se teu erro não é o mesmo

Boa tarde Elanod,

mais uma vez muito obrigada em tentar me ajudar :wink:. Passei ontem a tarde lendo o link que vc enviou e tentei fazer o que a galera fez, mas não funcionou. Fiz o teste que vc pediu para fazer na classe FornecedoresDao, mas não emitiu nenhuma mensagem, continuou com o mesmo erro que postei anteriormente.
Não sei mais o que fazer. Pois já pesquisei diversos dias na internet e está dificil de conseguir uma solução. :cry:

Se você souber mais alguma coisa que eu possa fazer ou qualquer outra pessoa que puder dar uma luz, ficarei muito agradecida.

Elanod, muito obrigada por estar me ajudando!

Verificara a sua classe Conexao que é parecida com essa minha classe abaixo. e ve se não tem nenhum erro, ou se falta algum código nesta sua classe. Faz um teste via console do java só dessa sua conexão. Esse teste é para vc diminuir o problema, porque pelo q vi. já se sabe que o erro não é na pagina .xhtml.
Entao testa só a sua conexão via console do java. se aparecer o erro nela, vc não precisara procurar em outros lugares. e se o erro não estiver na conexao vc procurar o erro usando o system
System.out.println . tenta entender como se descobre erro em uma linha usando System.out.println. conforme expliquei no post anterior. eu alterei até um exemplo do teu código no post anterior para vc entender melhor. E se certifica de que vc colou o arquivo .jar correto e compativel com mysql instalado na tua macna. dentro da pasta WEB-INF/lib exemplo eu uso um mysql-connector-java-5.0.4-bin.jar mas o seu não precisar ser igual ao meu mais um correspondente com o da instalação do mysql da sua macna. teu erro pode não ser esse, mas achei melhor comentar também.

public class Connection {

	private String url = "jdbc:mysql://ws147:3306/clinica";
	private String usuario = "root";
	private String senha = "root";
	private String Driver = "com.mysql.jdbc.Driver";

	public String getDriver() {
		return Driver;
	}

	public void setDriver(String driver) {
		Driver = driver;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

}

O erro “No suitable driver found” quer dizer que o driver jdbc não foi encontrado

Baixa ele e coloca na pasta lib do servidor

https://www.mysql.com/products/connector/

Olá Mike, boa tarde. Muito obrigada por tentar me ajudar. O drive do MySQL está na pasta LIB. É o mesmo drive que utilizo em outros projetos de estudo. Mas são tudo Java7. O único que é Java6 é este. Mas no teste de conexão, a classe conecta. Veja o print:


Na classe FornecedoresDao, eu criei um método para inserir fornecedores e inseriu normalmente. Se tivesse com problema no Drive do MySQL, acredito que não faria a inserção.

Será que por ser Java6, alguma coisa no código, na conexão que está com problema? Como eu estou iniciando, não sei o que pode ser…

Muito obrigada por tentar me ajudar…

Olá Elanod, boa tarde.

Eu não havia tirado aquele código que vc pediu para por, na classe FornecedoresDao, não havia tirado. Aí acrescentei esta linha dentro do Método conectar, da Classe ConexaoFactory:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

Quando eu restartei o projeto, aconteceu novo erro e passou pelas paradas que coloquei no método:
System.out.println(“passou sem erro aqui4”);

Veja a imagem abaixo:

Mas continuo sem saber o que pode ser…

Muito obrigada pela ajuda

Verificou a compatibilidade do Driver de conexão com o Java 6?

Olá Jonathan_Medeiros, boa tarde.

Eu já fiz inserção de dados nesse projeto, na tabela Fornecedores e no teste de conexão, a Classe deu OK.

Obrigada por tentar me ajudar.

Boa tarde @FabiRJ . esse código

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); que vc inseriu provavelmente era oque estava faltando. se vc copiou do seu curso essa Classe ConexaoFactory. da uma olha nessa classe se não faltou vc copiar justamente um código que tinha essa mesma finalidade.

*esses códigos System.out.println. que vc inseriu bem em ArrayListlista() throws …
como vc já se deu conta são só para teste. e no seu caso como imprimi todas os comentarios. significa que nesse local onde vc, inseriu eles não, tem nenhum erro parando o programa.
ai o erro parando o programa e em outro lugar.

*sobre esse novo erro que apareceu.
Tudo indica que ele esta na pagina fornecedores.xhtml em value="#{item.cofornecedor}" . A mensagem toda deu a entender
que na classe br.com.farmacia.domain.Fornecedores. não existe a propriedade codfornecedor.
Veja nessa classe se essa propriedade nao esta com um letra maiuscula diferente ou nome diferente.
. No caso vc tem que colocar em fornecedores.xhtml em value="#{item.cofornecedor}" um nome igual ao que esta na Classe
Formecedores ou nessa classe item.cofornecedor. Se não conseguir.Se puder posta um print dessa Classebean item.cofornecedor e da classe br.com.farmacia.domain.Fornecedores
e se eu consegui identificar alguma coisa eu digo

Bom dia Elanod, hoje a tarde eu conseguirei ver. Me desculpe a demora, tive alguns problemas e não consegui dar prosseguimento em nosso raciocínio.

A tarde eu vejo e te respondo aqui. Muito obrigada mais uma vez :relaxed:!

1 curtida

Olá Elanod, boa noite.

Refiz o projeto no trabalho e em casa nesses dias e o mesmo erro continua. E nos dois computadores o erro é igual. Não sei mais o que testar. Mudei até o nome da variável, dos campos na tabela…

Segue abaixo o erro:

Se alguém ainda conseguir me ajudar, ficarei muito agradecida…

O erro diz que não existe a coluna codigof a onde você quer inserir

Posta a query e verifica se esse é o nome da coluna mesmo

1 curtida

Olá Mike.

Verifiquei tudo e o banco eu não tinha alterado os campos, pois nas classes eu alterei. Aí, refiz o banco e testei todos os métodos do FornecedoresDAO. Inserir, Excluir, Listar, Editar, Buscar por Código e Buscar por nome. Todos os métodos funcionaram.

Mas na hora de listar na página xhtml, não lista. E agora, não dá nenhum erro.

Muito obrigada pela ajuda

Posta o código da sua página xhtml, do Bean e do DAO.

Olá Mike, bom dia.

Seguem as imagens. A imagem do DAO, eu só printei a tela do Listar, pois é o método diretamente relacionado ao problema em questão.

fornecedores.xhtml

FornecedoresBean

FornecedoresDAO

Muito obrigada pela ajuda.