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.
Minha query: query = "INSERT INTO usuario VALUES ('" + usuario.getNome() + "'," + "'" + usuario.getSexo() + "'," + usuario.getData() + ")";
Segue meu método q faz a inserção:
[code] public Boolean cadastrar(Usuario usuario) {
Boolean resultado = true;
String query = null;
query = “INSERT INTO usuario VALUES (’” + usuario.getNome() + “’,” + “’” + usuario.getSexo() + “’,” + usuario.getData() + “)”;
try {
conexao = new Conexao().getConexao();
statement = conexao.createStatement();
statement.executeQuery(query);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return resultado;
}[/code]
Grato a todos.
aonde está o erro, digo, em qual linha, sua IDE o acusa???
o banco está devolvendo algum erro?
O erro vai por conta da query que por algum motivo está errada.
Segue o erro:
[quote]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)[/quote]
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:
public boolean cadastrar(Usuario usuario) throws SQLException {
PreparedStatement ps = null;
Connection conn = ConnectionFactory.getConnection();
String sql = "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();
}
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.

E como fica esta parte do código, os números 1,2 e 3 oq significa?
ps.setString(1,usuario.getNome());
ps.setString(2, usuario.getSexo());
ps.setDate(3, usuario.getDate());
}
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.
1,2,3 equivale ao ?,?,?
quanto ao cast da data, pode usar
new java.sql.Date(usuario.getDate().getTime())
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.
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:
CREATE SEQUENCE nome_da_sequencia
INCREMENT 1
MINVALUE 1
MAXVALUE 999999999999999
START 1
CACHE 1;
para pegar o valor dela:
select nextval('nome_da_sequencia')
Até
Na verdade o banco é MySQL sim.
Aqui está o script:
CREATE TABLE `projetojsp`.`usuario` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) NOT NULL,
`sexo` VARCHAR(45) NOT NULL,
`data` DATE NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
Aqui está um trecho do método:
sql = "INSERT INTO usuario VALUES (?,?,?)";
preparedStatement = conexao.prepareStatement(sql);
preparedStatement.setString(1, usuario.getNome());
preparedStatement.setString(2, usuario.getSexo());
preparedStatement.setDate(3, new Date(usuario.getData().getTime()));
preparedStatement.executeUpdate();
E por fim o erro:
[quote]
java.sql.SQLException: Column count doesn’t match value count at row 1[/quote]
Ahh, blz…
não me lembro direito como funciona o increment do mysql, mais acho que uma das formas abaixo deverá funcionar:
sql = "INSERT INTO usuario VALUES (?,?,?,?)";
preparedStatement = conexao.prepareStatement(sql);
preparedStatement.setString(1, 0);
preparedStatement.setString(2, usuario.getNome());
preparedStatement.setString(3, usuario.getSexo());
preparedStatement.setDate(4, new Date(usuario.getData().getTime()));
preparedStatement.executeUpdate();
ou
sql = "INSERT INTO usuario (nome,sexo,data) VALUES (?,?,?)";
preparedStatement = conexao.prepareStatement(sql);
preparedStatement.setString(1, usuario.getNome());
preparedStatement.setString(2, usuario.getSexo());
preparedStatement.setDate(3, new Date(usuario.getData().getTime()));
preparedStatement.executeUpdate();
eu usaria a segunda…
Até
A segunda eu já havia tentado, mas a primeira não e foi justamente a primeira quem funcionou.
Obrigado Felipe.
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!
[quote=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![/quote]
qual a diferença desse sql para a segunda opção que eu passei pra ele?
[quote=felipedamiani][quote=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![/quote]
qual a diferença desse sql para a segunda opção que eu passei pra ele?[/quote]
por isso eu disse: [quote]Como disse o Felipe…[/quote]
só quis tentar explicar pq o segundo SQL que vc citou é o mais apropriado no caso do Anderson.
Falou!