Een statement voorbereiden

Het gebruik van Statements is relatief traag. Eerst moeten we telkens het SQL-commando ingeven als een String. Die String moet elke keer weer door de databank gecompileerd worden en zo dan pas kan die worden uitgevoerd. Zoals al meermaals verteld in deze opleiding, is een databank traag.

Om hier bij te helpen is een systeem ontworpen waarbij veel voorkomende statements kunnen worden voorbereid. Dit wil zeggen pre-compiled. Op deze manier heeft de databank geen tot bijna geen tijd nodig om het statement te begrijpen en kan deze sneller overgaan tot uitvoeren.

Dit verzorgt betere, snellere prestaties en voorkomt SQL-injection. Dit doordat grote delen al zijn gecompileerd en daarbinnen nog simpele waarden bevat en dus eigenlijk geen compilatie meer uitvoert. Het is dus ook veiliger.


Om dit te kunnen gebruiken hebben we een implementatie nodig van de interface PreparedStatement. Dit is een interface die overerft van Statement en die aangemaakt kan worden met de prepareStatement() methode van de interface Connection.

String sql = "SELECT * FROM Beers;";

try (
   JdbcFacade jdbcHelper = new JdbcFacade();
   PreparedStatement preparedState = jdbc.prepareStatement(sql);
   ) {
   preparedState.executeQuery();
}

De methode prepareStatement(String sql) verwacht het uit te voeren SQL-commando als parameter. Op deze manier staat het statement dus al klaar om gebruikt te worden.

Het uitvoeren van dit commando gebeurt met de methode executeQuery(). Hierbij vind je geen argument in de parameter lijst, dit is ook niet nodig, want het SQL commando is al ingeladen via het Statement.


We kunnen hier ook veranderlijke waarden aan koppelen. Hierbij kunnen we ‘gaten’ laten in het statement die later nog moet worden ingevuld door gegevens. Hierbij maken we deze gaten aan de hand van Placeholders. Deze placeholders zijn vraagtekens in het SQL-Commando.

Nadien kunnen de gegevens worden ingevuld met de methode setXXX(). De eerste parameter is dan de index van de placeholder (startend vanaf 1) en de tweede index is de waarde die moet worden ingevuld in het commando.

Wanneer we tekst ingeven als waarde, is het eveneens aangeraden om de standaard methode enquoteLiteral() te gebruiken. Op deze manier worden automatisch aanhalingstekens geplaatst rond de gegevens alvorens ze in het SQL-commando in te voegen.

Wanneer we de prijs van een specifiek bier willen aanpassen kunnen we dus de volgende code voorzien.

String sql = "UPDATE Beers SET Price = ? WHERE Name = ?;";

try (
   JdbcFacade jdbcHelper = new JdbcFacade();
   PreparedStatement preparedState = jdbc.prepareStatement(sql);
   ) {

   preparedState.setDouble(1, 2.4);
   preparedState.setString(2, preparedStatement.enquoteLiteral("Zulte"));
   preparedState.executeQuery();
   
}