如何通过在 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 应用程序上输入所有列数据来过滤搜索?的主要内容,如果未能解决你的问题,请参考以下文章