Problemas para deletar dados de uma tabela com JDBC

5 respostas
arthurgon

Olá gente;

Estou tendo problemas para compreender como deletar registros de uma PROCEDURE (MySql)
no JDBC.
A chamada que faço no banco funciona. Na classe não rola.

O código é esse:

public class FuncionarioDAO extends DAOBase {
	///Atributos estáticos dos Métodos principais//////
	
	private static String DELETE = null;
	

	public FuncionarioDAO() {
		this(null);
	}

	public FuncionarioDAO(Connection connection) {
		super(connection);
		///Inserindo Dados nos Campos da Tabela//////
		StringBuffer stringBuffer = new StringBuffer();
      ////Excluindo dados da Tabela////
		if (DELETE == null) {
			stringBuffer.delete(0, stringBuffer.length());
			
                        //BEM AQUI QUE ESTÁ DANDO TRABALHO PARA ENTENDER
                        stringBuffer.append("{ CALL sp_P2DAQ018_excluir()}");
			DELETE = stringBuffer.toString();
                  }
     
         }

        //////METODO UTILIZADO PARA EXCLUIR DADOS DA TABELA funcionarioVO/////
	public boolean excluir(FuncionarioVO funcionarioVO) throws SQLException {

		CallableStatement cs = null;
		Connection conn = null;
		try {
			conn = getConnection();
			cs = conn.prepareCall(DELETE);
			int index = 1;
			/////Chave Composta//////
			cs.setInt(index++, funcionarioVO.getEmpresa());
			cs.setInt(index++, funcionarioVO.getFilial());
			cs.setInt(index++, funcionarioVO.getNumeroRelogio());
			cs.setInt(index++, funcionarioVO.getMatricula());

			int retorno = cs.executeUpdate();

			if (retorno > 0) {
				return true;
			} else {
				return false;
			}
		} finally {
			close(null, cs, conn);
		}
	}

}

Esse é o meu método main:

public static void main(String[] args) {
		
		FuncionarioVO vo = new FuncionarioVO();
		vo.setEmpresa(8);
		vo.setFilial(8);
		vo.setNumeroRelogio(8);
		vo.setMatricula(8);
		
		FuncionarioDAO dao = new FuncionarioDAO();
		
		try {
			
			dao.excluir(vo);
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("Deletado com sucesso!!");
	}
Ele não deleta "nada"!! O que pode estar errado? Se alguem souber e puder ajudar, por favor...fico muito agradecido.

5 Respostas

berg.pb

Cara, sou iniciante em Java, mas percbi uma coisa:

  1. Na classe FuncionarioDAO, vc tem 2 construtor, um simples e um com parametro.

  2. nessa classe, não entendi pq vc criou uma atributo estatico (ou seja constante), q depois vc altera. mas tudo bem.

  3. qdo vc esta instanciando o FuncionarioDAO no main, vc está fazendo sem a alteração da constante DELETE.

  4. Na funcao excluir, chamada no main. tá fazendo a chamada para cs = conn.prepareCall(DELETE), porém, DELETE é [u]null[/u].

Dá uma reolhada se não é isso.

Abraços
Deus abençoe

lucasap2005

2) nessa classe, não entendi pq vc criou uma atributo estatico (ou seja constante), q depois vc altera. mas tudo bem.

  1. qdo vc esta instanciando o FuncionarioDAO no main, vc está fazendo sem a alteração da constante DELETE.

  2. Na funcao excluir, chamada no main. tá fazendo a chamada para cs = conn.prepareCall(DELETE), porém, DELETE é null.

  • Atributo estático não significa que seja constante. Constante seria uma variavel estática e final. Estática significa que é um atributo relativo a classe e não ao objeto, ou seja, não importa quantas vezes vc instancie um objeto FuncionarioDAO, todos esses objetos vão compartilhar a mesma variável estática.

  • Apesar do código não ta uma maravilha, ao chamar o construtor default declarado na classe, ele ao entrar nesse construtor chama o construtor definido com a assinatura FuncionarioDAO(Connection connection), só que ele passa null, entao nao entendi pq ele fez esse construtor recebendo a conexao, sendo que ele passa null, mas tudo bem vai.

  • Por consequencia da entrada no construtor FuncionarioDAO(Connection connection) ele seta algum valor na variavel DELETE. Obs: Não precisa utilizar StringBuffer neste caso, vc está sendo muito xiita. Crie uma String mesmo, ou seja, faça DELETE = “String q vc quiser”.

  • Agora, respondendo ao problema, coloque o erro, ou seja lá oq for que esteja dando ai, pq sem o erro ou sem entender sua procedure, nao tem como saber oq está ocorrendo.

    Tente executar sua procedure assim:

    CallableStatement call = conn.prepareCall(DELETE);  
    //Obs: a sua stored procedure tem q ter os parametros de entrada tipo: sp_P2DAQ018_excluir(?, ?, ?, ?)
    call.setInt(1, funcionarioVO.getEmpresa()); 
    call.setInt(2, funcionarioVO.getFilial());  
    call.setInt(3, funcionarioVO.getNumeroRelogio());  
    call.setInt(4, funcionarioVO.getMatricula());  
    call.registerOutParameter(5, Types.INTEGER); 
       
    call.execute();     
    int retorno = call.get(5);
    

    Espero ter ajudado…Abraços

    eduveks

    StringBuffer não deve ser usado sem mais nem menos, o custo de instanciar esta classe é maior do que concatenar strings simples, StringBuffer é no caso de concatenar varias strings em uma, varias digo muitas mesmo, como ler as linhas de um arquivo texto e colocar dentro de uma StringBuffer ai sim, por exemplo, basicamente sempre que tiver um loop em strings e neste loop fazer muitas concatenações ai usa o StringBuffer, se não há loops então não precisa de StringBuffer. E StringBuilder é melhor que StringBuffer, pois StringBuilder não é thread-safe, por isso é mais rapida, use sempre StringBuilder!

    Para aprender mais sobre String vs StringBuilder vs StringBuffer, estude a bateria de testes que fizemos e as conclusões que chegamos:
    http://www.guj.com.br/posts/list/91384.java
    http://www.guj.com.br/posts/list/91384.java#488817

    Concatenar Strings sempre com String.concat! Em loops usar só uma instância do StringBuilder para concatenar tudo!

    E outra tens ai um Try/Finally isto é fatal, o código não funciona e não sabes por q!? Todo Try é obrigatório ter o Catch! Vc esta omitindo o erro! Se tivesse ai o Catch ou se tirasse o Try vc vai ver logo erro, e saber exatamente qual o problem…

    arthurgon

    Ae galera…funcionou…mas de outra forma.
    Tive que mandar apenas e não mais que um párâmetro pra deletar a Procedure.

    Valeu gente.

    eduveks

    q funcionou eu não duvido, mas se ficou bem feito é outros trezentos!

    espero q tenhas aproveitado e dado atenção as dicas aqui citadas para poder evoluir, pois muitas delas são cruciais para se fazer um código razoável, que se não… Deus me livre ter que mexer um dia no teu código :stuck_out_tongue:

    try sem catch… ui ui ui… da até arrepios :wink:

    Criado 10 de junho de 2008
    Ultima resposta 11 de jun. de 2008
    Respostas 5
    Participantes 4