2017-01-23 8 views
0

У меня есть JTable (t1) & JTextField (txtSearch) & JButton (btnSearch) в моей программе Java. Я бы хотел сделать, если я наберу букву A (нечувствительность к регистру) в JTextField и нажмите кнопку, на моем JTable отобразится весь доктор, имя которого Содержит букву A. пока я не получу определенное имя на моем JTable.Как фильтровать данные из mysql и показывать их в jtable с помощью java

это мой код,

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

Вы должны также управлять своими ресурсами (закрывая свое соединение, заявления), когда вы сделали это, я бы предложил посмотреть [try-with-resources] (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); в то время как n смотрит на 1 для первого появления ?. Поэтому вы можете изменить строку запроса как:

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

 Смежные вопросы

  • Нет связанных вопросов^_^