2017-01-23 65 views
0

我的Java程序中有一個JTable(t1)& JTextField(txtSearch)& JButton(btnSearch)。我想要做的是,如果我在JTextField中鍵入字母A(不區分大小寫)並按下按鈕,則所有名稱爲包含字母A的醫生將顯示在我的JTable上。直到我在我的JTable上得到一個特定的名字。如何從MySQL過濾數據並使用java在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); 
      } 

     } 
    }); 
+2

您正在將傳統查詢與準備好的查詢混合使用,它應該更像'String query =「SELECT name_doctor ... FROM doctor WHERE name_doctor LIKE?」;'(爲簡潔而截斷),然後您可以使用'ps .setString(1,「%」+ search +「%」);'...我的JDBC有點生疏,但這應該讓你走上更好的路徑 – MadProgrammer

+1

你應該也在管理你的資源(關閉你的連接,語句)完成後,我建議看看[試用資源]( https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – MadProgrammer

回答

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);n1盯着第一齣現?。所以你可能想要改變你的查詢字符串爲:

SELECT ... FROM doctor WHERE name_doctor LIKE ?然後設置參數使用ps.setString(1, "%" + search + "%");它應該工作。

在你的代碼更重要的一點是你在哪裏執行查詢:

ResultSet rs = ps.executeQuery(query);

在定義與它?查詢字符串,然後使用ps.setString(n, search);這是一個常見的設置參數錯誤地執行ps的參數爲query!通過這種方式,ps將忽略設置的參數,然後在其中運行帶有?的原始查詢。你沒有得到這個錯誤的原因是你沒有用?參數化你的查詢字符串。你設置那麼之後ps.setString(n, search);你應該不帶任何參數執行你ps

ResultSet rs = ps.executeQuery();

希望這有助於!

+0

謝謝你的作品 –

+0

不客氣! ;-) – STaefi

相關問題