我的 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);
}
}
});
最佳答案
在您的代码中,查询字符串为:
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 所示,对于查询中的每个 ?
,您应该设置参数 use ps.setString(n, search);
while n
盯着 1
查找第一个出现的 ?
。因此,您可能需要将查询字符串更改为:
SELECT ... FROM doctor WHERE name_doctor LIKE ?
然后使用 ps.setString(1, "%"+ search + "%"); 设置参数它应该可以工作。
代码中更重要的一点是执行查询的位置:
ResultSet rs = ps.executeQuery(query);
使用 ?
定义查询字符串,然后使用 ps.setString(n, search);
设置参数后,执行 ?
是一个常见的错误code>ps 带有 query
参数!通过这种方式,ps
会忽略设置的参数,然后运行其中包含 ?
的原始查询。您没有收到此错误的原因是您没有使用 ?
参数化查询字符串。因此,在设置 ps.setString(n, search);
后,您应该不带任何参数执行 ps
:
ResultSet rs = ps.executeQuery();
希望这有帮助!
关于java - 如何使用java从mysql过滤数据并将其显示在jtable中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800099/