Java 这是允许用户进行通配符搜索的正确方法吗?
例如,给定一个文本框名称,用户需求希望能够进行通配符搜索(例如包含、以开头、以结尾) 只要我还在后端(Java)中使用参数化查询,接受sql通配符(“%”和“"”)作为输入可以吗?实际上,允许用户构建自己的正则表达式,这正是用户需求的全部内容 例如:Java 这是允许用户进行通配符搜索的正确方法吗?,java,sql,security,wildcard,parameterized-query,Java,Sql,Security,Wildcard,Parameterized Query,例如,给定一个文本框名称,用户需求希望能够进行通配符搜索(例如包含、以开头、以结尾) 只要我还在后端(Java)中使用参数化查询,接受sql通配符(“%”和“"”)作为输入可以吗?实际上,允许用户构建自己的正则表达式,这正是用户需求的全部内容 例如: 中的用户类型 textbox = '%are%' 此参数被馈送到后端,如下所示: public class PersonDaoImpl { public List<Person> search(String nam
textbox = '%are%'
public class PersonDaoImpl {
public List<Person> search(String name){//name gets the value from textbox w/ sql wildcards
Query q = mgr.createNativeQuery('select * from Person where name like :name'); //default to always use like since expecting searchkey with sql wildcards
q.setParameter('name', name);//gives the input from the screen
return q.getResultList();
}
}
公共类persondaimpl{
公共列表搜索(字符串名称){//name从带有sql通配符的文本框中获取值
Query q=mgr.createNativeQuery('select*from Person where name like:name');//默认为始终使用like,因为需要带有sql通配符的搜索键
q、 setParameter('name',name);//提供来自屏幕的输入
返回q.getResultList();
}
}
刚刚发现Google也允许通配符,这与用户需要知道(或被告知)如何构造SQL“LIKE”语法的事实相违背,但仅此而已。您可能会以这种方式结束一个缓慢的查询,因为它通常无法使用索引,但我不会担心安全性或正确性。它是“安全的”,但可能不是一个好主意,原因有二:
name
参数是如何在请求中设置的?这是什么站台?(OP missedsetParameter
之前)
正如您所指出的,用户需要知道通配符语法,即使用%
、\uu
等。更流行的方法是只从用户名中获取字符串,并提供“精确匹配”/“开始于”/“名称中的任意位置”选项。如果您采用这种方式,那么在前两种情况下,您也将能够执行更高效的查询
编辑:
如果客户坚持使用contains
query,那么我认为您当前要求最终用户输入模式的方法比将%
放在输入字符串周围将其转换为模式更好
这是因为用户仍然可以选择不将%
添加(或有选择地添加)到搜索字符串,从而加快查询执行。例如:
- 如果用户输入搜索字符串
,则查询为Don
。RDBMS最有可能在名称上使用索引select。。。从…起其中的名称类似于“Don”
- 如果用户输入搜索字符串
则查询为Don%
。RDBMS仍然很可能使用名称索引select。。。从…起其中的名称类似于“Don%”
- 如果用户输入搜索字符串
或%Don
,则无法使用索引%Don%
%
放在输入周围。另一方面,允许用户输入它允许用户输入term
、term%
、%term
或%term%
,这可以加快查询执行速度。是的,我希望允许用户能够构建正则表达式,他/她甚至可以执行类似于“%ap%zel”的操作来获得“rapanzel”。:)