Java básico - dúvida excluir

8 respostas
A

Oi pessoal, boa noite, é minha primeira postagem no forum então desculpem caso seja no local incorreto. Estou no exercício 2.17 da apostila FJ21 da caelum e surgiu uma dúvida no método de remover da classe ContatoDAO

public void remover(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);
	}
}

Uma coisa não ficou muito clara para mim, devo passar um objeto do tipo Contato para excluir? Como ele vai saber qual contato excluir? E por que isso que coloquei em uma classe de teste não dá certo?

Contato contato1 = new Contato();
ContatoDAO dao = new ContatoDAO();
		
contato1.getNome();
contato1.getEmail();
contato1.getEndereco();
contato1.getDataNascimento();

dao.remover(contato1);

8 Respostas

I

Provavelmente esse contato vai vir com um id de acordo com a escolha de uma tela por exemplo

D

Seguinte, você vai excluir um linha de sua tabela, geralmente pela sua chave primaria (que é muito comum um campo com o nome de id).

Então, você precisa informar no seu método de exclusão esse id. Por vir da classe carregada do seu banco de dados por um método find, ou pode ser somente o id.

Exemplo:

Seu código:

public void remover(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);
	}
}

ou

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

Ou seja, na sua DAO pode ter os dois métodos para que você tenha as duas situações de exclusão.

A sua tela por exemplo vai ter um ponto fundamental para exclusão, geralmente carregamos o registro na tela e colocamos um botão Excluir (ou remover, ou deletar, etc.) e passamos para a rotina criada o id e chamamos:

dao.remover(id);

Então, tudo vai depender de como fará a sua tela

J

Ou ainda colocar o metodo como boolean

public boolean remover(Long id){
	try{
		PreparedStatement stmt = connection
                  .prepareStatement("delete from contatos where id = ?");
		stmt.setLong(1, id);
		if ( stmt.executeUpdate() == 1 ) {
                return true;
            } else {
                return false;
            }
		
	}catch (SQLException e){
		//throw new RuntimeException(e);
                return false;
	}
      
}

///e depois

if (dao.remover(id)) {
//excluido
} // else?
I

Se vc tá lancando uma exception quando cai no catch, não vejo necessidade de o mesmo retornar um boolean.

J

É que tinha copiado do Dragon, agora corrigi

I

Particularmente eu prefiro void, e lançando uma Exception, mas tomando como caso o seu

public boolean remover(Long id) {
	boolean retorno = false;
    try{
		PreparedStatement stmt = connection
                  .prepareStatement("delete from contatos where id = ?");
		stmt.setLong(1, id);
		if ( stmt.executeUpdate() == 1 )
                   retorno = true;
	}
    catch (SQLException e){
		//throw new RuntimeException(e);
	}
    return retorno;
}
D

@igomes

Não seria melhor simplificar

disso:

if ( stmt.executeUpdate() == 1 ) {
           retorno = true;

para:

retorno = ( stmt.executeUpdate() == 1 ) ;

Sinceramente eu prefiro com retorno de um boolean, porque o usuário pode trabalhar isso no seu código,

A

Muito obrigado galera, foi bastante útil as explicações, então ele exclui um registro da tabela, no caso o último se não for passado o ID do contato. Vocês comentaram sobre tela, mas por enquanto tudo está sendo back-end já que estou aprendendo. Abraços galera.

Criado 28 de julho de 2016
Ultima resposta 1 de ago. de 2016
Respostas 8
Participantes 4