Olá, sou novo no fórum. Estou estudando a parte de jdbc antes de começar algo maior (como frameworks de ORM, etc.). Consegui me conectar e adicionar um registro no banco de dados (MYSQL 5.0.37), usando o JDK 1.5 Update 6 e o driver mysql connector 5.0.5. O problema é que quando eu tento fazer uma classe DAO, na hora de adicionar, ocorre uma NullPointerException. Só que o código pra adicionar É O MESMO que eu usava antes, pra conectar e adicionar, usando uma classe só! Vou colocar os códigos do “antes e depois”, pra se alguém puder, me corrija ou ajude:
ANTES
import java.sql.*;
public class TesteBD {
public static void main (String args[]) {
try {
Connection conexao = ConnectionFactory.getConnection();
Contato c = new Contato();
c.setNome("Fulano");
c.setEndereco("Rua da casa dele");
c.setIdade(19);
c.setTelefone("1199999999");
c.setEmail("fulano@globo.com");
System.out.println("Contato criado");
PreparedStatement stmt = conexao.prepareStatement("insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);");
stmt.setString(1,c.getNome());
stmt.setString(2,c.getEndereco());
stmt.setInt(3,c.getIdade());
stmt.setString(4,c.getTelefone());
stmt.setString(5,c.getEmail());
stmt.executeUpdate();
stmt.close();
System.out.println("Contato adicionado");
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
DEPOIS
[code]import java.sql.*;
public class TestaDAO {
public static void main (String args[]) {
try {
Connection conexao = ConnectionFactory.getConnection();
Contato c = new Contato();
c.setNome("Fulano");
c.setEndereco("Rua da casa dele");
c.setIdade(19);
c.setTelefone("1199999999");
c.setEmail("fulano@globo.com");
System.out.println("Contato criado");
ContatoDAO dao = new ContatoDAO();
dao.adiciona(c);
}
catch (Exception e) {
e.printStackTrace();
}
}
}[/code]
Classe ContatoDAO
[code]import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class ContatoDAO {
private Connection conexao;
private PreparedStatement stmt;
public void ContatoDAO() throws SQLException {
this.conexao = ConnectionFactory.getConnection();
}
public void adiciona(Contato contato) throws Exception {
stmt = this.conexao.prepareStatement("insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);");
stmt.setString(1,contato.getNome());
stmt.setString(2,contato.getEndereco());
stmt.setInt(3,contato.getIdade());
stmt.setString(4,contato.getTelefone());
stmt.setString(5,contato.getEmail());
stmt.executeUpdate();
stmt.close();
}
}[/code]
ConnectionFactory
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class ConnectionFactory {
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/agenda";
private static final String user = "root";
private static final String pass = "";
public static Connection getConnection() throws SQLException {
try {
Class.forName(driver);
return DriverManager.getConnection(url,user,pass);
}
catch (ClassNotFoundException e) {
throw new SQLException("O driver jdbc não foi encontrado");
}
}
}
Qual é a linha e a classe da NullPointerException?
Em TestaDAO:
dao.adiciona©;
Em ContatoDAO:
stmt = this.conexao.prepareStatement(“insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);”);
a sua classe ContatoDAO não está criando a conexão, pq o construtor está declarado como um método void, e isto não está deixando vc criar uma instancia da conexão, ai ela fica como null e gera a exceção NullPointerException
public void ContatoDAO() throws SQLException {
this.conexao = ConnectionFactory.getConnection();
}
deve estar assim
public ContatoDAO() throws SQLException {
this.conexao = ConnectionFactory.getConnection();
}
Caramba!!! Eu fiquei dias revendo o código! Esqueci que o void não deixa retornar nada!
O interessante é que quando eu testo pra ver se a conexão é !=null (fiz isso após postar aqui), ele retorna false, então não sei o que está na variável conexao (deve ser uma conexao vazia, sei lá).
De qualquer forma, muito obrigado!