我有一个JTable(t1)& JTextField(txtSearch)&我的Java程序中的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);
}
}
});
答案 0 :(得分: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在您的查询中为每个?
指示的那样,您应该设置参数use 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);
的查询字符串,然后使用ps
设置参数后,执行query
的参数为{{1}是一个常见的错误}}!通过这种方式,ps
忽略设置的参数,然后在其中运行带有?
的原始查询。您没有收到此错误的原因是您没有使用?
对查询字符串进行参数化。因此,在您设置ps.setString(n, search);
之后,您应该在没有任何争议的情况下执行ps
:
ResultSet rs = ps.executeQuery();
希望这有帮助!
答案 1 :(得分:0)
这将搜索其中包含“A”的所有name_doctor。
String query="Select * From doctor where name_doctor like %A%";
此文档包含更多详细信息:https://www.tutorialspoint.com/mysql/mysql-like-clause.htm