Ich muss eine Abfrage für eine MySQL-Datenbank schreiben jdbc
Das hängt von einer Geschäftslogik ab, die man so zusammenfassen kann
if (someCondition) {
myQuery = "stuff";
} else {
if (anotherCondition) {
myQuery = "some stuff";
} else {
myQuery = "even more stuff";
}
}
Und ich habe vor, das zu bauen myQuery
String als Vorlage für eine PreparedStatement
Objekt und füllen Sie dann die ?
mit den tatsächlichen Daten. jedoch die Anzahl von ?
hängt von der gleichen Logik wie oben ab, und deshalb dupliziere ich die Logik im Code
Wie kann ich es vermeiden?
Vielen Dank
Antworten:
1 für die Antwort № 1Sie sollten so etwas verwenden:
String myQuery = ...;
List<Object> parameters = ... ;
if (someCondition) {
myQuery = "stuff";
parameters = ... ;
} else {
if (anotherCondition) {
myQuery = "some stuff";
parameters = ... ;
} else {
myQuery = "even more stuff";
parameters = ... ;
}
}
1 für die Antwort № 2
Sie können die Duplizierung vermeiden, indem Sie die Objekte vorbereiten, die Sie zusammen mit der Abfragezeichenfolge an die Anweisung binden möchten:
List<Object> paramValues = new ArrayList<>();
String myQuery;
if (someCondition) {
myQuery = "stuff ?";
paramValues.add("single");
} else {
if (anotherCondition) {
myQuery = "some stuff ? ?";
paramValues.add("one");
paramValues.add(2);
} else {
myQuery = "even more stuff ? ? ? ?";
paramValues.add("one");
paramValues.add(2);
paramValues.add(3.0);
paramValues.add("four");
}
}
// Make prepared statement
PreparedStatement ps = ...
// Bind parameters
for (int i = 0 ; i != paramValues.size() ; i++) {
ps.setObject(i+1, paramValues.get(i));
}
1 für die Antwort № 3
Sie können eine vorbereitete Anweisung erstellen und ihre Parameter in den if-Blöcken festlegen:
if (someCondition) {
stmt = connection.prepareStatement("stuff");
stmt.set... // set attributes
} else if (anotherCondition) {
stmt = connection.prepareStatement("some stuff");
// set attributes
} else {
stmt = connection.prepareStatement("even more stuff");
//set attributes
}