/ / Dynamic Query-Anweisung - Java, MySQL, JDBC

Dynamische Abfrageanweisung - java, mysql, jdbc

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 № 1

Sie 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
}