【发布时间】:2018-10-16 00:10:55
【问题描述】:
我正在尝试为使用 java 和 mysql 数据库构建的电影过滤系统找到一个很好的解决方案。用户应该能够根据许多属性过滤他们希望看的电影,例如:导演、演员、长度、流派、年份……。总共有 11 个字段可用于过滤查询。
问题是其中一些字段可以(并且可能会)留空。例如,也许用户只想根据某种类型、导演和长度过滤数据。或者他们可能只想根据制作工作室过滤它,而不关心其他过滤器选项。
我已与服务器建立连接,问题在于创建将在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 代码。
【问题讨论】:
-
对于可选参数 sql 范例,我建议使用
CriteriaBuilder -
顺便说一句,即使您决定继续使用上面的
SQL,也不应该简单地附加列和值,因为这有 SQL 注入攻击的风险 -
在应用中不要使用
*,否则会出问题.. -
使用 CONCAT(attribute1,attribute2,...,11) LIKE(userinput1%userinput2%...%11) 可以吗?其中attribute1 可以是actor,如果用户不想根据它进行过滤,则userinput1 可以为空,或者如果他们确实想过滤它,则为'tom Cruise'。