Porque PreparedStatement não deixa escolher tabela?

5 respostas
WRYEL

Acabei de dar uma olhada num tutorial aqui do guj sobre PreparedStatement e parti para os teste.

http://www.guj.com.br/java.tutorial.artigo.115.1.guj

Até ai nada demais, funciono que foi uma maravilha.

Porem, quando eu tentei fazer [antes de mais nada uns metodos da minha classe]:

public boolean createPreparedStatement(String sql){
		try{
			this.statement = this.connection.prepareStatement(sql);
			return true;
		} catch(Exception e){
		
		}
		return false;
}

... Fora da classe

mysql.createPreparedStatement("SELECT ? FROM usuarios");
mysql.statement.setString(1, "user");

//este de cima roda que é uma eleza
//se eu tentar fazer esta de baixo da pau.

mysql.createPreparedStatement("SELECT * FROM ?");
mysql.statement.setString(1, "usuarios");

ResultSet usuarios = mysql.statement.executeQuery();

ideias ? :smiley:

5 Respostas

francislon

Rpz…
Provavelmente o PreparedStatement só aceite que vc especifique apenas colonas com o ‘?’;

kapa01

estou tendo o mesmo problema, mas com o
select * from tabela where nome like ‘%?%’
se eu tirar o ? e colocar qualquer letra funciona

ronnypeterson

Kapa01,

ao inves de vc colocar os % no select coloqueo no atributo a ser enviado para ‘?’

exemplo:

String teste = “Ronny”;
teste = “%”+teste+"%"

Espero ter ajudado.

–Ronny

victorwss

rp.guimaraes:
Kapa01,

ao inves de vc colocar os % no select coloqueo no atributo a ser enviado para ‘?’

exemplo:

String teste = “Ronny”;
teste = “%”+teste+"%"

Espero ter ajudado.

–Ronny

http://speedydev.wordpress.com

Não faça isso. Olha só o problema que você ganha:
No seu código tem isso:
String sql = “SELECT COLUNA FROM TABELA WHERE NOME LIKE '%” + nomeDigitado + “%’”;
Daí o usuário digita isso:
xxx’; DELETE FROM TABELA; – hahaha, se fu mané, perdeu playboy!

Enfim, criar SQLs via concatenação de strings abre uma falha de segurança. Não faça isso.

Para o caso do like, você pode tentar isso:
statement.setString(1, “%” + valorDaColuna + “%”);

T

Um PreparedStatement é uma interface com um recurso do seu banco de dados que permite deixar queries pré-compiladas.
Normalmente, para queries pré-compiladas, somente é possível alterar os valores das colunas, mas não o nome delas ou pior, o nome da própria tabela. Quando o driver do banco vai falar com o banco usando uma query pré-compilada, ele só precisa mandar um identificador dessa query, e os valores (em binário) identificados pelos parâmetros, o que torna a consulta muito mais rápida.

Criado 30 de outubro de 2008
Ultima resposta 31 de out. de 2008
Respostas 5
Participantes 6