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.
[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?
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.
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. =]
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)