1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

java commit e rollback

Pessoa é a primeira vez que mexo com commit e rollback não sei como aplica direito, tipo tenho um método na minha VIEW que cadastrar clientes (para cadastrar clientes tem que inserir em na tebela clientes e endreço do banco de dados mysql);

quero que se uma das operaçoes cair no exception aconteça de abortar tudo o métoda da view ta assim:

//método para salvar cliente
    private void salvar() throws SQLException {

        String sql = "{CALL ENDERECO_INSERT_CLIENTE(?,?,?,?,?,?,?) }";

        //criando instancias de ClienteBean e EnderecoBean
        ClienteBean cb = new ClienteBean();
        EnderecoBean eb = new EnderecoBean();

        //criando instancias de ClienteDao e EnderecoDao
        ClienteDAO cd = new ClienteDAO();
        EnderecoDAO ed = new EnderecoDAO();

        //testa se campos obrigatrios estao vazios
        if ((TXTNome.getText().equals("")) || (TXTEndereco.getText().equals("")) || (TXTNumero.getText().equals(""))
                || (TXTBairro.getText().equals("")) || (TXTCidade.getText().equals("")) || (FTXTestado.getText().equals(""))
                || (FTXTcnpj.getText().replaceAll("[. . / -]", "").trim().equals("")) & (FTXTcpf.getText().replaceAll("[. . -]", "").trim().equals(""))) {

            JOptionPane.showMessageDialog(null, "Os campos com * são obrigatórios", "Erro", JOptionPane.ERROR_MESSAGE);

        } else {

            //setando valores de cliente e endereco nos seus devidos setters do pacote Bean
            cb.setNome(TXTNome.getText().toUpperCase());
            eb.setCep(FTXTcep.getText().replaceAll("[-]", ""));
            eb.setRua(TXTEndereco.getText().toUpperCase());
            eb.setNumero(Integer.parseInt(TXTNumero.getText()));
            eb.setComplemento(TXTComplemento.getText().toUpperCase());
            eb.setBairro(TXTBairro.getText().toUpperCase());
            eb.setCidade(TXTCidade.getText().toUpperCase());
            eb.setEstado(FTXTestado.getText().toUpperCase());
            cb.setTelefone(FTXTtelefone.getText().replaceAll("[()-]", "").trim());
            cb.setCelular(FTXTcelular.getText().replaceAll("[()-]", "").trim());
            cb.setEmail(TXTEmail.getText());
            cb.setCpf(FTXTcpf.getText().replaceAll("[.-]", "").trim());
            cb.setCnpj(FTXTcnpj.getText().replaceAll("[./-]", "").trim());
            cb.setRg(TXTRg.getText().toUpperCase());

            //inserir na tabela clientes
            cd.insert(cb);

            //inserindo na tabela endereço
            ed.insert(eb, sql);

            //mostra mensagem de cadastro realizado
            JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso");

            //fechando tela de cadastro
            dispose();

            //invoca tela principal
            new JF_Tela_Principal_Clientes().setVisible(true);

        }

    }

Na minha classe DAO tenho os métodos que se "comunicao" com o banco de dados

para inserir em cliente

//método para inserir na table clientes
    public void insert(ClienteBean cb) throws SQLException {

        //querry com campos a serem inseridos        
        String sql = "{CALL clientes_insert(?,?,?,?,?,?,?)}";

        try (PreparedStatement ps = con.prepareStatement(sql)) {

            ps.setString(1, cb.getNome());
            ps.setString(2, cb.getTelefone());
            ps.setString(3, cb.getCelular());
            ps.setString(4, cb.getEmail());
            ps.setString(5, cb.getCnpj());
            ps.setString(6, cb.getCpf());
            ps.setString(7, cb.getRg());

            ps.execute();

            con.commit();

        } catch (Exception e) {

            con.rollback();

            JOptionPane.showMessageDialog(null, e.getMessage());

        }

    }

E na minha Classe DAO de endereco tenho esse metodo aqui para inserir em endereço

public void insert(EnderecoBean eb, String procedure) throws SQLException {

        try (CallableStatement ps = con.prepareCall(procedure)) {

            ps.setString(1, eb.getRua());
            ps.setInt(2, eb.getNumero());
            ps.setString(3, eb.getComplemento());
            ps.setString(4, eb.getBairro());
            ps.setString(5, eb.getCidade());
            ps.setString(6, eb.getEstado());
            ps.setString(7, eb.getCep());

            ps.execute();

            con.commit();

        } catch (Exception e) {

            con.rollback();

            JOptionPane.showMessageDialog(null, e.getMessage());

        }

    }

Só avisando que nos método construtores das duas Clases DAO eu abro a conexao via jdbc e depois dou um

con.autoCommit(false);

Se vocês tiverem alguma dica se estou fazendo certo ou não ou se puderem indicar um artigo ou video aula fico muito agradecido

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java ou faça a sua própria pergunta.