如何通过在 java-sql 应用程序上输入所有列数据来过滤搜索?

Posted

技术标签:

【中文标题】如何通过在 java-sql 应用程序上输入所有列数据来过滤搜索?【英文标题】:How do I filter search by entering all the column data on java-sql application? 【发布时间】:2020-02-07 08:08:21 【问题描述】:

过去几天我一直在尝试解决这个问题。我有一个 SerachUser 函数,在其中我将年龄、性别、城市和兴趣等所有数据输入到每个字符串中,并将它们检查到一个选择查询命令中。

如果存在数据,我将它们打印出来。

很遗憾,搜索无法完全正常工作。例如:我的表用户没有“F”性别。但是,如果我键入“F”,我仍然会获取数据,而不是显示“Java 中的空结果集”。

下面是我做的一个简短的代码。

try
    conn = DriverManager.getConnection(DB_URL,"shankarv5815","1807985");
    st = conn.createStatement();  
    rs = st.executeQuery("Select loginID, f_name, l_name from users where gender = '" + 
    searchUser.getGender() + "' and age between '" + min + "' and '" + max + "' and city = '" + 
    searchUser.getCity() + "' and interest1 = '" + searchUser.getInterest1() + 
    "' or interest2 = '" + searchUser.getInterest1() + "' or interest3 = '" + 
    searchUser.getInterest1() + "' and loginID != '" + curUser + "'");  



    if (rs.next() == false) 
       System.out.println("ResultSet in empty in Java");
     
    else 

          do 
              String id = rs.getString(1);
              String fName = rs.getString(2);
              String lName = rs.getString(3);
              System.out.print(id +" ," + fName + ", " + lName);
              System.out.println();
              while (rs.next());
                         
  
  catch(SQLException e)
       e.printStackTrace();
  
  finally
  
    try
      
       conn.close();
       st.close();
       rs.close();    
      
    catch(SQLException e)
      
       e.printStackTrace();
                 
  

【问题讨论】:

【参考方案1】:

您的查询的简化版本是:

Select * from users
Where gender = 'F'
And interest1 = 'FISHING'
Or interest2 = 'FISHING'

但是,AND 的优先级高于 OR,所以这个查询相当于:

Select * from users
Where ( gender = 'F' And interest1 = 'FISHING')
Or interest2 = 'FISHING'

你需要做的是添加括号,所以:

Select * from users
Where gender = 'F'
And ( interest1 = 'FISHING' Or interest2 = 'FISHING')

顺便说一句,通过将搜索词直接包含在 SELECT 语句中(请参阅What is SQL injection?),您也很容易受到 SQL 注入攻击。

养成始终使用 PreparedStatement 的习惯会更好。

【讨论】:

您还应该建议使用准备好的语句。 非常感谢。是的,我会研究一下sql注入部分。

以上是关于如何通过在 java-sql 应用程序上输入所有列数据来过滤搜索?的主要内容,如果未能解决你的问题,请参考以下文章

闪亮:更改输入后保持选中数据表上的框

execl中如何统计某列中指定数值的上一行数值?

如何使用 Spark(Java)在数据集的所有列上并行应用相同的函数

python 购物车程序

在单列上应用 Pig UDF 并自动生成所有其他列

jQuery:通过搜索输入隐藏表格行,解决 td rowspan 和 colspan