Dúvida no insert

7 respostas
Zeed01

Criei o método abaixo para inserir registros no BD:

public static void insereUsuario(Usuario user){
        try {
            conecta();  
            stp = conn.prepareStatement("Insert into Usuario values(? , ?, ?, ?, ?)");
            
            stp.setString(1,null);
            stp.setString(2, user.getUsusLogin());
            stp.setString(3, user.getUsusPassoword());
            stp.setString(4, user.getUsusNome());
            stp.setString(5, String.valueOf(user.getUspeId().getPepeID()));
            
            stp.executeUpdate();
            conn.commit();
            
        } catch (SQLException ex) {
            try {
                conn.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            ex.printStackTrace();
        }
    }

Estou trabalhando com autocommit(false), por esse motivo coloquei a linha conn.commit();
Minha dúvida é sobre a linha conn.rollback(); na hora de compilar tive que colocar o try/catch para apanhar uma eventual Exception do rollback… do jeito que fiz esta correto ?

Obrigado.

[]s

7 Respostas

marciosantri

Olhando superficialmente, o que você fez funciona…
Só que tratar erros simplesmente com printStackTrace não é uma boa prática. Se der um erro na inserção, o que seu código deverá fazer? Dar uma mensagem, interromper um processo, etc, etc. Do jeito que está, dá um rollback e fica por isto mesmo.

P

Cara olhando rapidão creio que falta o seguinte trecho de código no seu exemplo:

stp.addBatch()
//Troque o seu stp.executeUpdate por:
stp.executeBatch();

Pois pelo que me consta vc tem que dar esse add pra depois executar tudo.
Qualquer coisa posta aí.
O seu executeUpdate só serviria que se fizesse de outra forma o insert. Mas dessa forma que vc fez eu prefiro pois previne contra injecção de código arbitrário no seu sistema.

Flw.

Zeed01

petter:

Na verdade o insert como eu fiz esta funcionando.
Só estou na duvida sobre try/catch que tive que colocar na linha conn.rollback().
Se é assim mesmo, quer dizer, se tenho que realmente colocar esse try/catch ou se estou fazendo algo errado.

Sobre qual outra forma de insert você esta falando ? Pode me explicar ?

Eu não entendi qual a diferença na prática entre o executeUpdate e o executeBatch…

marciosantri:

Na verdade esse é um projeto que estou desenvolvendo pra estudo mesmo. Obrigado pela dica sobre o tratamento do erro.
Você acha que posso colocar uma mensagem para o usuário com o erro, por exemplo: “Campo nome não pode ficar em branco. Registro não foi salvo.” e dai dar o rollback ?

TangZero

Está certo…

quando você efetua alguma operação com o Banco de Dados, pode ser lançada uma Exception…
Então um rollBack, que interagi com o Banco de Dados, pode lançar uma SQLException…

OBS.: Apenas troque as linhas que imprimem o StackTrace por algo mais legal…

System.out.println("Erro ao inserir usuário na Base de Dados!");

assim é “melhorzinho”…
melhor ainda é logar o erro…

:lol:

P

Cara sobre o se try tá certo, como o pessoal daqui já falou basta vc deixar mais amigável para o usuário a mensagem em caso de erro.

Agora sobre o seu insert é o seguinte, presumisse que o usuário irá digitar dados para fazer uma inserção no banco sobre um usuário com certo grau de privilégios, logo, se o cara for metido a besta e tentar fazer isso em algum campo do seu formulário que vá ser inserido no seu insert:

; drop all databases;

Ele pode interromper o processamento do seu insert e passar um comando dele para no caso dropar toda a base de dados (tá pessoal, sei que o cara para fazer isso depende de todos os privilégios para o usuário habilitados pelo DBA, mas o exemplo serve para demonstrar o tamanho do barulho que pode dar passar isso sem cuidado).
Essa técnica chama-se SQL Injection e apesar de antiga, pode acreditar ele ainda ocorre muito por aí, sei disso pois minha linha de pesquisa acadêmica é sobre programação segura, e para passar um SQL Injection como lhe disse o seu sistema pode rodar sob a rede mais segura do mundo que o cara vai conseguir sacanear o sistema, pois isso ocorre em uma camada acima da rede.
Do jeito que te falei impede o cara de injetar código no seu sistema, o cara pode passar ;, ', “” e mais o que for, pois ao invés de executar como um comando ele “entende” como uma string e joga tudo DENTRO DO SEU INSERT, dá apenas um erro de SQL INCORRETO, só isso e nada mais.

Basicamente é isso que ocorre.

Zeed01

Eu não entendi como o cara iria interromper o meu processamento e executar um comando SQL dele…

Isso é possível com o executeBatch ou com o executeUpdate ?

Porque mesmo que o usuário não tenha privilégio para dropar as tabelas provavelmente ele vai ter privilégio para dar um delete .

Acredito que nos casos reais a informação seja muito mais preciosa do que a estrutura do banco, que é facilmente recuperável…

Um abraço.

P

Se vc observar antes do drop o cara passa um “;”, é isso que vai interromper o processamento e começar o novo (claro que isso depende um pouco do banco e versão utilizados).

Quanto ao executeUpdate não sei ao certo, eu sei que se vc jogar as variáveis direto no select dá pro cara injetar código sim, e com o executeBatch vc impede isso, mas misturando os dois não testei aqui não.

Criado 14 de junho de 2007
Ultima resposta 15 de jun. de 2007
Respostas 7
Participantes 4