Prepared statement return false mais a linha e inserida. Como solucionar isso
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