package br.com.caelum.jdbc.modelo;
import br.com.caelum.jdbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import java.util.Calendar;
public class ContatoDao {
private Connection connection;
public ContatoDao(){
this.connection = new ConnectionFactory().getConnection();
}//fim public CaontatoDao()
public void insere(Contato contato){
String sql = "insert into contatos (nome, email, endereco, dataNascimento)"+
"values (?, ?, ?, ?)";
try{
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, contato.getNome());
stmt.setString(2, contato.getEmail());
stmt.setString(3, contato.getEndereco());
stmt.setDate(4, (java.sql.Date) new Date(contato.getDataNascimento().getTimeInMillis()));
stmt.execute();
stmt.close();
}//fim try
catch (SQLException e){
throw new RuntimeException(e);
}//fim catch (SQLException e)
}//fim public void insere(Contato contato)
}//fim public class ContatoDao
Conectando ao banco!!
Exception in thread “main” java.lang.NullPointerException
at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:30)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)
Também tentei sei o cast.
Desde já agradeço sua atenção.
Assim cara, você precisa aprender a ler os erros que ocorrem. Repare que trata-se de uma NullPointerException. Na maioria das vezes esse erro ocorre porque você invoca um método (ou acessa um membro de classe) a partir de uma referência nula. O mais provável é que a referência retornada pelo método getDataNascimento seja nula.
package br.com.caelum.jdbc.modelo;
import br.com.caelum.jdbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class ContatoDao {
private Connection connection;
public ContatoDao(){
this.connection = new ConnectionFactory().getConnection();
}//fim public CaontatoDao()
public void insere(Contato contato){
String sql = "insert into contatos (nome, email, endereco, dataNascimento)"+
"values (?, ?, ?, ?)";
try{
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, contato.getNome());
stmt.setString(2, contato.getEmail());
stmt.setString(3, contato.getEndereco());
SimpleDateFormat in = new SimpleDateFormat("YYYY-MM-DD");
SimpleDateFormat out = new SimpleDateFormat("DD-MM-YYYY");
stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
stmt.execute();
stmt.close();
}//fim try
catch (SQLException e){
throw new RuntimeException(e);
}//fim catch (SQLException e)
}//fim public void insere(Contato contato)
}//fim public class ContatoDao
Conectando ao banco!!
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments (int, Date)
at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:36)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)
Cara,
como o erro diz, o setDate não possui argumentos válidos para os tipos que você informou.
Ou seja, o método setDate do PreparedStatement possui como segundo argumento uma instância do objeto java.sql.Date
e você informou uma do tipo java.util.Date.
package br.com.caelum.jdbc.modelo;
import java.util.Calendar;
public class TestaInsere {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Contato contato = new Contato();
contato.setNome("Nicolly");
contato.setId(10);
contato.setEndereco("Rua Nova Conquista, 3591");
contato.setEmail("nicolly@hotmail.com");
contato.setDataNascimento(Calendar.getInstance());
ContatoDao dao = new ContatoDao();
dao.insere(contato);
System.out.println("Gravado");
}
}
package br.com.caelum.jdbc.modelo;
import java.util.Calendar;
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;
}//fim setDataNascimento
}//fim public class Contatos
e este é o erro
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments (int, Date)
at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:36)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)
Como o colega acima falou, você está passando um objeto da classe java.util.Date, sendo que o método espera um objeto da classe java.sql.Date. Você tem duas opções, ou importa a classe java.sql.Date ou então usa o nome completo da classe: