O que é PreparedStatement e para que serve?

Fala galera,

to iniciando meus estudos sobre java com as apostilas da Caelum fj-11 e fj-21 e me deparei com essa dúvida. Pesquisei no fórum mas não consegui entender o que é e qual a finalidade da Interface(??) PreparedStatement. Se alguém puder me ajudar eu agradeço.

Obs.: Não sei se já existe o tópico, li alguns mas não entendi por isso abri um artigo novo

Se você viu um comando SQL, vai perceber que normalmente os comandos (SELECT, INSERT, UPDATE etc.) têm uma parte fixa e uma parte variável. Por exemplo,

SELECT * FROM alunos WHERE nome = ‘José’

ou

SELECT * FROM alunos WHERE nome = ‘Maria’

Você viu que só varia o nome ‘José’ ou ‘Maria’.

A maior parte dos bancos de dados SQL trabalha melhor se você, em vez de ficar montando sempre consultas SQL diferentes, você passar uma consulta FIXA e variar só os dados. A tal “consulta fixa” é o que deu motivação para o PreparedStatement. Por exemplo, eles sempre entendem algo parecido com isto aqui:

SELECT * FROM alunos WHERE nome = ?

onde ? é ‘José’ ou ‘Maria’ ou o que você precisar consultar.

Note que são os dados que variam, não o nome das colunas. Então isto aqui:

SELECT * FROM alunos WHERE ? = ‘Aristodemo’

e você quiser fazer ? = nome_professor, não funciona.

O ? sempre é usado para dados, não nome de colunas ou tabelas.

1 curtida

Então a intenção é usar um código sql genérico para não ter que reescrever cada vez que for dar um INSERT, DELETE etc ???

Não é tão “genérico” assim; isso porque só variam os valores dos dados, não os nomes das colunas ou das tabelas. Mas isso já garante 2 coisas:
a) O banco SQL pode trabalhar mais rapidamente - tanto pela otimização das consultas fixas, quanto pela otimização (que vários bancos usam) de poder enviar os dados em binário, em vez de texto;
b) Você não precisa se preocupar com formatação de dados para passar para o banco. Por exemplo, se uma string contém aspas (“Sant’anna”) isso dá pau se você for montar a string SQL, mas com “prepared statements” o próprio driver já toma conta desses problemas (aspas, caracteres especiais, quebras de linha etc.) porque normalmente os dados já são passados em binário. Se você tem um dado numérico, tanto faz se você está trabalhando com o Windows em inglês, português ou árabe; o “prepared statement” aceita diretamente os números, em vez de ter de converter para números no formato americano, que é o que normalmente o SQL requer.

Legal, então ela trata SQL Injection também ?

Valeu pela ajuda cara!

Uma das maneiras de minorar os problemas com SQL Injection é usar cuidadosamente os PreparedStatements.

http://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

Obviamente, se você usar os PreparedStatements toscamente como no exemplo dado no link acima, você vai acabar tendo uma SQL Injection.