Problema ao tentar Inserir com JDBC

14 respostas
A

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:

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;
	}

Grato a todos.

14 Respostas

J

aonde está o erro, digo, em qual linha, sua IDE o acusa???
o banco está devolvendo algum erro?

A

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

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();
}
L

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.

:wink:

A

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.

F

1,2,3 equivale ao ?,?,?

quanto ao cast da data, pode usar

new java.sql.Date(usuario.getDate().getTime())
A

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

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é

A

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:


java.sql.SQLException: Column count doesn’t match value count at row 1

F

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

A segunda eu já havia tentado, mas a primeira não e foi justamente a primeira quem funcionou.

Obrigado Felipe.

G

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

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

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?

:wink: 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.

Falou!

Criado 21 de maio de 2009
Ultima resposta 22 de mai. de 2009
Respostas 14
Participantes 5