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

16 respostas
MarcioProgramador

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

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");

			
		
	}

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!

16 Respostas

J-Chist
O erro está na linha 5 da classe ContatoDAO que não funciona.
# 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());
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.
H

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.

J-Chist

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

Está???

H

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

Está???

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

J-Chist

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

Está???

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

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…

H
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");

			
		
	}
J-Chist
henriquejhc:
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");

			
		
	}

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í.

H

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.

MarcioProgramador

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:

MarcioProgramador

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

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

Classe 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());
		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");

			
		
	}

Alguma sugestão...???

H

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.

H

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

MarcioProgramador

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

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

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();
		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");

			
		
	}
MarcioProgramador

Obrigado pela ajuda henriquejhc :lol:

H

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

Falow.

MarcioProgramador

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");
		}

	}

}
Criado 23 de fevereiro de 2010
Ultima resposta 24 de fev. de 2010
Respostas 16
Participantes 3