搜索过滤器以查找Jtable

时间:2018-10-14 14:31:55

标签: java sql sqlite

我为医生设置了约会框架,里面有患者记录,当然还有医生,然后我有一个搜索字段,所以每当我找到一些医生时,我只需要搜索他们的名字,就没有错误了但是问题是每当搜索字段为空时,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+"%'

做对了我该怎么做才能做对呢?

1 个答案:

答案 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();