O que é PreparedStatement e para que serve?

Minha dúvida.

uma forma de você fazer uma inserção no banco mais segura, onde você prepara os parametros para serem inseridos.

evitando assim ataques como o sql injection.

3 curtidas

[quote=klebson lou]uma forma de você fazer uma inserção no banco mais segura, onde você prepara os parametros para serem inseridos.

evitando assim ataques como o sql injection.[/quote]

Ah sim, e esse sql injection é causado pelo próprio sistema ou usuários com más intenções?

1 curtida

Usuários com más intenções.

Se vc faz uma query assim:

String sql = "SELECT * FROM Aluno WHERE Nome LIKE '%" + nome + "%'";

Alguém poderia digitar o seguinte nome:

';DELETE * FROM Aluno WHERE NOME LIKE ';

Sua String final ficaria:

SELECT * FROM Aluno WHERE Nome LIKE '%';DELETE * FROM Aluno WHERE NOME LIKE '%';

O que é perfeitamente válido. E apaga toda sua tabela de alunos (embora o mais provável, já que isso esbarraria em ForeignKeys seria o cara usar no lugar daquele DELETE um UPDATE, alterando a senha de todos para uma conhecida).

O PreparedStatement não só é mais seguro, mas também trata automaticamente caracteres como as '. Assim o aluno MacDonald’s não daria mais pau no seu SQL.
Ele também lida sozinho com formatos de datas (que não são padronizados no SQL puro, e portanto, dependem do banco) e outros detalhes chatos.

Finalmente, o PreparedStatement mantém a query pré-compilada no banco de dados. Assim, se vc for enviar várias vezes a mesma query, a execução provavelmente será muito mais rápida, já que vc só precisa trocar os valores associados a consulta, reaproveitando o plano de execução já criado.

3 curtidas

O preparedStatement assume a responsabilidade de montar a sua query (String) , sem que você tenha que concatenar as condições, desde que você passe os parâmetros corretamente. =]

1 curtida

Dependendo do driver e do banco, há um ganho adicional de desempenho porque os valores dos parâmetros podem ser tratados como dados binários, em vez de terem de ser convertidos para texto e depois reconvertidos para dados binários.

(E é por isso que costuma não ser possível você conseguir obter a string SQL que seria resultante da substituição dos parâmetros - muita gente precisa disso para logar, sei lá por quê - porque essa tal string SQL pode nunca ter existido, já que o banco só usou uma versão pré-compilada e mais os valores binários dos parâmetros)