Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Preparedstatement.execute() retorna false

Prepared statement return false mais a linha e inserida. Como solucionar isso

6 respostas

Boa noite, Wesley! Tudo bem, cara? =)

Repare na explicação que o esperado é justamente um false. Mas por que?

A classe PreparedStatement possui vários métodos para executar a query que queremos, são eles:

  • execute()
  • executeQuery()
  • executeUpdate()

Qual a diferença entre cada um deles? Vou começar na ordem inversa...

Primeiramente, o método executeUpdate(), como o próprio nome sugere, é utilizado quando queremos executar um update no banco de dados... Mas não somente isso!! Ele é usado sempre que vamos alterar o banco de dados, seja alterando um registro (update), inserindo um novo (insert), ou até mesmo removendo (delete). Em todos os casos, o retorno desse método é a quantidade de linhas que foram inseridas, removidas ou alteradas.

O outro método, executeQuery(), é utilizando quando nossa intenção é fazer um select para buscar um ou mais registros. Seu retorno é um ResultSet.

O último, execute() é o cara que faz o trabalho tanto do executeUpdate() quanto do executeQuery(), ou seja, ele realiza qualquer coisa no banco... A diferença está no retorno dele, que você já viu que é um boolean:

  • Quando a chamada do execute() for equivalente ao executeUpdate(), ou seja, se estivermos realizando um update, insert ou delete, o retorno será false.
  • Quando a chamada do execute() for equivalente ao executeQuery(), ou seja, se estivermos realizando um select, o retorno será true.

Tá... Mas eu falei tudo isso para que, mesmo? Rs... Repare que o que você está querendo fazer é inserir um registro novo no banco de dados. Dessa forma, ao invocar o método execute(), se tudo ocorrer bem, ele lhe devolverá false, mesmo.

E aí... Agora ficou mais claro?

Espero ter ajudado, mas se ainda estiver com qualquer dúvida, não deixe de perguntar aqui para que possamos continuar ajudando-o! =)

Abraço e bons estudos,

Fábio

Fábio porém ele entra dentro dá sqlexception, blz ele executa tudo mais inseri a linha blz, mais dá certo mais retorna uma exceção

Wesley,

Você poderia postar aqui o seu código e a Stack Trace da Exception que está sendo lançada? =)

Fábio

java.sql.SQLException: Erro ao cadastrar Usuario.
    at br.com.ingenium.dao.UsuarioDAO.cadastrar(UsuarioDAO.java:31)
    at br.com.ingenium.test.usuariodao.UsuarioDAOTest.deveCadastrarUmUsuario(UsuarioDAOTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    @Override
    public void cadastrar(Usuario usuario) throws SQLException{
        if(usuario != null){
            PreparedStatement statement = connection.prepareStatement(SQLUSUARIO.CADASTRAR.getSlq());

            statement.setString(1, usuario.getNome());
            statement.setString(2, usuario.getLogin());
            statement.setString(3, usuario.getSenha());
            System.out.println(statement);
            statement.execute();
            statement.close();
            connection.close();
        }
        throw new SQLException("Erro ao cadastrar Usuario.");
    }
solução!

Opa! Wesley,

O seu código está lançando uma SQLException, pois é o que você está mandando ele fazer. Rs...

Dá uma olhada no seu código... Dentro do método cadastrar(), você tem um if, que verifica se o usuario é diferente de null. Sendo diferente, você cadastra ele no banco de dados. Entretanto, independente de ser diferente ou não de null, você está, logo abaixo, lançando uma SQLException:

throw new SQLException("Erro ao cadastrar usuário");

Ou seja, você cadastra e depois lança o erro com a mensagem!

O que você deveria fazer é colocar seu código dentro de um try/catch, assim:

public void cadastrar(Usuario usuario) throws SQLException {
    try {
        PreparedStatement statement = connection.prepareStatement(SQLUSUARIO.CADASTRAR.getSql());
        statement.setString(1, usuario.getNome();
        statement.setString(2, usuario.getLogin();
        statement.setString(3, usuario.getSenha();

        System.out.println(statement);

        statement.execute();
        statement.close();
        connection.close();
    } catch(SQLException e) {
        throw new RuntimeException ("Erro ao cadastrar usuário", e);
    }
}

Viu a diferença? =)

Essa é apenas uma das formas de se fazer isso... =)

Espero ter ajudado, mas se ainda tiver dúvida, continua postando aqui que continuo a lhe ajudar! =)

Abraço e bons estudos,

Fábio