Erro com o simples Consulta Parametrizada - Java/ SQL
-
14-11-2019 - |
Pergunta
Na sequência de uma das minhas perguntas anteriores para fazer com método de design Foi-me sugerido implementado meu consultas SQL como uma consulta parametrizada como oposição a uma simples seqüência de caracteres.
Eu nunca usei consultas parametrizadas antes, então eu decidi começar com algo simples, faça o seguinte Selecione instrução:
String select = "SELECT * FROM ? ";
PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "person");
Isso me dá o seguinte erro: "[SQLITE_ERROR] erro de SQL ou falta de banco de dados (perto de "?":erro de sintaxe)"
Eu tentei uma versão modificada que tem critérios adicionais;
String select = "SELECT id FROM person WHERE name = ? ";
PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "Yui");
Esta versão funciona bem, no meu primeiro exemplo, eu estou faltando o ponto de consultas parametrizadas ou sou eu que construí-las incorretamente?
Obrigado!
Solução
Simplesmente coloque, SQL liga não é possível vincular tabelas, apenas a cláusula where valores.Há alguns sob o capô razões técnicas para isso "compilar" instruções SQL preparadas.Em geral, as consultas parametrizadas foi projetado para tornar o SQL mais segura, impedindo que a injeção de SQL e tinha um lado de benefício de fazer consultas mais "modular" bem, mas não ao ponto de ser capaz de definir dinamicamente o nome de uma tabela (uma vez que é assumido que você já sabe o que a tabela vai ser).
Outras dicas
Se você deseja que todas as linhas da tabela PESSOA, aqui está o que você deve fazer:
String select = "SELECT * FROM person";
PreparedStatement ps = connection.prepareStatement(select);
Variável de ligação não se vincular dinamicamente a tabela de nomes como os outros mencionados acima.Se você tem o nome da tabela vindo para o seu método como uma variável, você pode construir toda a consulta, conforme abaixo:
String select = "SELECT * FROM " + varTableName;
PreparedStatement ps = connection.prepareStatement(select);
Consultas parametrizadas são para consultar nomes de campo - e não o nome da tabela!
Instruções preparadas ainda SQL e precisa ser construído com a cláusula where apropriada;i.e.onde x = y.Uma das suas vantagens é que eles são analisados pelo SGBDR quando visto pela primeira vez, ao invés de toda vez que eles são enviados, o que acelera execuções subseqüentes do mesmo consulta com diferentes vincular valores.