PreparedStatement IN-Funktion

puls

Mitglied
Hey,

weiß jemand wie man ein PreparedStatement nutzt wenn man die Anzahl der Parameter nicht kennt?
Ich würde gerne die IN(Wert,Wert, ...)-Funktion nutzen aber ich kenne die Anzahl der Platzhalter erst zur Laufzeit.

Statische Platzhalter für 3 Parameter:
Java:
sql.executeQuery("SELECT * FROM tabelle WHERE ID IN(?,?,?)", idList);

So möchte ich das nicht lösen weil dann könnte ich statt die Platzhalten ja auch direkt die Werte setzen und dann wäre ja schon einige Vorteile von PreparedStatement wieder verloren.

Java:
sql.executeQuery("SELECT * FROM tabelle WHERE ID IN(" + getPaltzhalterstring(idList.size()) + ")", idList);

Danke für jeden Tipp
 
Zuletzt bearbeitet:
S

SlaterB

Gast
so viele Vorteile hat PreparedStatement ja nun auch nicht,
jeden Wert bei Übergabe auf korrekte Darstellung je nach DB/ Treiber zu formatieren, SQL-Injection zu verhindern, all das bleibt bestehen

es wäre freilich schön nur ein ? zu setzen und eine Liste per set-Methode zu übergeben, weniger Arbeit auch wenn sich intern nicht viel ändert (aber auf ?, ?, ? sicher auch verzichtet wird)
das gibt es z.B. in Hibernate, für PreparedStatement meines Wissens nicht,

womöglich mit der eigentlichen Aufgabe, die Query an die DB zum Prepare/ Vorbereiten zu schicken, unvereinbar, aber da spekuliere ich gerade nur ohne Eckkenntnisse

setArray() ist was anderes
 

puls

Mitglied
PreparedStatement sollen doch angeblich SQL-Injection verhindern oder zumind. die meisten Varianten davon. Außerdem führe ich die Queries Millionfach aus nur mit neuen Werten, PreparedStatement sind doch da schneller.
 
S

SlaterB

Gast
einfach so Sätze zu schreiben ohne genauen Bezug, da weiß ich zumindest nicht, ob auf mich bezogen, ob Widerrede, ob Thema beendet oder was auch immer

dass du mit zusammengebauter ?-Reihe + Parameterübergabe genau noch SQL-Injection-Schutz erhälst, habe ich ja gesagt,

-----

und dass die Wiederverwendung mit neu zusammengebauten Queries wegfällt ist klar,
ob sie überhaupt möglich ist wäre eine Frage, wie ich schon schrieb bezweifle ich das,

gut, zu diesem Punkt kann ich praktisch nur wiederholen dass ich nichts genaues weiß ;)
 

r.w.

Bekanntes Mitglied
Ich mal hab irgendwo gelesen, dass das z.B. mit setObject in Verbindung mit einem String-Array
funktionieren soll. Hab es aber selbst noch nicht getestet, also schlagt mich nicht. ;-)
 

Timothy Truckle

Top Contributor
PreparedStatement sollen doch angeblich SQL-Injection verhindern oder zumind. die meisten Varianten davon. Außerdem führe ich die Queries Millionfach aus nur mit neuen Werten, PreparedStatement sind doch da schneller.
Also ich spinne mal in's Blaue und vermute, das die Werte in der
Code:
IN
Klausel numerische ID's sind. In diesem Fall sollten die ja auch zu dem Zeitpunkt, zu dem die Query gebaut wird, als Zahlentypen vor liegen. Damit ist SQL-Injection schon mal kein Thema mehr.

Bleibt der Performance-verlust durch hard parsing des Statements in der DB. Der dürfte aber IMHO gegenüber dem Overhead, den die "eche" Lösung (mittes Database-Array-Types) erfordert nicht relevant sein.

Zu beachten ist eigentlich nur, dass man bei Oracle -DB,s nur maximal 999 literale Werte angeben darf. Das kann bei anderen DB's natürlich anderes sein...

Andererseits lohnt es sich vielleicht die Selects als Batch abzusetzen
Java:
for (BigDecimal nextId : idSet){
  ps.setBigDecimal(nextId);
  ps.addBatch();
}
ps.executeBatch();
ResultSet rs= ps.getResultSet();
[EDIT]Das habe ich aber selbst noch nicht eingesetzt...[/EDIT]

bye
TT
 
Zuletzt bearbeitet:

Timothy Truckle

Top Contributor
und dass die Wiederverwendung mit neu zusammengebauten Queries wegfällt ist klar,
ob sie überhaupt möglich ist wäre eine Frage, wie ich schon schrieb bezweifle ich das,
Ich sag mal so:
Die Wahrscheilichkeit dafür, dass ein weiteres Statement mit der selben Anzahl
Code:
?
erzeugt wird ist wesentlich höher als dafür, dass ein weiteres Statement mit genau den selben ID's in genau der selben Reihenfolge erstellt wird....

bye
TT
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
V SQLite NullPointerException in preparedStatement.close(); Datenbankprogrammierung 8
Neumi5694 SQL-Statement Preparedstatement - try resource vs. Garbage Collector Datenbankprogrammierung 5
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
S CSV Datein in DB übernehmen:PreparedStatement bzw executeBatch() zu langsam Datenbankprogrammierung 11
P MySQL PreparedStatement vs. StoredProcedure vs. executeBatch Datenbankprogrammierung 1
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
turmaline Oracle [PreparedStatement] Klammer fehlt Datenbankprogrammierung 9
C PreparedStatement und null Datenbankprogrammierung 13
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
D MySQL PreparedStatement mit c3p0 schlägt fehl. Warum? Datenbankprogrammierung 3
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
M MySQL preparedStatement und Anführungszeichen Datenbankprogrammierung 6
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G PreparedStatement und Transaktionen Datenbankprogrammierung 2
N Leeres Blob in ein PreparedStatement eintragen Datenbankprogrammierung 2
P PreparedStatement batch und getGeneratedKeys Datenbankprogrammierung 7
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
Guybrush Threepwood PreparedStatement: execute() oder executeUpdate() Datenbankprogrammierung 3
R PreparedStatement mit verschiedenen Datenbanken Datenbankprogrammierung 2
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
W preparedStatement (MySQL - JDBC) Datenbankprogrammierung 5
Landei PreparedStatement Parameter mehrfach verwenden Datenbankprogrammierung 18
S Create Table mit PreparedStatement Datenbankprogrammierung 2
S Select mit PreparedStatement Datenbankprogrammierung 2
S PreparedStatement setArray(int i, java.sql.Array) Datenbankprogrammierung 17
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
T PreparedStatement anzeigen Datenbankprogrammierung 10
A PreparedStatement im Servlet - Referenz speichern Datenbankprogrammierung 3
P PreparedStatement - Angabe des PK Datenbankprogrammierung 4
J Fehler beim PreparedStatement Datenbankprogrammierung 2
B PreparedStatement - anzahl ParameterValues Datenbankprogrammierung 6
J PreparedStatement Datenbankprogrammierung 5
C PreparedStatement Datenbankprogrammierung 2
R DB2 PreparedStatement Batches ungültige Reihenfolge Datenbankprogrammierung 4
DeltaPilot12 Datenbank connect Funktion Datenbankprogrammierung 7
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
Streeber MySQL Funktion gesucht, die angibt, wie oft ein Wert auftritt Datenbankprogrammierung 1
E Wie kann ich aus diesem XML eine XMLTABLE-Funktion bauen? Datenbankprogrammierung 3
D Oracle Funktion mit mehreren Out Parametern ausführen? Datenbankprogrammierung 3
X JDBC Verbindung in einer Funktion Datenbankprogrammierung 9
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
N Funktion um einen Wert in einem ResultSet zu finden ? Datenbankprogrammierung 5
P Java und Oracle Funktion Datenbankprogrammierung 8
G Funktion in einer Oracle-DB aufrufen Datenbankprogrammierung 3

Ähnliche Java Themen


Oben