2017-01-23 8 views
0

JavaプログラムでJTable(t1)& JTextField(txtSearch)& JButton(btnSearch)があります。私がしたいのは、JTextFieldに「A」(大文字小文字を区別しない)と「Button」を入力すると、文字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 ...のような名前になりますか?name_doctor LIKE? ";'(簡略化のために切り捨てられます) .setString(1、 "%" +検索+ "%"); '...私のJDBCは少し錆びていますが、それはあなたに良い道をつけてくれるはずです – MadProgrammer

+1

あなたのリソースを管理している必要があります(あなたの接続、文を閉じる)、私は[try-with-resources] https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – MadProgrammer

答えて

1

クエリ文字列のようにあります:

それに任意の ?マークが含まれていません

SELECT ... FROM doctor WHERE name_doctor LIKE '%" + txtName.getText() + "%' "

。クエリ文字列にパラメータを追加するこの方法は推奨されません

SELECT ... FROM doctor WHERE name_doctor LIKE '%" + txtName.getText() + "%' "

:として、あなたのクエリ文字列にtxtName.getText()を追加することにより、単にインラインクエリのパラメータを設定しているので、そうps.setString(1, search);を持っている必要はありませんバグがあり、型チェックもないからです。何らかの形で使用されているよりエレガントな方法は、PreparedStatementを使用し、クエリのパラメータを?マークに設定することです。 MadProgrammerがnが最初に現れる?ため1を見つめているときに、パラメータの使用ps.setString(n, search);を設定する必要があり、クエリ内の各?のために示されるように、その後

。したがって、クエリ文字列を

SELECT ... FROM doctor WHERE name_doctor LIKE ?のように変更してから、パラメータをps.setString(1, "%" + search + "%");に設定すると効果があります。あなたのクエリを実行されている場合、あなたのコードで

より重要な点は次のとおりです。

ResultSet rs = ps.executeQuery(query);

あなたがそれに?でクエリ文字列を定義し、ps.setString(n, search);を使用してパラメータを設定した後、それが一般的です引数がquerypsを実行している間違い!このようにしてpsは、設定されたパラメータを無視して、?という生のクエリを実行します。このエラーが発生しなかったのは、クエリ文字列を?でパラメータ化しなかったためです。だから、あなたが引数なしであなたのpsを実行する必要がありps.setString(n, search);設定した後:

ResultSet rs = ps.executeQuery();

・ホープ、このことができます!

+0

ありがとうございます –

+0

ようこそ! ;-) – STaefi

関連する問題