【问题标题】:How to filter data from mysql and show it in jtable using java如何从mysql中过滤数据并使用java在jtable中显示
【发布时间】:2017-06-07 14:15:13
【问题描述】:

我的 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);
            }

        }
    });

【问题讨论】:

  • 您将传统查询与准备好的查询混合在一起,它应该更像String query = "SELECT name_doctor ... FROM doctor WHERE name_doctor LIKE ?";(为简洁起见截断)然后您可以使用ps.setString(1, "%" + search + "%"); ...我的JDBC有点生疏,但是这应该会让你走上更好的道路
  • 您还应该在完成后管理您的资源(关闭您的连接、语句),我建议您看看try-with-resources

标签: java mysql search jtable


【解决方案1】:

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

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);设置参数之后,使用query的参数执行ps是一个常见的错误!这样ps 会忽略设置的参数,然后运行其中包含? 的原始查询。您没有收到此错误的原因是您没有使用? 参数化查询字符串。所以在你设置了ps.setString(n, search); 之后,你应该执行你的ps 而不带任何参数:

ResultSet rs = ps.executeQuery();

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这将搜索所有带有“A”的name_doctor。

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2015-05-14
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多