Prepared statement return false mais a linha e inserida. Como solucionar isso
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Prepared statement return false mais a linha e inserida. Como solucionar isso
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:
execute() for equivalente ao executeUpdate(), ou seja, se estivermos realizando um update, insert ou delete, o retorno será false.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.");
}
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