我为医生设置了约会框架,里面有患者记录,当然还有医生,然后我有一个搜索字段,所以每当我找到一些医生时,我只需要搜索他们的名字,就没有错误了但是问题是每当搜索字段为空时,jtable就会填充所有用户,包括管理员Nurse Recep等。
这是我的代码
try{
String like = DoctorSearch.getText();
String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
"where Role_ID = 3 AND Last_Name LIKE '"+like+"%' or First_Name LIKE '"+like+"%'";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
DoctorNames.setModel(DbUtils.resultSetToTableModel(rs));
}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}finally {
try {
rs.close();
pst.close();
}catch(Exception e){
}
}
但是当我删除
First_Name LIKE '"+like+"%'
做对了我该怎么做才能做对呢?
答案 0 :(得分:0)
这与运算符的优先级有关。假设您要搜索“ James”,则您要执行的实际SQL代码是:
Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND Last_Name LIKE 'James'
or First_Name LIKE 'James'
现在由于precedence of SQL operators,WHERE部分被视为:
WHERE (Role_ID = 3 AND Last_Name LIKE 'James')
OR (First_Name LIKE 'James')
因此,您将获得姓氏为“ James”的所有医生以及姓氏为“ James”的所有人(包括护士)。并且当您的搜索字段为空时,您将得到所有人的名字为LIKE ''
的所有人。
为了使Role_ID = 3
位在两种情况下都适用,您只需要括号,如下所示:
Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND (Last_Name LIKE 'James'
or First_Name LIKE 'James')
因此您的代码将如下所示:
String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
"where Role_ID = 3 AND ( Last_Name LIKE '"+like+"%' or First_Name LIKE '"+like+"%')";
您在这里所做的事情也很糟糕。您正在为所谓的SQL注入攻击做好准备。阅读有关此内容的内容,以及如何在SQL中在需要值的位置提供?
的知识,然后在调用setString()
之后用类似conn.prepareStatement(sql)
的值替换它。这非常非常重要。
总体而言,您可能最终会遇到类似这样的情况:
String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
"where Role_ID = 3 AND (Last_Name LIKE ? or First_Name LIKE ?)";
pst = conn.prepareStatement(sql);
pst.setString(1, like);
pst.setString(2, like);
rs = pst.executeQuery();