如何从 mysql 过滤数据并使用 java 在 jtable 中显示它

How to filter data from mysql and show it in jtable using java

我的 Java 程序中有一个 JTable(t1) & JTextField(txtSearch) & JButton(btnSearch)。我想做的是,如果我在 JTextField 中键入字母 A(不区分大小写)并按下按钮,所有名字包含字母 A 的医生都将显示在我的 JTable 上。直到我在我的 JTable 上得到一个特定的名称。

这是我的代码,

    btnSearch = new JButton();
    btnSearch.setBackground(new java.awt.Color(51, 51, 255));
    btnSearch.setText("Search");
    btnSearch.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
                String search =txtSearch.getText(); 
                try{
                    conn = DriverManager.getConnection( "jdbc:mysql://localhost/bibodent", "root", "" );
                String query = "SELECT name_doctor, mobile_doctor, phone_doctor, mail_doctor, city_doctor, spec_doctor, adres_doctor, note_doctor FROM doctor WHERE name_doctor LIKE '%" + txtName.getText() + "%' ";

                ps = conn.prepareStatement(query);
                ps.setString(1, search);
                ResultSet rs = ps.executeQuery(query);
                t1.setModel(DbUtils.resultSetToTableModel(rs));

            }catch (Exception e){
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, e);
            }

        }
    });

这将搜索其中包含 'A' 的所有 name_doctor。

String query="Select * From doctor where name_doctor like %A%";

此文档有更多详细信息:https://www.tutorialspoint.com/mysql/mysql-like-clause.htm

在您的代码中,查询字符串为:

SELECT ... FROM doctor WHERE name_doctor LIKE '%" + txtName.getText() + "%' "

其中不包含任何 ? 标记。所以不需要 ps.setString(1, search); 因为你已经通过在查询字符串中附加 txtName.getText() 来设置你的查询参数只是内联:

SELECT ... FROM doctor WHERE name_doctor LIKE '%" + txtName.getText() + "%' "

不建议使用这种在查询字符串中附加参数的方式,因为它会出现错误,而且其中没有类型检查。您以某种方式使用的更优雅的方法是使用 PreparedStatement 并将查询的参数设置为查询中的 ? 标记。

然后正如 MadProgrammer 为您的查询中的每个 ? 指出的那样,您应该设置参数使用 ps.setString(n, search);n 正在盯着 1 第一次出现 ?。因此,您可能希望将查询字符串更改为:

SELECT ... FROM doctor WHERE name_doctor LIKE ? 然后使用 ps.setString(1, "%" + search + "%"); 设置参数,它应该可以工作。

代码中更重要的一点 是执行查询的位置:

ResultSet rs = ps.executeQuery(query);

在你定义一个带有 ? 的查询字符串然后使用 ps.setString(n, search); 设置参数后,使用 [=28= 的参数执行 ps 是一个常见的错误]!通过这种方式,ps 会忽略设置的参数,然后运行包含 ? 的原始查询。你没有得到这个错误的原因是你没有用 ? 参数化你的查询字符串。所以在你设置 ps.setString(n, search); 之后你应该不带任何参数地执行你的 ps:

ResultSet rs = ps.executeQuery();

希望对您有所帮助!