Atributo Id de uma classe só aparece como "0"

Pessoal,

Gostaria de saber o motivo pelo qual na minha classe TestaListaDAO cujo código está abaixo :

package br.com.caelum.jdbc.dao;
import java.sql.SQLException;
import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaListaDAO {

	public static void main(String[] args) throws SQLException {
				
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getLista();
		
		for (Contato contato : contatos) {
			
			System.out.println("Id      : " + contato.getId() );
			System.out.println("Nome    : " + contato.getNome());
			System.out.println("Email   : " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco() + "\n");
		
		}
		
	}

}

É sempre exibo “0” para o campo ID do Contato.

Conectando ao banco
Id      : 0
Nome    : Caelum
Email   : contato@caelum.com.br
Endereço: R. Vergueiro 3185 cj57

Id      : 0
Nome    : Luiz Henrique
Email   : luiznenhique@meuprovedor.com.br
Endereço: Av. Das Nações, 342

Id      : 0
Nome    : joão carlos
Email   : jcarlos@minhaempresa.com.br
Endereço: Av. Brasília, 381

Na minha base MySQL os valores gravados na tabela são 4,5 e 6.
Esse campo é um auto-incremento, mas as linhas acima só exibem “0” para todos os objetos.
Por quê isto está acontecendo ? Como resolver este probleminha ?

Agradece,

Max

Coloque o código da classe Contato e ContatoDAO também.

Como o Joao.Gabriel disse, você precisa postar as outras classes, pois essa parte do código que foi postada, pra mim não tem erros.
Talvez o incremento zere cada vem que você chama não sei. Posta ae ^^

Pessoal,

Segue, abaixo, o código-fonte da classe Contato

/**
 * 
 */
package br.com.caelum.jdbc.modelo;
/**
 * @author Max Carvalho
 *
 */
public class Contato {
	
	private Long id;
	private String nome;
	private String endereco;
	private String email;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

}

E logo abaixo, o da classe ContatoDAO

[code]/**
*
*/
package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

/**

  • @author Max Carvalho

*/

public class ContatoDAO {

// a conexão com o banco de dados
private Connection connection;

public ContatoDAO() throws SQLException {
	this.connection = ConnectionFactory.getConnection();
}

public void adiciona(Contato contato) throws SQLException {

	// prepared statement para inserção
	String sql = "insert into contatos (nome,email,endereco) values (?,?,?)";
	PreparedStatement stmt = connection.prepareStatement(sql);
	// seta os valores
	stmt.setString(1,contato.getNome());
	stmt.setString(2,contato.getEmail());
	stmt.setString(3,contato.getEndereco());
	// executa
	stmt.execute();
	stmt.close();
	
}

}
[/code]
Espero que consigam me ajudar.
Agradece,

Max

Faltou tu postares o método getLista do DAO.

Pessoal,

Me desculpem, mas a versão da classe ContatoDAO que tenho no Eclipse aqui no trabalho está desatualizada.
Como eu tenho mexido nela aqui e em casa, terminou acontecendo este lance de falta de um controle melhor de versão.
Até amanhã estarei postando a versão completa.
De qq forma, já agraço-lhes pela enorme atenção.
[]'s
Max

Pessoal,

Conforme solicitado, segue, abaixdo, o código completo da classe ContatoDAO, incluindo o método getLista().

/**
 * classe ContatoDAO
 */
package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.ArrayList;
import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.ConnectionFactory;

/**
 * @author Max Carvalho
 *
 */
public class ContatoDAO {
	
	// conexao com o banco de dados
	private Connection connection;

	public ContatoDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();
	}
	
	public void adiciona(Contato contato) throws SQLException {
		
		// prepared statement para insercao
		String sql = "insert into contatos(nome,email,endereco) values (?,?,?)";
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		// set os valores
		stmt.setString(1, contato.getNome() );
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco() );
		
		//executa
		stmt.execute();
		stmt.close();
		
	}
	
	public List<Contato> getLista() throws SQLException {
		
		PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();
		
		List<Contato> contatos = new ArrayList<Contato>();
		
		while (rs.next()) {
			
			// criando o objeto Contato
			Contato contato = new Contato();
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
		
			// adicionando o objeto à lista
			contatos.add(contato);
			
		}
		
		rs.close();
		stmt.close();
		
		return contatos;
		
	}
	
	public Contato pesquisar(int idContato) throws SQLException {
	
		String sql = "select * from contatos where id = ?";
		
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setInt(1,idContato);
		ResultSet rs = stmt.executeQuery();
		
		// se o contato não existir retorna null
		Contato contato = null;
		
		while (rs.next()) {
			
			// criando o objeto Contato
			contato = new Contato();
			contato.setNome( rs.getString("nome") );
			contato.setEmail( rs.getString("email") );
			contato.setEndereco( rs.getString("endereco") );
			
		}	
		
		rs.close();
		stmt.close();
		
		return contato;
	}
	
}

Agradece,

Max

O atributo ID está sempre zerado porque tu não estás alimentando-o.

Tens de alterar o loop no getLista, ficando mais ou menos assim:

			Contato contato = new Contato();
                        contato.setId(rs.getInt("id")); // <<<<<
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

Yky,

Não pensei que isto foste necessário, porque o campo correspondente na tabela em MySQL é um auto-incremento, daí pensei que o Resulset já pegasse o valor dele automaticamente da forma como está no banco.
Quer dizer que mesmo o campo sendo auto-incremento, eu preciso atualizar o estado do objeto a cada passagem do “cursor” resulset ?
Mesmo assim, muito obrigado pela dica.
[]'s
Max

Sim, tu precisas atualizar o estado do objeto.

O teu Bean não tem nenhuma relação com a tua tabela no banco de dados.

Uma questão diferente que responde a sua.

O objeto Contato vai saber seu próprio id apenas setando os outros campos?

Entendido.
Obrigado pessoal.
Valeu mesmo, aí pela ajuda.

Infelzimente, continua dando o mesmo erro cloquei assim :

...
while (rs.next()) {
			
			// criando o objeto Contato
			Contato contato = new Contato();
			contato.setId(rs.getLong("id")); // <<<<<  
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
		
			// adicionando o objeto à lista
			contatos.add(contato);
			
		}
...

Uma vez que :

...
public class Contato {
	
	// atributos
	private long id;
	private String nome;
	private String email;
	private String endereco;

}
...

Aliás,

Deu certo sim. Desculpem o engano.
Segue, abaixo, a versão final classe ContatoDAO :

package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.ArrayList;
import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.ConnectionFactory;

public class ContatoDAO {
	
	private Connection connection;

	public ContatoDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();
	}
	
	public void adiciona(Contato contato) throws SQLException {
		
		String sql = "insert into contatos(nome,email,endereco) values (?,?,?)";
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		stmt.setString(1, contato.getNome() );
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco() );
		
		stmt.execute();
		stmt.close();
		
	}
	
	public List<Contato> getLista() throws SQLException {
		
		PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();
		
		List<Contato> contatos = new ArrayList<Contato>();
		
		while (rs.next()) {
			
			Contato contato = new Contato();
			contato.setId(rs.getLong("id")); // <<<<<  
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
		
			contatos.add(contato);
			
		}
		
		rs.close();
		stmt.close();
		
		return contatos;
		
	}
	
	public Contato pesquisar(int idContato) throws SQLException {
	
		String sql = "select * from contatos where id = ?";
		
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setInt(1,idContato);
		ResultSet rs = stmt.executeQuery();
		
		// se o contato não existir retorna null
		Contato contato = null;
		
		while (rs.next()) {
			
			contato = new Contato();
			contato.setId( rs.getLong("id"));
			contato.setNome( rs.getString("nome") );
			contato.setEmail( rs.getString("email") );
			contato.setEndereco( rs.getString("endereco") );
			
		}	
		
		rs.close();
		stmt.close();
		
		return contato;
	}
	
	public void altera(Contato contato) throws SQLException {
		
		PreparedStatement stmt = connection.prepareStatement("update " +
		"contatos set nome=?, email=?, endereco=? where id=?");
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setLong(4, contato.getId());
		stmt.execute();
		stmt.close();
		
	}
	
	public void remove(Contato contato) throws SQLException {
	
	
		PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?");
		stmt.setLong(1, contato.getId());
		stmt.execute();
		stmt.close();
		
	}
	
}

E da classe TestaListaDAO :

package br.com.caelum.jdbc.dao;

import java.sql.SQLException;
import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaListaDAO {

	public static void main(String[] args) throws SQLException {
		
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getLista();
		
		
		for (Contato contato : contatos) {
			
			System.out.println("Id      : " + contato.getId() );
			System.out.println("Nome    : " + contato.getNome());
			System.out.println("Email   : " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco() + "\n");
			
			
		}
		
		Contato novoContato;
		novoContato = dao.pesquisar(4);
		if ( novoContato != null ) {
			
			System.out.println( "Id      : " + novoContato.getId() ) ;
			System.out.println( "Nome    : " + novoContato.getNome() ) ;
			System.out.println( "Email   : " + novoContato.getEmail() ) ;
			System.out.println( "Endereço: " + novoContato.getEndereco() + "\n");
			
			
		} else {
			
			System.out.println("Contato não encontrado");
			
		} 
		
	}

}

Ainda vou melhor o código dos métodos altera()e remove() para não executarem suas funcionalidades de o contato não existir.
Muito obrigado a todos.
Valeu aí pela ajuda.
[ ]'s Max.