[Duvida] JDBC

12 respostas
R

Renan
[DUVIDA] JDBC
Bom, estou com um problema, criei uma classe para fazer a conexão com o banco de dados(ConectaBD.java).

public class ConectaBD{
Connection c = null;
private String driverName = "com.mysql.jdbc.Driver";
private String bancoDeDados = "jdbc:mysql://localhost/locadora";
private String user = "admin";
private String password = "teste";
Statement stm;
ResultSet rs;

ConectaBD(){
try{
Class.forName(driverName);
c = DriverManager.getConnection(bancoDeDados,user,password);
stm = c.createStatement();
}
catch(SQLException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
}

Até ai blz, ta conectando…Agora eu gostaria de fazer o seguinte, criar ma classe q vai inserir dados no banco. Criei a classe e fiz ela extender a Conecta BD.

public class Teste extends ConcectaBD{
public void teste() throws SQLException{
try{
rs = stm.executeQuery("Insert into usuarios(user,password)values('teste','teste')");
}
catch(SQLException e){
e.printStackTrace();
}
}

O erro q aparece é o seguinte:

java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:438) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1379) at locadora.Renan.Login.teste(Login.java:18) at locadora.Renan.Teste.main(Teste.java:13) :cry:
alguem pode dar uma luz? :frowning:

12 Respostas

BlackDog

Renan4000:
Renan
[DUVIDA] JDBC
Bom, estou com um problema, criei uma classe para fazer a conexão com o banco de dados(ConectaBD.java).

public class ConectaBD{
Connection c = null;
private String driverName = "com.mysql.jdbc.Driver";
private String bancoDeDados = "jdbc:mysql://localhost/locadora";
private String user = "admin";
private String password = "teste";
Statement stm;
ResultSet rs;

ConectaBD(){
try{
Class.forName(driverName);
c = DriverManager.getConnection(bancoDeDados,user,password);
stm = c.createStatement();
}
catch(SQLException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
}

Até ai blz, ta conectando…Agora eu gostaria de fazer o seguinte, criar ma classe q vai inserir dados no banco. Criei a classe e fiz ela extender a Conecta BD.

public class Teste extends ConcectaBD{
public void teste() throws SQLException{
try{
rs = stm.executeQuery("Insert into usuarios(user,password)values('teste','teste')");
}
catch(SQLException e){
e.printStackTrace();
}
}

O erro q aparece é o seguinte:

java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:438) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1379) at locadora.Renan.Login.teste(Login.java:18) at locadora.Renan.Teste.main(Teste.java:13) :cry:
alguem pode dar uma luz? :frowning:

Renan,

Pelo que vi, em momento nenhum você está passando uma conexão para que o Result Query possa ser executado.

Dê uma olhada em http://www.guj.com.br/article.show.logic?id=7

Abs

pmlm

Uma instrução de INSERT não vai devolver um ResultSet. Em vez de executeQuery, usa o método executeUpdate.

R
então descubri o problema o codigo esta da seguinte forma
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JOptionPane;

public class ConectaBD {

	Connection c = null;
	private String driverName = "com.mysql.jdbc.Driver";
	private String bancoDeDados = "jdbc:mysql://localhost/locadora";
	private String user = "admin";
	private String password = "teste";
	Statement stm;
	
	ConectaBD(){
		try{
			Class.forName(driverName);
			c = DriverManager.getConnection(bancoDeDados,user,password);
			stm = c.createStatement();	
			JOptionPane.showMessageDialog(null, "Conectado!");			
		}
		catch(SQLException e){  
		      e.printStackTrace();
		      JOptionPane.showMessageDialog(null, "Problemas de conexão com o banco de dados");
		} 
		catch(ClassNotFoundException e){
			e.printStackTrace();
		}
	}
}

Agora gostaria de fazer um select:

public class Login extends ConectaBD{
	

	ResultSet rs;
	
	public void teste() throws SQLException{
		String userd = "33d";
		rs = stm.executeQuery("SELECT user from usuarios where user = userd");
		  while(rs.next())  
			    {  
			       String usert = rs.getString("user");  
			       System.out.println("user: " +usert); 
			    }  
	}

O problema é que a query(SELECT user from usuarios where user = userd) nao reconhece a String userd. OBS: ja tentei colocar aspas simples

alguem pode me dar uma luz? :(

R

bom, descubri q o problema é na query ela nao esta reconhecendo a String user

Já tentei isso:

rs = stm.executeQuery("SELECT user from usuarios where user like " + userd );   //ERRO: Unknown column '33d' in 'where clause'
rs = stm.executeQuery("SELECT user from usuarios where user = userd" );          //ERRO: Unknown column 'userd' in 'where clause'
rs = stm.executeQuery("SELECT user from usuarios where user = 'userd'" );         //ERRO: resultado nulo, nao encontra nenhum registro no BD
rs = stm.executeQuery("SELECT user from usuarios where user = '33d'" );            //ERRO: resultado 33d, mais nao usei variavel e o objetivo é usar varial na query
rs = stm.executeQuery("SELECT user from usuarios where: user = 'userd'");         //ERRO: You have an error in your SQL syntax
rs = stm.executeQuery("SELECT user from usuarios where user = \"userd\" ");      //ERRO: resultado nulo, nao encontra nenhum registro no BD
rs = stm.executeQuery("SELECT user from usuarios where user = " +  userd );      //ERRO:  Unknown column '33d' in 'where clause'
rs = stm.executeQuery("SELECT * from usuarios");

Alguem sabe me dizer qual é a maneira certa de fazer essa query? :cry:

O
("SELECT user from usuarios where user = '  " +  userd + "  '    ")

Repare nos ‘pliques’ acho que é assim o nome, aspas simples sei la !!!

R

Opa cara eu consegui ja. tinha perguntado para um amigo meu ele me passou a mesma que voce passou mais é o seguinte

rs = stm.executeQuery("SELECT user from usuarios where user like  ' " + userd + " ' " );

o certo é tirar todos os espaços senão vai retornar zero

rs = stm.executeQuery("SELECT user from usuarios where user like '"+userd+"'" );

valeu obrigado mesmo :wink:

O

Pode crer, ele ia procurar por (espaco)userd(espaco) :D!
Tentei colocar assim pra visualizar melhor so que acabei errando
Abraços

pmlm

Dá uma vista de olhos em PreparedStatement.
É mais seguro e mais rápido.

kemperacc

Renan4000:
Opa cara eu consegui ja. tinha perguntado para um amigo meu ele me passou a mesma que voce passou mais é o seguinte

rs = stm.executeQuery("SELECT user from usuarios where user like  ' " + userd + " ' " );

o certo é tirar todos os espaços senão vai retornar zero

rs = stm.executeQuery("SELECT user from usuarios where user like '"+userd+"'" );

valeu obrigado mesmo :wink:

Amigo, nao faz isso ai nao, da a maior zica…
Deixa o jdbc interpretar a string corretamente, senao voce corre riscos de SQL INJECT, so pra comecar a enumerar os problemas…

É melhor fazer assim:

PreparedStatement ps = connection.prepareStatement("SELECT user from usuarios where user like ?");
        ps.setString(1, "NOME DO USUARIO");
        rs = ps.executeQuery();

Obs - Voce pode colcoar quantas ? quiser, por exemplo:

PreparedStatement ps = connection.prepareStatement("SELECT user from usuarios where user like ? and senha = ? and ativo = ?");
        ps.setString(1, "NOME DO USUARIO");
        ps.setString(2, "9a098a");
        ps.setBoolean(3, true);
        rs = ps.executeQuery();

[]s

Kemper

R
PreparedStatement ps = connection.prepareStatement("SELECT user from usuarios where user like ? and senha = ? and ativo = ?");  
  ps.setString(1, "NOME DO USUARIO");  
  ps.setString(2, "9a098a");  
  ps.setBoolean(3, true);  
  rs = ps.executeQuery();

seria a mesma coisa q isso?

"SELECT user from usuarios where user like 'NOME DO USUARIO' and senha = '9a098a' and ativo = 'true' ";
kemperacc

Renan4000:
PreparedStatement ps = connection.prepareStatement("SELECT user from usuarios where user like ? and senha = ? and ativo = ?"); ps.setString(1, "NOME DO USUARIO"); ps.setString(2, "9a098a"); ps.setBoolean(3, true); rs = ps.executeQuery();

seria a mesma coisa q isso?

"SELECT user from usuarios where user like 'NOME DO USUARIO' and senha = '9a098a' and ativo = 'true' ";

Sim, mas a performance eh melhor porque voce pode declarar a sua PreparedStatement na classe e deixa-la instanciada ja que a string eh fixa, assim quando precisar usa-la voce so passa o parametro, outra coisa, ela ja trata as strings, os numeros, etc.

Por exemplo, isso daria erro do jeito que voce esta fazendo:

String nomeUsuario = "teste 'causa erro";
String senha = "123456";
Boolean ativo = false;

String sql = "SELECT user from usuarios where user like '" + nomeUsuario + "' and senha = '" + senha + "' and ativo = '" + ativo + "' ";

System.out.println(sql);

//Resultado
SELECT user from usuarios where user like 'teste 'causa erro' and senha = '123456' and ativo = 'false' ";

Voce usando PreparedStatment ele ja trata essas aspas e qq outro caractere que possa causar erro na consulta.

LPJava

veja esse post, vai ti ajudar: http://camilolopes.wordpress.com/2009/04/23/inseridorecuperando-informacoes-mysql-com-java-eclipse/

flw!

Criado 9 de maio de 2010
Ultima resposta 10 de mai. de 2010
Respostas 12
Participantes 6