Recuperar dado com jdbc nao funciona... (RESOLVIDO)

Olá pessoal… estou utilizando jdbc em algumas classes que eu estou utilizando atraves da apostila fj-21 da caelum que eu estou estudando… no exemplo eles pedem pra recuperar um contato qualquer através de id … eu consegui fazer o código pra retornar e talz… mas só consigo retornar ele se passar um argumento do tipo contato para o método… algo mais ou menos assim…

Código que Funciona

Classe ContatoDAO

public Contato mostrarUmContatoPorID(Contato contato) throws SQLException {
				
		PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
		stm.setInt(1, contato.getId());
		ResultSet rs = stm.executeQuery();
		
		while (rs.next()) {
			
			contato.setNome(rs.getString("nome"));
			contato.setEndereco(rs.getString("endereco"));
			contato.setEmail(rs.getString("email"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanasc"));
			contato.setDataNasc(data);

		}
		rs.close();
		stm.close();
		return contato;
	}

Classe Executável

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

	Contato contato = new Contato();
	Scanner sc = new Scanner(System.in);
	System.out.print("Digite o id para pesquisar.:");
	contato.setId(sc.nextInt());
	new ContatoDAO().mostrarUmContatoPorID(contato);
	
	System.out.println("ID Selecionada.: "+contato.getId());
	System.out.println("Nome.: "+contato.getNome());
	System.out.println("Endereço.: "+contato.getEmail());
	System.out.println("E-mail.: "+contato.getEmail());
	System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

		
	
}[/code]

Entao… eu gostaria de passar um argumento para o método mostrarUmContato aonde o argumento passado fosse um valor inteiro e nao do tipo Contato… tentei fazer dessa forma mas me gera um NullPointerException…

Código que não funciona

Classe ContatoDAO


public Contato mostrarUmContatoPorID(int id) throws SQLException {
				
		Contato contato = new Contato();
		PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
		stm.setInt(1, contato.getId());
		ResultSet rs = stm.executeQuery();
		
		while (rs.next()) {
			
			contato.setNome(rs.getString("nome"));
			contato.setEndereco(rs.getString("endereco"));
			contato.setEmail(rs.getString("email"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanasc"));
			contato.setDataNasc(data);

		}
		rs.close();
		stm.close();
		return contato;
	}

Classe Executavel


public static void main(String[] args) throws SQLException {
		
		Contato contato = new Contato();
		Scanner sc = new Scanner(System.in);
		System.out.print("Digite o id para pesquisar.:");
		contato.setId(sc.nextInt());
		
		new ContatoDAO().mostrarUmContatoPorID(contato.getId());
		
		
		
		System.out.println("ID Selecionada.: "+contato.getId());
		System.out.println("Nome.: "+contato.getNome());
		System.out.println("Endereço.: "+contato.getEndereco());
		System.out.println("E-mail.: "+contato.getEmail());
		System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

			
		
	}

Qual o erro??? Acho que ele esta pegando o valor de mais de um objeto por isso ele esta dando este erro… ao meu ver… desde já agradeço as explicações!

O erro está na linha 5 da classe ContatoDAO que não funciona.

[code]# public Contato mostrarUmContatoPorID(int id) throws SQLException {

Contato contato = new Contato();

PreparedStatement stm = c.prepareStatement(“select * from contatos where id=?”);

stm.setInt(1, contato.getId()); [/code]

Você passa o inteiro como argumento mas não o passa como parâmetro para o setInt, você usa o contato vazio que acabou de instanciar.
Faça stm.setInt(1, id); e deve funcionar.

Olá. De uma verificada mas acho que o id do contato é um long.
Aqui você está passando um long:

E aqui recebendo um int como paramêtro:

Como falou nosso amigo J-Chist. Tem que ser assim:

Espero ter ajudado.

[quote=henriquejhc]Olá. De uma verificada mas acho que o id do contato é um long.
Aqui você está passando um long:

[/quote]

Está???

[quote=J-Chist][quote=henriquejhc]Olá. De uma verificada mas acho que o id do contato é um long.
Aqui você está passando um long:

[/quote]

Está???

[/quote]

Sim. Se você ver na apostila verá que o id da classe Contato é um long.

[quote=henriquejhc][quote=J-Chist][quote=henriquejhc]Olá. De uma verificada mas acho que o id do contato é um long.
Aqui você está passando um long:

[/quote]

Está???

[/quote]

Sim. Se você ver na apostila verá que o id da classe Contato é um long.[/quote]

Ah, tá. Eu não tenho a apostila. De qualquer forma, esse problema do nosso amigo aqui é a linha 5. Se ele passar um long para o setInt vai tomar um erro de incompatibilidade de parâmetros.

Como no código que funciona ele também está usando o setInt…

public static void main(String[] args) throws SQLException {
		
		Contato contato = new Contato();
		Scanner sc = new Scanner(System.in);
		System.out.print("Digite o id para pesquisar.:");
		contato.setId(sc.nextInt()); // aqui ele está setando o id
		
		new ContatoDAO().mostrarUmContatoPorID(contato.getId()); // está passando um long
		
		
		
		System.out.println("ID Selecionada.: "+contato.getId());
		System.out.println("Nome.: "+contato.getNome());
		System.out.println("Endereço.: "+contato.getEndereco());
		System.out.println("E-mail.: "+contato.getEmail());
		System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

			
		
	}

[quote=henriquejhc][code]
public static void main(String[] args) throws SQLException {

	Contato contato = new Contato();
	Scanner sc = new Scanner(System.in);
	System.out.print("Digite o id para pesquisar.:");
	contato.setId(sc.nextInt()); // aqui ele está setando o id
	
	new ContatoDAO().mostrarUmContatoPorID(contato.getId()); // está passando um long
	
	
	
	System.out.println("ID Selecionada.: "+contato.getId());
	System.out.println("Nome.: "+contato.getNome());
	System.out.println("Endereço.: "+contato.getEndereco());
	System.out.println("E-mail.: "+contato.getEmail());
	System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

		
	
}

[/code][/quote]

A partir da apostila se pode pressumir isso. Como ele não postou a classe Contato que fez, não podemos fazer tal afirmação.

Enfim, se o erro persistir, coloca aí.

Alternativa:

public Contato mostrarUmContatoPorID(long id) throws SQLException {
				                // altere o paramêtro para long
		Contato contato = new Contato();
		PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
		stm.setLong(1, id); // altere para setLong()
		ResultSet rs = stm.executeQuery();
		
		while (rs.next()) {
			.......
			.......
		}
		rs.close();
		stm.close();
		return contato;
}

Espero ter ajudado.

obrigado J-Chist e henriquejhc… realmente na apostila está sendo passado um valor do tipo long… mas eu mudei um pouco essa programação pra não ficar tao igual a da apostila, por isso estou passando como valor um tipo int … vou testar o código agora… assim que resolver eu mudo o tópico para editado… e obrigado pela ajuda… eu realmente não conseguia mais enxergar o erro huhuhuhu… mas eu tinha certeza que o erro era nesse objeto que eu tinha instanciado (só isso explicava o não apontar pra lugar nenhum!!!). Obrigado pela ajuda…

:slight_smile:

olá… testei o código agora… continua dando NullPointerException … o código ficou dessa forma

[code]

public Contato mostrarUmContatoPorID(int id) throws SQLException {

	Contato contato = new Contato();
	PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
	stm.setInt(1, id);
	ResultSet rs = stm.executeQuery();
	
	while (rs.next()) {
		
		contato.setNome(rs.getString("nome"));
		contato.setEndereco(rs.getString("endereco"));
		contato.setEmail(rs.getString("email"));
		Calendar data = Calendar.getInstance();
		data.setTime(rs.getDate("datanasc"));
		contato.setDataNasc(data);

	}
	rs.close();
	stm.close();
	return contato;
}

}[/code]

Classe Principal

[code]

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

	Contato contato = new Contato();
	Scanner sc = new Scanner(System.in);
	System.out.print("Digite o id para pesquisar.:");
	contato.setId(sc.nextInt());
	new ContatoDAO().mostrarUmContatoPorID(contato.getId());
			
	System.out.println("ID Selecionada.: "+contato.getId());
	System.out.println("Nome.: "+contato.getNome());
	System.out.println("Endereço.: "+contato.getEndereco());
	System.out.println("E-mail.: "+contato.getEmail());
	System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

		
	
}[/code]

Alguma sugestão…???

O id do Contato agora está como long?

Na linha 7 da classe Principal também deve ser alterado :

contato = new ContatoDAO().mostrarUmContatoPorID(contato.getId()); 

Espero ter ajudado.

Como você está criando a conexão?
Cola o stackTrace da exception.

Agora está funcionando… mudei o argumento de int para long e agora está funcionando normalmente… mas precisei declarar uma variável long na classe Principal para poder exibir corretamente o valor digitado, pq deixando só contato = new ContatoDAO().mostrarUmContatoPorID(contato.getID()) exibia na saída somente zero independente do valor digitado! o código final ficou assim :

ContatoDAO

[code]
public Contato mostrarUmContatoPorID(long id) throws SQLException {

	Contato contato = new Contato();
	PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
	stm.setLong(1,id);
	ResultSet rs = stm.executeQuery();
	
	while (rs.next()) {
		
		contato.setNome(rs.getString("nome"));
		contato.setEndereco(rs.getString("endereco"));
		contato.setEmail(rs.getString("email"));
		Calendar data = Calendar.getInstance();
		data.setTime(rs.getDate("datanasc"));
		contato.setDataNasc(data);

	}
	rs.close();
	stm.close();
	return contato;
}

}[/code]

Principal

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

	Contato contato = new Contato();
	Scanner sc = new Scanner(System.in);
	System.out.print("Digite o id para pesquisar.:");
	contato.setId(sc.nextInt());
	long valor = contato.getId();
	contato = new ContatoDAO().mostrarUmContatoPorID(valor);
			
	System.out.println("ID Selecionada.: "+valor);
	System.out.println("Nome.: "+contato.getNome());
	System.out.println("Endereço.: "+contato.getEndereco());
	System.out.println("E-mail.: "+contato.getEmail());
	System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");

		
	
}[/code]

Obrigado pela ajuda henriquejhc :lol:

De nada. Quando precisar é só perguntar, que aqui no fórum sempre terá alguém para te ajudar.

Falow.

Código com tratamento de exceções …

Principal


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

		Contato contato = new Contato();
		Scanner sc = new Scanner(System.in);
		System.out.print("Digite o id para pesquisar.:");
		contato.setId(sc.nextInt());
		long valor = contato.getId();
		try {
			contato = new ContatoDAO().mostrarUmContatoPorID(valor);
				if(!contato.getNome().equals(null))
				{
				System.out.println("ID Selecionada.: " + valor);
				System.out.println("Nome.: " + contato.getNome());
				System.out.println("Endereço.: " + contato.getEndereco());
				System.out.println("E-mail.: " + contato.getEmail());
				System.out.println("Data.: " + contato.getDataNasc().getTime()
						+ "\n");
				}
		} catch (NullPointerException ex) {
			System.out.print("Erro!ID não existe");
		}

	}

}