[RESOLVIDO] Pesquisa DAO por ID

Espero que esteja fazendo isso certo.

Fiz uma classe que utiliza um DAO para fazer a pesquisa no bando de dados e exibe as informações na tela:

import br.com.caelum.jdbc.dao.ContatoDao;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaPesquisa {
	public static void main(String[] args) {
		ContatoDao dao = new ContatoDao();
		Contato contato = dao.pesquisar(1);

		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());
		System.out.println("Data: " + contato.getDataNascimento());
	}
}

Aqui o método do meu DAO:

	public Contato pesquisar(int id) {
		try {
			PreparedStatement stmt = this.con
					.prepareStatement("select * from contatos where id =" + id);
			ResultSet rs = stmt.executeQuery();

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

			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);

			return contato;

		} catch (SQLException e) {
			throw new DAOException();
		}
	}

E estou com o seguinte erro:

Exception in thread "main" br.com.caelum.jdbc.DAOException
	at br.com.caelum.jdbc.dao.ContatoDao.pesquisar(ContatoDao.java:90)
	at br.com.caelum.jdbc.teste.TestaPesquisa.main(TestaPesquisa.java:9)

Alguém poderia me dizer o que eu fiz de errado?
Desde já agradeço e peço desculpas se postei no lugar errado ou de forma errada.

o erro que você colocou não diz nada,
tem que colocar onde diz assim : caused by …

Posta a stacktrace completa, a classe ContatoDao e como abre a conexão com o banco de dados.

stacktrace completa:

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Before start of result set
	at br.com.caelum.jdbc.dao.ContatoDao.pesquisar(ContatoDao.java:90)
	at br.com.caelum.jdbc.teste.TestaPesquisa.main(TestaPesquisa.java:9)
Caused by: java.sql.SQLException: Before start of result set
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
	at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2952)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2947)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:3059)
	at br.com.caelum.jdbc.dao.ContatoDao.pesquisar(ContatoDao.java:78)
	... 1 more

A concatenação do id está mesmo sem espaço no seu código?

Se sim, tente:

E o correto seria usar parâmetros e não concatenar o SQL. Mas, vamos ver se o problema é esse.

Fiz a correção e não surtiu efeito, continuo com a mesma stacktrace. Eu estou fazendo exercícios de apostila, porém se vc poder mostrar como ficaria usando parâmetro vai ser de ótimo proveito.
Mais um vez, obrigado pela atenção.

Antes de fazer rs.getLong ou qualquer outro get tens de colocar o resultset na primeira posição.

rs.next();

Se não existirem resultados isto vai retornar false, se existirem vai retornar true.

TENTE:

    String sql = "select * from contatos where id =?";
    PreparedStatement stmt = this.con.prepareStatement(sql);

    stmt.setId(1,id); // o id é o argumento recebido pelo método
    ResultSet rs = stmt.executeQuery(); 
    
    if(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"));  
  
        Calendar data = Calendar.getInstance();  
        data.setTime(rs.getDate("dataNascimento"));  
        contato.setDataNascimento(data);
    }
    return contato;

Muito obrigado pmlm pela explicação e Alexsandro Lopes pelo exemplo.
Era esse mesmo o problema.

Alexsandro Lopes ao invés de usar stmt.setId(1,id) eu usei stmt.setInt(1, id)