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
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());newContatoDAO().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
publicContatomostrarUmContatoPorID(intid)throwsSQLException{Contatocontato=newContato();PreparedStatementstm=c.prepareStatement("select * from contatos where id=?");stm.setInt(1,contato.getId());ResultSetrs=stm.executeQuery();while(rs.next()){contato.setNome(rs.getString("nome"));contato.setEndereco(rs.getString("endereco"));contato.setEmail(rs.getString("email"));Calendardata=Calendar.getInstance();data.setTime(rs.getDate("datanasc"));contato.setDataNasc(data);}rs.close();stm.close();returncontato;}
Classe Executavel
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());newContatoDAO().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.
# 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
henriquejhc
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
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.
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
henriquejhc
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());// aqui ele está setando o idnewContatoDAO().mostrarUmContatoPorID(contato.getId());// está passando um longSystem.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:
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());// aqui ele está setando o idnewContatoDAO().mostrarUmContatoPorID(contato.getId());// está passando um longSystem.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
henriquejhc
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…
MarcioProgramador
olá... testei o código agora... continua dando NullPointerException ... o código ficou dessa forma
publicContatomostrarUmContatoPorID(intid)throwsSQLException{Contatocontato=newContato();PreparedStatementstm=c.prepareStatement("select * from contatos where id=?");stm.setInt(1,id);ResultSetrs=stm.executeQuery();while(rs.next()){contato.setNome(rs.getString("nome"));contato.setEndereco(rs.getString("endereco"));contato.setEmail(rs.getString("email"));Calendardata=Calendar.getInstance();data.setTime(rs.getDate("datanasc"));contato.setDataNasc(data);}rs.close();stm.close();returncontato;}}
Classe Principal
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());newContatoDAO().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
henriquejhc
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
henriquejhc
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
publicContatomostrarUmContatoPorID(longid)throwsSQLException{Contatocontato=newContato();PreparedStatementstm=c.prepareStatement("select * from contatos where id=?");stm.setLong(1,id);ResultSetrs=stm.executeQuery();while(rs.next()){contato.setNome(rs.getString("nome"));contato.setEndereco(rs.getString("endereco"));contato.setEmail(rs.getString("email"));Calendardata=Calendar.getInstance();data.setTime(rs.getDate("datanasc"));contato.setDataNasc(data);}rs.close();stm.close();returncontato;}}
Principal
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());longvalor=contato.getId();contato=newContatoDAO().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
henriquejhc
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
publicstaticvoidmain(String[]args)throwsSQLException{Contatocontato=newContato();Scannersc=newScanner(System.in);System.out.print("Digite o id para pesquisar.:");contato.setId(sc.nextInt());longvalor=contato.getId();try{contato=newContatoDAO().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(NullPointerExceptionex){System.out.print("Erro!ID não existe");}}}