Ola pessoal, estou seguindo os exercicios da apostila da Caelum FJ-21 (Quando tiver dinheiro pretendo fazer o curso mesmo)...então...
É logo no inicio da apostila.
Pretendo alterar dados gravados no banco de dados...porém esta dando um erro e não seu porque...eis meus códigos:
package br.com.caelum.jdbc.modelo;
import java.util.Calendar; // utiliza a classe Calendar
/*
* JavaBean de Contato. Uma classe "Model".
*/
public class Contato {
private Long id;
private String nome;
private String email;
private String endereco;
private Calendar dataNascimento;
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public Calendar getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Calendar dataNascimento) {
this.dataNascimento = dataNascimento;
}
}
package br.com.caelum.jdbc.dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;
public class ContatoDAO {
// a conexão com o banco de dados
private Connection connection;
// método construtor de ContatoDAO.
public ContatoDAO() {
// fabrica a conexão com o BD.
this.connection = new ConnectionFactory().getConnection();
} // fim do construtor ContatoDAO.
// método para adicionar dados no BD.
public void adiciona( Contato contato ) {
// String que guarda o comando SQL a ser executado.
String sql = "insert into contatos ( nome, email, endereco, dataNascimento ) values ( ? , ?, ?, ? )";
// tratamento de erros.
try {
// prepared statement para inseção.
PreparedStatement stmt = connection.prepareStatement(sql);
// seta os valores;
stmt.setString( 1, contato.getNome() );
stmt.setString( 2, contato.getEmail() );
stmt.setString( 3, contato.getEndereco() );
stmt.setDate( 4, new Date( contato.getDataNascimento().getTimeInMillis() ) );
// execute
stmt.execute();
stmt.close();
} catch( SQLException e ) {
throw new RuntimeException( e );
}
} // fim do método adiciona
// cria uma listagem de todos os registros da tabela contatos.
public List< Contato > getLista() {
try {
List< Contato > contatos = new ArrayList< Contato >();
PreparedStatement stmt = this.connection.prepareStatement( "select * from contatos" );
ResultSet rs = stmt.executeQuery();
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" ) );
// montando a data através do Calendar.
Calendar data = Calendar.getInstance();
data.setTime( rs.getDate( "dataNascimento" ) );
contato.setDataNascimento( data );
// adicionando o objeto à lista.
contatos.add( contato );
} // fim do while.
rs.close(); // fecha o ResultSet rs.
stmt.close(); // fecha o PreparedStatement stmt.
return contatos;
} catch ( SQLException e ) {
throw new RuntimeException( e );
}
} // fim do método getLista
// retorna um contato resultante de uma consulta no BD.
public Contato pesquisar( int id ) {
String sql = "select * from contatos where id = ?";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
Contato contato = new Contato();
while ( rs.next() ) {
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 );
} // fim do while
rs.close();
stmt.close();
return contato;
} catch (SQLException e) {
throw new RuntimeException( e );
}
} // fim do método pesquisar.
// altera dados no BD
public void altera( Contato contato ) {
String sql = "update contatos set nome = ?, email = ?, endereco = ?, dataNascimento = ? where id = ?";
try {
PreparedStatement stmt = connection.prepareStatement( sql );
stmt.setString(1, contato.getNome() );
stmt.setString(2, contato.getEmail() );
stmt.setString(3, contato.getEndereco() );
stmt.setDate(4, new Date( contato.getDataNascimento().getTimeInMillis() ) );
stmt.setLong(5, contato.getId() );
stmt.execute();
stmt.close();
} catch( SQLException e ) {
throw new RuntimeException( e );
}
} // fim do método altera.
// remove registros do BD
public void remove( Contato contato ) {
try {
PreparedStatement stmt = connection.prepareStatement( "delete from contatos where id = ?" );
stmt.setLong( 1, contato.getId() );
stmt.execute();
stmt.close();
} catch( SQLException e ) {
throw new RuntimeException( e );
}
} // fim do método remove.
} // fim da classe ContatoDAO
package br.com.caelum.jdbc.teste;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;
public class TestaAltera {
public static void main ( String[] args ) {
Scanner input = new Scanner( System.in ); // objeto Scanner para entrada de dados via teclado.
ContatoDAO dao = new ContatoDAO(); // objeto para acesso ao banco de dados.
Contato contato = new Contato();
List<Contato> contatos = dao.getLista();
// pesquisa pelo id.
System.out.print( "Enter id: " ); // prompt
contato = dao.pesquisar( input.nextInt() );
contato.setNome( "Meu nome" );
contato.setEmail( "Meu email" );
contato.setEndereco( "Meu endereco" );
contato.setDataNascimento( Calendar.getInstance() );
// utiliza método altera do objeto DAO.
dao.altera( contato );
// exibe os contatos.
for ( Contato contato2 : contatos ) {
System.out.println( "Nome: " + contato.getNome() );
System.out.println( "Email: " + contato.getEmail() );
System.out.println( "Endereço: " + contato.getEndereco() );
// processo para formatar a data.
String data2 = new SimpleDateFormat( "dd/MM/yyyy" ).format( contato.getDataNascimento().getTime() );
System.out.println( "Data de Nascimento: " + data2 );
} // fim do for.
}
}
O que acontece é quando rodo o TestaAltera surge o erro:
Exception in thread "main" java.lang.NullPointerException
at br.com.caelum.jdbc.dao.ContatoDAO.altera(ContatoDAO.java:126)
at br.com.caelum.jdbc.teste.TestaAltera.main(TestaAltera.java:33)
Ja tentei resolver tentando incluir um setId para que o método utilize o numero fornecido no pesquisar, porém quando faço isso ele altera todos os dados do BD.
Alguém pode ajudar?