UPDATE/DELETE métodos

Pessoal , primeiramente boa noite a todos.
vou tentar resumir minha dúvida. Estou fazendo uns exercicios da apostila , aonde eu encontrei um pouco de dificuldade para entender o metodo de ALTERAR e REMOVE (update e delete), o insert foi bastante tranquilo , porem como faço para excluir um contato do banco e alterar no código abaixo e oque devo passar pro parametro ? Segue o código.

contato.java

[code]package br.com.walter.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;
}

}[/code]

ContatoDAO.java

[code]package br.com.walter.jdbc.dao;

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.walter.jdbc.ConnectionFactory;
import br.com.walter.jdbc.modelo.Contato;

public class ContatoDAO {

private Connection connection;

public ContatoDAO() {
	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 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();

		// fecha conexao
		stmt.close();

	} catch (SQLException e) {

	}
}

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 do banco
			Contato contato = new Contato();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

			// montando a data
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);

			// adicionando o contato a lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

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());

		// excutar
		stmt.execute();

		// fechar a conexao
		stmt.close();

	} catch (SQLException e) {
		throw new RuntimeException(e);
	}

}

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);
	}
}

}[/code]

TestaInsere.java

[code]package br.com.walter.testes;

import java.util.Calendar;

import br.com.walter.jdbc.dao.ContatoDAO;
import br.com.walter.jdbc.modelo.Contato;

public class TestaInsere {

public static void main(String[] args) {
	
	Contato contato = new Contato();
	contato.setNome("Walter Aragão");
	contato.setEmail("walteracf@gmail.com");
	contato.setEndereco("Rua São José nº 604 Vila São Luis - Dc - RJ");
	contato.setDataNascimento(Calendar.getInstance());
	
	//grave essa conexao
	ContatoDAO dao = new ContatoDAO();
	
	//método elegante
	dao.adiciona(contato);
	
	System.out.println("Gravado !");

	//dao.remove(contato);
	
}

}[/code]

OBS: tentei o dao.remove(contato) , porem nao removeu … eu ja tinha cadastrado esse contato no banco , cadastrei dnv e tentei excluir porem no banco consta 2 cadastros. E no update eu queria mudar só mo e-mail por exemplo , como faço ? E se eu quiser mudar tudo ?

Desde já obrigado !

seu metodo remove o contato pelo id

PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?"); stmt.setLong(1, contato.getId());
Na classe TestaInsere ta faltando setar o id;

Contato contato = new Contato(); contato.setNome("Walter Aragão"); contato.setEmail("walteracf@gmail.com"); contato.setEndereco("Rua São José nº 604 Vila São Luis - Dc - RJ"); contato.setDataNascimento(Calendar.getInstance()); contato.setId(1l); // faltou isso

mesmo no banco de dados sendo auto incremento ?

Sim, mesmo sendo auto_increment.

public void remove(Contato contato){  //aqui você está passando um objeto e não uma variável do tipo, por exemplo, Integer.
        try{  
        PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?"); // aqui a condição WHERE está comparando valores inteiros e não objeto
        stmt.setLong(1, contato.getId());  
        stmt.execute();  
        stmt.close();  
        }catch(SQLException e){  
            throw new RuntimeException(e);  
        }  
    }

Poderia ficar assim:

public void remove(int codigo){
        try{  
        PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?");
        stmt.setLong(1, codigo);  
        stmt.execute();  
        stmt.close();  
        }catch(SQLException e){  
            throw new RuntimeException(e);  
        }  
    }

Espero ter ajudado.

O campo ID sendo autoincremento não tem mesmo porque passá-lo na hora de inserir. Você tá certo sobre isso. Agora, porque seus métodos remove() e altera() não funcionam… tenho uma sugestão: verifique se esse contato que vc passa como parâmetro está válido. coloque um System.out.println(contato.getId()) antes do stmt.execute() e veja se é mostrado um id que existe mesmo no banco. Ah, e olha… não fiz um teste, mas para instruções de insert, delete e update eu costumo usar o stmt.executeUpdate()…