# createStatement vs. prepareStatement



## Blues (30. Jan 2012)

Hallo,

morgen habe ich eine JAVA Klausur und dazu habe ich mir meine Unterlage nochmal angeschaut. Bin dabei auf 'createStatement' und 'prepareStatement' gestoßen. Bisher habe ich immer nur ersteres verwendet. Daher wollte ich mal nachlesen, was das Zweite ist und habe das hier gefunden:

http://www-vs.informatik.uni-ulm.de:81/Lehre/Seminar_Java/ausarbeitungen/JDBC/JDBC.html#5.2.2

So wie ich es verstanden habe, kann ich als bei prepare... Parameter setzen, bei create... nicht. Allerdings habe ich bisher immer create... statements geschrieben, die z.b. so in der Art aussahen:

Int Wert;
executeQuere("Where" + Wert +" = 5")
....

D.h. ich habe hier doch auch einen Parameter drin, Wert wird ja jedesmal anders übergeben...??


----------



## nillehammer (30. Jan 2012)

Bei Deinem Link bleibt mein Browserfenster weiß, egal, kann auch mein langsames Netz sein...

Zunächst der Verweis auf die Api-Docsi:
Connection (Java Platform SE 6)
PreparedStatement (Java Platform SE 6)
Statement (Java Platform SE 6)
In den Beschreibungen ist der Unterschied schon ganz gut erklärt. Zusammengefasst:

Der Unterschied zwischen Statement und PreparedStatement ist:
- Statement: Im Prinzip ein Freitext-String, der irgendwie SQL ist (hoffentlich) und ad hoc bei Benutzung vom DBMS geparst und ausgeführt wird.
- PreparedStatement: Im Grunde das Gleiche, wie Statement, nur, dass das DBMS die Chance bekommt, den String auf Vorrat zu parsen und zu Cachen. Dann müssen bei Benutzung nur noch die Parameter gebunden werden.

Weitere Vorteile von PreparedStatement:
- Sauberere Programmierung. Man überlegt sich vorher die Parameter und setzt diese dann in Methoden im Gegensatz zu diesen häßlichen String-Konkatonierungen bei Statement.
- Out of the box immun gegen SQL-Injection-Angriffe.


----------



## Blues (30. Jan 2012)

Hallo,
vielen Dank erstmal, das macht es schon klarer. Aber nochmal zum Verständnis:
- Statement wird also erst geparst, wenn es explizit aufgerufen wird
- wann wird das preparedStatement dann geparst? (Jedesmal) bei Programmstart, oder irgendwann einmal und dann nie wieder? Würde ersteres vermuten, weil ich mir nicht vorstellen kann, wo ein DB2 so eine Info (permanent) speichern sollte, wäre auch irgendwie unpraktisch, will aber lieber auf Nummer sicher gehen und nochmal nachfragen. 

Danke!


----------



## nillehammer (31. Jan 2012)

> Statement wird also erst geparst, wenn es explizit aufgerufen wird


Bei der Verwendung von Statement wird der SQL-String *jedes* Mal geparst, wenn es verwendet wird.


> wann wird das preparedStatement dann geparst? (Jedesmal) bei Programmstart, oder irgendwann einmal und dann nie wieder?


Es wird beim ersten Mal geparst, bei dem es bei der Datenbank aufschlägt. Das DBMS kann sich die vorgeparste/vorkompilierte Quiery dann in einen Cache packen und bei Bedarf wieder hervorholen.


----------

