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?
A
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>
F
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();
}
L
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.
A
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.
F
felipedamiani
1,2,3 equivale ao ?,?,?
quanto ao cast da data, pode usar
newjava.sql.Date(usuario.getDate().getTime())
A
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.
F
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.
G
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!
F
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?
G
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.