Statements e PreparedStatements

provavelmente deve existir ´aui no GUj algum tutorial ou algo do genero…mas gostaria de saber na prática…qual a real diferença entre Statements e PreparedStatements…existe alguam vantagem em utilizar um ou outro ??

obrigado!

O PreparedStatement é uma “subinterface” de Statement cujos objetos podem ser reutilizados várias vezes. Você cria o statement uma vez, o banco compila para ver a melhor forma de executar a query e aí ele fica numa espécie de pool para ser utilizado sempre que chamado.
Além disso ele tem umas facilidades para mapear os objetos do Java com os tipos do banco, e aí por exemplo se você quer passar uma String que inclui aspas você não precisa ficar se preocupando em fazer os escapes.

Completando a(o)? Bani:

A vantagem de se utilizar o PreparedStatement é q o comando sql
será enviado do SGBD onde ele será compilado.Consequentemente,o PreparedStatement contém não apenas um comando SQL mas um
comando SQL q já foi pré-compilado.Logo, quando o comando PreparedStatement é executado,o SGDB pode apenas executar o comando SQL PreparedStatement sem ter q compilá-lo.

Existem coisas que só o PreparedStatement faz pra vc, como por exemplo update em campos BLOB.

Claudio Gualberto.
SCJP 1.4

A maioria dos posts assinala a grande vantagem do recurso ser em relacao a pre compilacao do SQL no banco. Com certeza essa eh uma grande vantagem, mas nao sao todos os bancos que permitem esse recurso. Na verdade isso seria mais uma recomendacao.

Eu acho a grande vantagem desse PreparedStatement ser o binding de variavel . Nao eh necessario ficar se preocupando com aspas, com o blob. Basta botar um ? no campo e apos a criacao do PreparedStatement dar um setObject, setString, que o driver faz o trabalho sujo para voce.

Vale tambem lembrar que o jdbc3 possui o recurso de Pool de Prepared Statement. Acredito que tenha sido criado devido a perda dos PreparedStatement ao fechamento da Conection. Novamente, isso eh um recurso que precisa ser suportado pelo seu BD.

Aproveitando a deixa, vocês sabem o tempo de vida da procedure compilada no BD ?

Tipo: ela está disponível enquanto a conexão está aberta ? ela está disponível enquanto o objeto PreparedStatement está aberto ?

Se na mesma conexão eu criar um PreparedStatement com o mesmo código SQL de um outro utilizado anteriormente, ele reconhece o SQL já compilado anteriormente ? E em outra conexão ?

:roll: