Da ist (zumindest auf der AS/400) der Optimizer davor.
Was immer Java da auch treibt, die AS/400 bügelt da einiges aus.
Wenn man nichts explizit bei der Verbindung angibt, verwendet die AS/400 SQL-Packages, die automatisch in der QGPL angelegt werden (schau da mal mit PDM nach der Objektart *SQLPKG, wahrscheinlich findest du da eins mit passendem Namen zu deiner Anwendung).

Bei jedem Statement extrahiert die AS/400 Feldwerte und ersetzt diese automatisch mit Parametermarkern.
Anschließend prüft sie, ob es dieses Statement im SQLPKG bereits gibt und verwendet dieses, ein interner Prepare, Analyse der Zugriffswege und Speichern im SQLPKG entfällt.

Danach wird das Statement ausgeführt wobei die Parametermarker jetzt mit den Felddaten verbunden werden.

Zusätzlich wird jetzt geprüft, ob das Statement bereits einmal ausgeführt wurde und schließt daher die Datei nun nicht mehr (wiederverwenden des ODP's).

Der einzig nennenswerte Unterschied zwischen SQL's mit eingebetteten Feldwerten oder Verwendung von Parametermarkern ist die Verwendung von UNICODE.

SQL's werden normalerweise NICHT in UNICODE an die AS/400 übergeben, so dass Feldwerte in UNICODE nicht mehr sprachneutral sind. Es gibt also ggf. Ersatzwerte, was insbesonders bei Mischung verschiedener Sprachräume nicht so angenehm ist (west-/osteuropäisch).
Bei der direkten Verwendung von Parametermarkern passiert das eben nicht, da der Feldwert "as is" übergeben wird.