Запрос MySQL с Java с несколькими возможными операторами "где" - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь найти хорошее решение для системы фильтрации фильмов, встроенной в Java, и базы данных mysql.Предполагается, что пользователь сможет фильтровать фильмы, которые он хочет просмотреть, по ряду атрибутов, таких как: режиссер, актер, продолжительность, жанр, год, ...,.Всего есть 11 полей, которые можно использовать для фильтрации запроса.

Проблема в том, что некоторые из этих полей могут (и, вероятно, будут) оставаться пустыми.Например, возможно, пользователь хочет фильтровать данные только на основе определенного жанра, режиссера и длины.Или, может быть, они хотят фильтровать его только на основе продакшн-студии и не заботятся о других параметрах фильтра.

Я установил соединение с сервером, и проблема заключается в создании «SQL_String», которую я буду использовать в statement.executeQuery(SQL_String).

Допустим, я хотел отфильтровать только одно поле.Тогда я знаю, что могу написать

String field = //user input (for example: actor)
String filter = //user input (for example: 'tom cruise')
String SQL_String = "SELECT * FROM Movies WHERE "+field + "=" +filter

Но если я хочу разрешить пользователю фильтровать по нескольким (или нулевым) полям, то я не знаю, как написать код.

Некоторые примеры запросов могут быть:

"SELECT * FROM Movies WHERE (director = 'steven spielberg' AND genre = 'action' AND length >100)"

"SELECT * FROM Movies WHERE (type = 'tv-series' AND actor = 'bob odenkirk')"

Таким образом, пользователь может указать, какие поля они хотят фильтровать (если они есть), и мне нужно придумать код Java, который может принимать тево внимание и построить строку запроса.

1 Ответ

0 голосов
/ 16 октября 2018

Поскольку вы не знаете, сколько полей пользователь будет фильтровать, но вы знаете, что данные, с которыми вы имеете дело, состоят из двух частей (поле и фильтр), первые две вещи, которые приходят мне в голову, этокарты и кортежи.Поскольку, в отличие от Python, Java не имеет встроенного типа данных кортежа (насколько мне известно), вот небольшой пример решения, которое я подумал для решения вашей проблемы с использованием классов Java HashMap и Map.

В этомНапример, я создаю HashMap, ключом которого является строка для «поля», а значением - строка для «фильтра».Вы можете установить эти значения, основываясь на пользовательском вводе, где бы он ни был в вашем коде (в этом примере это просто жестко прописано в методе main).Затем вы можете перебирать пары ключ-значение в вашей HashMap ( см. Этот полезный пост ), добавляя ключ и значение, а также дополнительные символы, необходимые для запроса.Это простой пример, но показывает возможный маршрут решения.

Если вы хотите убедиться, что это решение работает для случаев, когда фильтруемое значение является целым числом, просто добавьте еще один оператор if в циклепопытаться выполнить синтаксический анализ целого числа и, если оно существует, не добавлять дополнительные escape-символы.

import java.util.HashMap;
import java.util.Map;

public class MovieQueryTest {
  public static void main(String[] args) {

    String SQL_Query = "SELECT * FROM Movies WHERE ";

    HashMap<String, String> queryFilters = new HashMap<>();

    queryFilters.put("director", "Steven Spielberg");
    queryFilters.put("type", "tv-series");
    queryFilters.put("actor", "Bob Odenkirk");

    boolean firstQueryFilter = true;

    for (Map.Entry<String, String> entry : queryFilters.entrySet()) {
      if (firstQueryFilter) {
        SQL_Query += entry.getKey() + "=\'" + entry.getValue() + "\'";
        firstQueryFilter = false;
      } else {
        SQL_Query += " AND " + entry.getKey() + "=\'" + entry.getValue() + "\'";
      }

    }

    System.out.println(SQL_Query);

  }
}
...