[ RESOLVIDO] problemas com exercicios da caelum JDBC

25 respostas
M

pessoal do fazendo os exercicios propostos na apostila da caelum só que ta dando um monte de erro nas duas primeiras classes a connection factory e a testaConexao ta ok
mas já na classes contatodao e testeInsere da muitos erros

esses sao os erros que aparecem na teste Insere

Exception in thread main java.lang.NullPointerException

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:30)

at br.com.caelum.jdbc.Teste.TesteInsere.main(TesteInsere.java:28)

e os erros aparecem nao contatoDao

vou colocar todas as quatro classes

package br.com.teste;

   import java.sql.Connection;  
   import java.sql.DriverManager;  
   import java.sql.SQLException;  
  
  public class ConnectionFactory {  
     public static Connection getConnection() throws SQLException {  
          try {  
           Class.forName("com.mysql.jdbc.Driver");  
             return DriverManager.getConnection("jdbc:mysql://localhost/fj21","jeffer","756210");  
   
         } catch (ClassNotFoundException e) {  
             throw new SQLException(e.getMessage());  
         }  
     }  
 }

essa ta ok

package br.com.caelum.jdbc.Teste;

import java.sql.SQLException;  
import java.sql.Connection;  

import br.com.teste.ConnectionFactory;
 public class TestaConexao {  
   
     public static void main(String[] args)throws SQLException {  
         try{  
         ConnectionFactory connection = new ConnectionFactory();  
         Connection conexao = connection.getConnection();  
          System.out.println("Conectou!");  
          }catch(SQLException e ){  
             System.out.println("Erro: "+ e.getLocalizedMessage());  
           }  
             }  
  
     }

essa tbm so coloquei para desencargo de conciençia

package br.com.caelum.jdbc.Dao;
import java.sql.Connection;
import java.sql.SQLException;
import br.com.caelum.Modelo.Contato;
import br.com.teste.ConnectionFactory;
import com.mysql.jdbc.PreparedStatement; 
import java.sql.Date; 
public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao() throws SQLException {
		this.connection = new ConnectionFactory().getConnection();
	}

	
	 public void adiciona(Contato contato ){
		 String sql = "insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)";
	
	 try{
		 //prepared statement para inserção	 
         PreparedStatement stmt = (PreparedStatement) 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()));
	 	 
		 stmt.execute();
		 stmt.close();
	 }catch(SQLException e){
	 throw new RuntimeException(e);
	
 }
	
}
}

essa é apoblematica

package br.com.caelum.jdbc.Teste;

import java.sql.SQLException;
import java.util.Calendar;
import br.com.caelum.Modelo.Contato;
import br.com.caelum.jdbc.Dao.ContatoDao;


public class TesteInsere {


	public static void main(String[] args) throws SQLException {
	
		
		//pronto para gravar 
		Contato contato =  new Contato();
		contato.setNome("Jefferson");
		contato.setEmail("[email removido]");
		contato.setEndereco("rua zabovari chereder");
		contato.setDataNascimento(Calendar.getInstance());
		
		// grave a conexao 		
		ContatoDao dao = new ContatoDao();
		
		// metodo elegante
		dao.adiciona(contato);
		System.out.println("Gravado !");	        
	}
}

e essa são as duas que ta dando erro

se alguém puder me ajudar fiko grato

25 Respostas

andbecker

não tenho certeza, mas acho q na linha 30 do terceiro arquivo deveria estar stmt.execute(sql)

M

olá andbecker já alterei mas da esse erro ainda

Exception in thread main java.lang.NullPointerException

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:30)

at br.com.caelum.jdbc.Teste.TesteInsere.main(TesteInsere.java:28)
andbecker

tenta na linha 30 usar stmt.executeQuery(sql);
ao invés de só execute

dcorteztec

Exception in thread “main” java.lang.NullPointerException

Ele esta dizendo que seu objeto contato esta nulo

M

olhá só já alterei to testando em duas maquinas mas da dando um erro maior ainda

Exception in thread main java.lang.RuntimeException: java.sql.SQLException: Can not issue data manipulation statements with executeQuery().

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:33)

at br.com.caelum.jdbc.Teste.TestaInsere.main(TestaInsere.java:26)

Caused by: java.sql.SQLException: Can not issue data manipulation statements with executeQuery().

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)

at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:434)

at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1388)

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:30)

 1 more
andbecker

acho q vc tem q separar as manipulações de dados
assim, ao invés de manter os códigos das linhas 25 a 28, vc traria as strings antes, ficaria algo assim:

string a = contato.getNome();

string b = contato.getEmail();

string c = contato.getEndereco();

string d =  new Date(contato.getDataNascimento().getTimeInMillis());

stmt.setString(1,a);

stmt.setString(2,b);

stmt.setString(3,c);

stmt.setDate(4,d);

ps. claro que estou considerando q os campos do banco de dados foram feitos com varchar

E

tem certeza que está chamando o método execute()? Pelo erro parece que vc está chamando o executeQuery()…

Elizeu_Santos

cara, não é por nada. adorei a FJ11, mais a FJ21 ta muito embrulhada… to procurando outro material. se alguém puder enviar algo sobre web e jdbc eu agradeço.
abraços

mapleplayer

Pelo erro alguma coisa esta nula na sua classe ContadoDAO. Creio eu que seja a conexão.

Faça um debug da classe ContatoDAO para saber oque está ocorrendo internamente.

A partir da JDBC 4 não é mais necessário registra o driver que você vai utilizar com o comando Class.forName(“nome_da_classe”), talvez você esteja vendo uma versão antiga da apostila fj21, baixe a nova versão.

M

andbecker:
acho q vc tem q separar as manipulações de dados
assim, ao invés de manter os códigos das linhas 25 a 28, vc traria as strings antes, ficaria algo assim:

string a = contato.getNome();

string b = contato.getEmail();

string c = contato.getEndereco();

string d =  new Date(contato.getDataNascimento().getTimeInMillis());

stmt.setString(1,a);

stmt.setString(2,b);

stmt.setString(3,c);

stmt.setDate(4,d);

ps. claro que estou considerando q os campos do banco de dados foram feitos com varchar

olá andbecker fiz dessa forma claro que tudo é varchar só o date que é Date

M

mas o erro perssiste

M

com algumas dicas reformulei tudo e vou colocar as quatro class novemente

package br.com.teste;

   import java.sql.Connection;  
   import java.sql.DriverManager;  
   import java.sql.SQLException;  
  
  public class ConnectionFactory {  
     public Connection getConnection() throws SQLException {  
          try {    
             return DriverManager.getConnection("jdbc:mysql://localhost/fj21","jeffer","756210");  
   
         } catch (SQLException e) {  
             throw new RuntimeException(e);  
         }  
     }  


 }

essa ta ok

package br.com.caelum.jdbc.Teste;

import java.sql.SQLException;  
import java.sql.Connection;  
import br.com.teste.ConnectionFactory;

 public class TestaConexao {  
   
     public static void main(String[] args)throws SQLException {  
            Connection connection = new ConnectionFactory().getConnection();
            System.out.println("conexao aberta");
            connection.close();
             }  
  
     }

essa tbm

agora que o bicho pega

package br.com.caelum.jdbc.Dao;
import java.sql.Connection;
import java.sql.SQLException;
import br.com.caelum.Modelo.Contato;
import br.com.teste.ConnectionFactory;
import java.sql.PreparedStatement; 
import java.sql.Date; 
public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao() throws SQLException {
		this.connection = new ConnectionFactory().getConnection();
	}

	
	 public void adiciona(Contato contato ){
		 String sql = "insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)";
	
	 try{
		 //prepared statement para inserção	 
         PreparedStatement stmt =  connection.prepareStatement(sql);
         
      // seta os valores
		 String a = contato.getNome();
		 String b = contato.getEmail();
		 String c = contato.getEndereco();
		 Date d = new Date(contato.getDataNascimento().getTimeInMillis());
		 
		// seta os valores
		 stmt.setString(1,a);
		 stmt.setString(2,b);
		 stmt.setString(3,c);
		 stmt.setDate(4,d);
		 
		 stmt.execute();
		 stmt.close();
	 }catch(SQLException e){
	 throw new RuntimeException(e);
	
 }
	
}
}
package br.com.caelum.jdbc.Teste;

import java.sql.SQLException;
import java.util.Calendar;
import br.com.caelum.Modelo.Contato;
import br.com.caelum.jdbc.Dao.ContatoDao;


public class TestaInsere {


	public static void main(String[] args) throws SQLException {
	
		
		//pronto para gravar 
		Contato contato =  new Contato();
		contato.setNome("Jefferson");
		contato.setEmail("[email removido]");
		contato.setEndereco("rua zabovari chereder");
		contato.setDataNascimento(Calendar.getInstance());
		
		// grave a conexao 		
		ContatoDao dao = new ContatoDao();
		
		// metodo elegante
		dao.adiciona(contato);
		System.out.println("Gravado !");	        
	}
}

ta ai todas

mapleplayer

Você fez debug da aplicação?

Faça e veja qual referência é nula. Ae fala pra gente aqui o resultado do seu debug.

Lembrando que o driver do MySQL deve estar no classpath da sua aplicação.

M

n sei como fazer o debug e nem qual referência é nula

mas o driver esta no lugar certo .

mapleplayer

faz assim então, deixa o código de adiciona dessa forma

System.out.println(contato);

String sql = "insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)";  
     System.out.println(sql);
     try{  
         System.out.println(this.connection);

         //prepared statement para inserção    
         PreparedStatement stmt =  connection.prepareStatement(sql);  
         System.out.println(stmt);

         // seta os valores  
         String a = contato.getNome();  
         String b = contato.getEmail();  
         String c = contato.getEndereco();  
         Date d = new Date(contato.getDataNascimento().getTimeInMillis());  
           
        // seta os valores  
         stmt.setString(1,a);  
         stmt.setString(2,b);  
         stmt.setString(3,c);  
         stmt.setDate(4,d);  
           
         stmt.execute();  
         stmt.close();  
     }catch(SQLException e){  
     throw new RuntimeException(e);

algum(uns) dos System.out.println() vai imprimir null(eu creio) =)
coloca o resultado pra mim ver dae

M

fiz do jeito que vc colocou

package br.com.caelum.jdbc.Teste;

import java.sql.SQLException;
import java.util.Calendar;
import br.com.caelum.Modelo.Contato;
import br.com.caelum.jdbc.Dao.ContatoDao;


public class TestaInsere {


	public static void main(String[] args) throws SQLException {
	
		
		//pronto para gravar 
		Contato contato =  new Contato();
		contato.setNome("Jefferson");
		contato.setEmail("[email removido]");
		contato.setEndereco("rua zabovari chereder");
		contato.setDataNascimento(Calendar.getInstance());
		
		// grave a conexao 		
		ContatoDao dao = new ContatoDao();
		
		// metodo elegante
		dao.adiciona(contato);
		System.out.println("Gravado !");	        
	}
}

e a menssagem de erro agora é essa

br.com.caelum.Modelo.Contato@c51355
insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)
com.mysql.jdbc.JDBC4Connection@787171
com.mysql.jdbc.JDBC4PreparedStatement@1bd4722: insert into contatos (nome,email,endereco,dataNascimento)values(** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **)
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: No value specified for parameter 1
at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:43)
at br.com.caelum.jdbc.Teste.TestaInsere.main(TestaInsere.java:26)
Caused by: java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2558)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2534)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2460)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1298)
at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:40)
... 1 more

M

disculpa errei a class
vai a certa

package br.com.caelum.jdbc.Dao;
import java.sql.Connection;
import java.sql.SQLException;
import br.com.caelum.Modelo.Contato;
import br.com.teste.ConnectionFactory;
import java.sql.PreparedStatement; 
import java.sql.Date; 
public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao() throws SQLException {
		this.connection = new ConnectionFactory().getConnection();
	}

	
	 public void adiciona(Contato contato ){
		    System.out.println(contato);  
		      
		    String sql = "insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)";    
		          System.out.println(sql);  
		          try{    
		              System.out.println(this.connection);  
		       
		              //prepared statement para inserção      
		             PreparedStatement stmt =  connection.prepareStatement(sql);    
		            System.out.println(stmt);  
		      
		             // seta os valores    
		            String a = contato.getNome();    
		            String b = contato.getEmail();    
		            String c = contato.getEndereco();    
		             Date d = new Date(contato.getDataNascimento().getTimeInMillis());    
		                 
		            // seta os valores    
		             stmt.setString(2,b);    
		            stmt.setString(3,c);    
		            stmt.setDate(4,d);    
		                
		             stmt.execute();    
		            stmt.close();    
		         }catch(SQLException e){    
		        throw new RuntimeException(e);  

	
 }
	
}
}
M

pow errei de novo esqueci da stmt.setString(1,a);

ta dae arrume e o erro tbm mudou agora é esse

Exception in thread main java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column dataNascimento in field list

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:44)

at br.com.caelum.jdbc.Teste.TestaInsere.main(TestaInsere.java:26)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column dataNascimento in field list

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance(Unknown Source)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)

at com.mysql.jdbc.Util.getInstance(Util.java:382)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)

at br.com.caelum.jdbc.Dao.ContatoDao.adiciona(ContatoDao.java:41)

 1 more

br.com.caelum.Modelo.Contato@c51355

insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)

com.mysql.jdbc.JDBC4Connection@787171

com.mysql.jdbc.JDBC4PreparedStatement@1bd4722: insert into contatos (nome,email,endereco,dataNascimento)values(** NOT SPECIFIED <strong>,</strong> NOT SPECIFIED <strong>,</strong> NOT SPECIFIED <strong>,</strong> NOT SPECIFIED **)
andbecker
musico*:
disculpa errei a class vai a certa
package br.com.caelum.jdbc.Dao;
import java.sql.Connection;
import java.sql.SQLException;
import br.com.caelum.Modelo.Contato;
import br.com.teste.ConnectionFactory;
import java.sql.PreparedStatement; 
import java.sql.Date; 
public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao() throws SQLException {
		this.connection = new ConnectionFactory().getConnection();
	}

	
	 public void adiciona(Contato contato ){
		    System.out.println(contato);  
		      
		    String sql = "insert into contatos (nome,email,endereco,dataNascimento)values(?,?,?,?)";    
		          System.out.println(sql);  
		          try{    
		              System.out.println(this.connection);  
		       
		              //prepared statement para inserção      
		             PreparedStatement stmt =  connection.prepareStatement(sql);    
		            System.out.println(stmt);  
		      
		             // seta os valores    
		            String a = contato.getNome();    
		            String b = contato.getEmail();    
		            String c = contato.getEndereco();    
		             Date d = new Date(contato.getDataNascimento().getTimeInMillis());    
		                 
		            // seta os valores    
		             stmt.setString(2,b);    
		            stmt.setString(3,c);    
		            stmt.setDate(4,d);    
		                
		             stmt.execute();    
		            stmt.close();    
		         }catch(SQLException e){    
		        throw new RuntimeException(e);  

	
 }
	
}
}

na linha 40 substitui o execute() por executeUpdate(sql);

mas ainda assim vc vai ter outro problema, a data do mysql é num formato diferente da do java... vc tem q fazer o ajuste [a menos q tenha configurado o banco de dados pro formato de data comum...

de qq forma há outro possivel erro... tem certeza que a coluna dataNascimento tem esse nome no banco de dados???

M

olá andbecker cara realmente a porra do erro tava no Banco no banco tava dateNascimento sendo que era dataNascimento

ok mas deu certo (Gravado ! )

valeu amigos obrigado …se eu precisar recorerei ao Guj novamente

andbecker

mais uma batalha vencida :smiley:

andersonbraz

tive o mesmo problema… então dei uma ajeitada primeiro no ConnectionFactory:

package br.com.anderson.jdbc.mysql;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class ConnectionFactory{

static String status = "";

public static String getStatus() {
	return status;
}

public static Connection getConnection(){

	Connection conn = null;
	
	try{
		
		Class.forName("com.mysql.jdbc.Driver").newInstance();
		String url = "jdbc:mysql://localhost/agenda?user=root&password=root";
		conn = DriverManager.getConnection(url);
		status = "Connection Opened";
		
	}catch(SQLException e){
		status = e.getMessage();
	}catch(ClassNotFoundException e) {
		status = e.getMessage();
	}catch(Exception e){
		status = e.getMessage();
	}
	
	return conn;
}

}

andersonbraz

aliás só alterei mesmo o ConnectionFactory… Então todo o resto passou a funcionar…

andersonbraz

Primeiro Corrija - Class ConnectionFactory

package br.com.anderson.jdbc.mysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory{

	static String status = "";
	
	public static String getStatus() {
		return status;
	}

	public static Connection getConnection(){
	
		Connection conn = null;
		
		try{
			
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			String url = "jdbc:mysql://localhost/agenda?user=root&password=root";
			conn = DriverManager.getConnection(url);
			status = "Connection Opened";
			
		}catch(SQLException e){
			status = e.getMessage();
		}catch(ClassNotFoundException e) {
			status = e.getMessage();
		}catch(Exception e){
			status = e.getMessage();
		}
		
		return conn;
	}
}
A

estou com esse problema, tenho uma classe DAO para inserir dados no banco que pega o código

stmt.setDate(4, (java.sql.Date) new Date(contato.getDataNascimento().getTimeInMillis()));    
            //executa    
            stmt.execute();    
            stmt.close();

e quando vou na classe para inserir os dados :

Contato contato = new Contato();    
        contato.setNome("Adne dos Santos");    
        contato.setEmail("[email removido]");    
        contato.setEndereco("R. Flores 0510");    
        contato.setDataNascimento(Calendar.getInstance());    
    
        ContatoDAO dao = new ContatoDAO();    
        dao.adiciona(contato);    
        System.out.println("Gravado");

da o seguinte erro,

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date at dao.ContatoDAO.adiciona(ContatoDAO.java:27) at teste.TestaInsere.main(TestaInsere.java:19)
[color=red] [/color]

alguém ai pode dar uma força?
Agradeço desde já

Criado 14 de fevereiro de 2011
Ultima resposta 29 de mar. de 2013
Respostas 25
Participantes 8