我正在努力寻找一个很好的解决方案,一个电影过滤系统建立在java和mysql数据库。用户应该能够根据许多属性过滤他们希望看的电影,例如:导演、演员、长度、流派、年份……。总共有11个字段可用于过滤查询。
问题是这些字段中的一些可以(并且很可能会)留空。例如,也许用户只想根据某个流派、导演和长度来过滤数据。或者他们只想根据prodution studio进行过滤,而不关心其他过滤选项。
我已经建立了到服务器的连接,问题出在创建我将在statement.executeQuery(SQL_String)
中使用的"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代码来考虑这些字段并构造一个查询字符串。
发布于 2018-10-16 09:05:27
因为您不知道用户将过滤多少字段,但是您知道您正在处理的数据有两个部分(字段和过滤器),所以我首先想到的两件事是映射和元组。由于与Python不同,Java语言没有内置的元组数据类型(据我所知),下面是我为您的问题想出的一个小示例解决方案,它使用Java语言的HashMap和Map类来解决。
在本例中,我创建了一个HashMap,键是“字段”的字符串,值是“过滤器”的字符串。您可以根据用户输入在代码中设置这些值(在本例中,只是在main方法中硬编码)。然后,您可以遍历HashMap (see this helpful post)中的键值对,追加键和值以及查询所需的其他字符。这是一个简单的示例,但显示了一种可能的解决方案。
如果您希望确保此解决方案适用于筛选值为整数的情况,则只需在循环中添加另一个If语句,以尝试解析整数,如果存在,则不添加额外的\‘转义字符。
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);
}
}
https://stackoverflow.com/questions/52826288
复制相似问题