如何从 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();
希望对您有所帮助!
我的 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();
希望对您有所帮助!