当您有多个查询组合时,是否有更好的方法来搜索数据库?
Is a better way to search DB when you have multiple combinations of the query?
我试着思考是否有更好的方法来执行以下操作..
我有一个包含 3 个输入的表单,然后在 servlet 中读取它们:
String input1= request.getParameter("input1");
String input2= request.getParameter("input2");
String input3= request.getParameter("input3");
我用StringUtils.isBlank(input1)
检查用户是否填写了输入。
现在我想问我的DB(我用preparedStatements
问我的 DB(SQLITE) 获取 table 中是否有这些输入组合的记录。
所以如果用户只填写第一个输入,查询应该是
SELECT * FROM MyTable WHERE INPUT1='input1'
如果用户填写了 2 个输入,那么查询应该是
SELECT * FROM MyTable WHERE INPUT1='input1' AND INPUT2='input2'
和e.t.c
我所做的是
if(!StringUtils.isBlank(input1) && !StringUtils.isBlank(input2) && !StringUtils.isBlank(input3) ){
//search for input1+ input2+ input3
}else if(!StringUtils.isBlank(input1) && !StringUtils.isBlank(input2)){
//search for input1 + input2
}//e.t.c
有没有更好的方法来做到这一点,而不是根据输入是否填写来写下查询的所有可能组合?谢谢!
如果您已经在使用 StringUtils
,那么您可以执行以下操作:
private String extractWhereQueryPart(String input1, String input2, String input3) {
List<String> sqlParts = new ArrayList<String>();
if (StringUtils.isNotEmpty(input1)) {
sqlParts.add(" INPUT1 = @input1 ");
}
if (StringUtils.isNotEmpty(input2)) {
sqlParts.add(" INPUT2 = @input2 ");
}
// and so on
if(sqlParts.isEmpty()) {
return "";
}
return " WHERE " + StringUtils.join(sqlParts, " AND ");
}
这个逻辑最终会更直接,因为你不需要做if-else-if
。只是简单的 if
s。而且这种做法更受支持。
总是有人问 "simpler" 是什么意思,但我认为以下内容更具可读性:
- 只需确保您的字符串为空或包含有用的内容即可:
String input1= StringUtils.stripToEmpty(request.getParameter("input1"));
String input2= StringUtils.stripToEmpty(request.getParameter("input2"));
String input3= StringUtils.stripToEmpty(request.getParameter("input3"));
- 在您的 SQL 中进行所有检查:
SELECT * FROM MyTable WHERE (? = '' or INPUT1 = ?) AND (? = '' or INPUT2 = ?) AND (? = '' or INPUT3 = ?)
我试着思考是否有更好的方法来执行以下操作.. 我有一个包含 3 个输入的表单,然后在 servlet 中读取它们:
String input1= request.getParameter("input1");
String input2= request.getParameter("input2");
String input3= request.getParameter("input3");
我用StringUtils.isBlank(input1)
检查用户是否填写了输入。
现在我想问我的DB(我用preparedStatements
问我的 DB(SQLITE) 获取 table 中是否有这些输入组合的记录。
所以如果用户只填写第一个输入,查询应该是
SELECT * FROM MyTable WHERE INPUT1='input1'
如果用户填写了 2 个输入,那么查询应该是
SELECT * FROM MyTable WHERE INPUT1='input1' AND INPUT2='input2'
和e.t.c
我所做的是
if(!StringUtils.isBlank(input1) && !StringUtils.isBlank(input2) && !StringUtils.isBlank(input3) ){
//search for input1+ input2+ input3
}else if(!StringUtils.isBlank(input1) && !StringUtils.isBlank(input2)){
//search for input1 + input2
}//e.t.c
有没有更好的方法来做到这一点,而不是根据输入是否填写来写下查询的所有可能组合?谢谢!
如果您已经在使用 StringUtils
,那么您可以执行以下操作:
private String extractWhereQueryPart(String input1, String input2, String input3) {
List<String> sqlParts = new ArrayList<String>();
if (StringUtils.isNotEmpty(input1)) {
sqlParts.add(" INPUT1 = @input1 ");
}
if (StringUtils.isNotEmpty(input2)) {
sqlParts.add(" INPUT2 = @input2 ");
}
// and so on
if(sqlParts.isEmpty()) {
return "";
}
return " WHERE " + StringUtils.join(sqlParts, " AND ");
}
这个逻辑最终会更直接,因为你不需要做if-else-if
。只是简单的 if
s。而且这种做法更受支持。
总是有人问 "simpler" 是什么意思,但我认为以下内容更具可读性:
- 只需确保您的字符串为空或包含有用的内容即可:
String input1= StringUtils.stripToEmpty(request.getParameter("input1"));
String input2= StringUtils.stripToEmpty(request.getParameter("input2"));
String input3= StringUtils.stripToEmpty(request.getParameter("input3"));
- 在您的 SQL 中进行所有检查:
SELECT * FROM MyTable WHERE (? = '' or INPUT1 = ?) AND (? = '' or INPUT2 = ?) AND (? = '' or INPUT3 = ?)