Boa noite a todos, acredito que seja a minha duvida mais cabulosa que tenho. Estou tendo problemas ao tentar inserir com JDBC. Até já uso hibernate e JPA mas me veio uma necessidade urgente de se trabalhar com JDBC e por tal motivo tenho que aprender pelo menos o básico.
aonde está o erro, digo, em qual linha, sua IDE o acusa???
o banco está devolvendo algum erro?
anderson.bonavides
O erro vai por conta da query que por algum motivo está errada.
Segue o erro:
<blockquote>java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:412)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1297)
at br.com.projetojsp.dao.UsuarioImpl.cadastrar(UsuarioImpl.java:22)
at br.com.projetojsp.action.UsuarioActions.cadastrarUsuario(UsuarioActions.java:23)
at br.com.projetojsp.servlet.ServletControle.doPost(ServletControle.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)</blockquote>
felipedamiani
Cara, o erro está aqui:
statement.executeQuery(query);
para insert, você deve usar statement.executeUpdate() ou execute()
executeQuery() somente para select
para insert acho que seria melhor você usar PreparedStatement, segue seu exemplo com ele abaixo:
publicbooleancadastrar(Usuariousuario)throwsSQLException{
PreparedStatementps=null;Connectionconn=ConnectionFactory.getConnection();Stringsql="INSERT INTO usuario values (?,?,?)";ps=conn.prepareStatement(sql);ps.setString(1,usuario.getNome());ps.setString(2,usuario.getSexo());ps.setDate(3,usuario.getDate());ps.executeUpdate();
}
lrgalego
Dando uma checada da api
[url]http://java.sun.com/javase/6/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)[url]
você vai ver que tem um método específico para atualizações, com tipo de retorno diferente e tudo.
Concordo com vc que executeQuery é um nome infeliz, mas essas classes mais velhas do Java são assim, temos que lembrar que o javadoc é nosso amigo =)
Acho que com esse método vc deve resolver o seu problema.
Uma outra dica que eu te dou é arrumar um modo com menos probabilidade de erro na construção dessas strings das queries.
O exemplo do PreparedStatment acima já está bem melhor.
E se possível use injeção de dependencia ao invez desse objeto que traz a sua conexão.
anderson.bonavides
E como fica esta parte do código, os números 1,2 e 3 oq significa?
Bem esse ps.setDate(3, usuario.getDate()); tbm da problemas, ele pede pra converter para outra classe Date do pacote java.sql.
Quando executa da ClassCastException, ou seja, não da para fazer cast.
felipedamiani
1,2,3 equivale ao ?,?,?
quanto ao cast da data, pode usar
newjava.sql.Date(usuario.getDate().getTime())
anderson.bonavides
Bem vendo tudo q foi passado estou percebendo que vou ter q ficar passando o ID pro banco, correto?
o auto_incremente não ta funcionando, não sei oq pode estar errado.
felipedamiani
Olá, é banco mysql? Se sim o exemplo que postei acima funciona se o auto-incremento estiver configurado corretamente, se for um outro banco por exemplo postgres, tem que criar uma sequencia:
A segunda eu já havia tentado, mas a primeira não e foi justamente a primeira quem funcionou.
Obrigado Felipe.
gregorioenrico
Anderson,
pra usar o recurso do auto_increment, vc não precisa mandar o ID. E precisa dizer quais são as colunas que serão incluídas. Não basta dizer os valores. Como disse o Felipe, o SQL deveria ser assim:
Assim, o valor do campo ID é criado automaticamente.
Se não disser as colunas que vc está inserindo, dá o erro que vc citou justamente pq, sem dizer quais colunas vai inserir, ele vai esperar os quatro valores que devem existir na tabela:
Abraço!
felipedamiani
gregorioenrico:
Anderson,
pra usar o recurso do auto_increment, vc não precisa mandar o ID. E precisa dizer quais são as colunas que serão incluídas. Não basta dizer os valores. Como disse o Felipe, o SQL deveria ser assim:
Assim, o valor do campo ID é criado automaticamente.
Se não disser as colunas que vc está inserindo, dá o erro que vc citou justamente pq, sem dizer quais colunas vai inserir, ele vai esperar os quatro valores que devem existir na tabela:
Abraço!
qual a diferença desse sql para a segunda opção que eu passei pra ele?
gregorioenrico
felipedamiani:
gregorioenrico:
Anderson,
pra usar o recurso do auto_increment, vc não precisa mandar o ID. E precisa dizer quais são as colunas que serão incluídas. Não basta dizer os valores. Como disse o Felipe, o SQL deveria ser assim:
Assim, o valor do campo ID é criado automaticamente.
Se não disser as colunas que vc está inserindo, dá o erro que vc citou justamente pq, sem dizer quais colunas vai inserir, ele vai esperar os quatro valores que devem existir na tabela:
Abraço!
qual a diferença desse sql para a segunda opção que eu passei pra ele?
por isso eu disse:
Como disse o Felipe…
só quis tentar explicar pq o segundo SQL que vc citou é o mais apropriado no caso do Anderson.