Não consigo excluir ou atualizar dados do banco de dados usando JDBC

7 respostas
D

Estou seguindo uma das apostilas da Caelum (Java para web, pag 37) estou praticando alguns exercícios opcionais, onde tem os metodos inserir, listar, atualizar e deletar.
Eu fiz do jeitinho que está la na página porém quando chamo o método deletar no método main mostra um erro java.lang.NullPointerException. sou novo em programação.

segue o código:
package br.com.caelum.jdbc.modelo;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.jdbc.ConnectionFactory;

public class ContatoDao {
	private Connection connection;
	private Contato contato;

	public ContatoDao() {
		
		
		this.connection = new ConnectionFactory().getConnection();

	}

	
	
	public void adiciona(Contato contato) throws SQLException {
		String sql = "insert into contatos" + "(nome, email, endereco, datanascimento)" + "values (?,?,?,?)";
		try {

			// prepared statement para inserçã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()));

			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			connection.close();
		}
	}

	public List<Contato> getLista() throws SQLException {

		List<Contato> contatos = new ArrayList<>();

		PreparedStatement stmt;
		try {
			stmt = connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				contato = new Contato();
				contato.setId(rs.getLong("id"));
				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);

				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		} catch (SQLException e) {
			throw new RuntimeException(e);
			
		} finally {
			
			connection.close();
		}

	}

	public void altera(Contato contato) {
		String sql= "update contatos set nome=?, email=?, endereco=?, "+ "dataNascimento=? where id=?"; 
		try {
			PreparedStatement stmt = connection.prepareStatement("update from contato where id=?");
			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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void remove (Contato contato){
		try {
			
			PreparedStatement stmt = connection.prepareStatement("delete"+"from contatos where id=?"); 
			
			stmt.setLong(1, contato.getId());
			stmt.executeQuery();
			stmt.close();
		} catch (Exception e) {
			System.out.println("houve erro"+e);
		}
		
		
	}
}

package br.com.caelum.jdbc.teste;

import java.sql.SQLException;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.modelo.ContatoDao;

public class TestaInsere {

	public static void main(String[] args) throws SQLException {
		Contato contato = new Contato();
		ContatoDao dao = new ContatoDao();
		Scanner sc = new Scanner(System.in);
		
		System.out.println("digite a opção\n"
				+ "1- cadastrar\n"
				+ "2- listar\n"
				+ "3- remover");
		int op=sc.nextInt();
		
		switch (op){
		case 1:
			// preenche os valores
			System.out.println("digite o nome");
			String nome = sc.next();

			System.out.println("digite o email");
			String email = sc.next();

			System.out.println("digite o endereço");
			String endereco = sc.next();

			contato.setNome(nome);
			contato.setEmail(email);
			contato.setEndereco(endereco);
			contato.setDataNascimento(Calendar.getInstance());
			
			dao.adiciona(contato);
			System.out.println("gravado");
			break;
			
		case 2:
			List<Contato> contatos = dao.getLista();
			
			
			
			for (Contato contat : contatos){
				System.out.println("nome"+contat.getNome());
				System.out.println("email"+contat.getEmail());
				System.out.println("endereco"+contat.getEndereco());
				System.out.println("dataNascimento"+contat.getDataNascimento()+"\n");
				
			}
			break;
		case 3:
//			não sei como alterar um contato passando o id	
			break;
		case 4:
//			não sei como deletar um contato
                       break;
		case 0:
			
		}
		
			
		
		
		
		
		
		
		

	}

}

7 Respostas

JulioCesarSF

Deletar: Você tem de passar um objeto do tipo Contato com o id preenchido. (id do que você quer deletar lá no banco).
Atualizar: Você passar um objeto do tipo Contato com id do contato para alteração com os outros atributos preenchidos.

D

somente o metodo remove

public void remove (Contato contato //este parâmetro ja contem o id certo?) {
try {

PreparedStatement stmt = connection.prepareStatement("delete"+"from contatos where id=15" ); 
		
		stmt.setLong(1, contato.getId() //este aqui eu ja recupero o id certo?);
		stmt.executeQuery();
		stmt.close();
	} catch (Exception e) {
		System.out.println("houve erro"+e);
	}
	
	
}

}

e para testar so consigo pensar nisto:

case 3:

dao.remove(contato);

break;

no meu banco existe 4 registros com id 12, 13, 14, 15

quando tento remover aparece o errojava.lang.NullPointerException

JulioCesarSF

Sim, já recupera o id.

Ali na String com o sql, coloca um espaço entre delete e from também. E não esqueça que é “id=?”.

Para deletar seria algo assim:

Contato contato = new Contato(1); //construtor de contato só com o id no caso.

dao.remove(contato);

Ta dando nullpointer pois você está chamando um objeto que não existe na memória.

P

Ei man, pra facilitar a sua vida sugiro você fazer um curso de SQL e banco de dados relacional, que é esse que voçê ta usando. tem um monte de material bacana na internet.
Abs.

D

blz @JulioCesarSF obrigado eu vou tentar aqui, quaquer coisa digo algo

D

vlw @programador1225, obrigado pela dica

D

Blz consegui! Obg

Criado 28 de maio de 2017
Ultima resposta 29 de mai. de 2017
Respostas 7
Participantes 3