使用任何过滤器在数据库中搜索

Posted

技术标签:

【中文标题】使用任何过滤器在数据库中搜索【英文标题】:Searching in database with any filter 【发布时间】:2021-12-12 03:31:51 【问题描述】:

我创建了一个带有 jTable 的 GUI 来向用户显示数据,用户可以使用他想要的任何过滤器进行搜索,但是,我需要用 jTextField 来识别是空的还是填充的。 那么,如何检查一个 jTextField 是否为空并让 else if 有效?

例如,用户插入一个名称 (jTextFieldNOME) 并单击 jButton 而没有在另一个 jTextField 中写入(还有另外 3 或 4 个 jTextField 遵循类似的模式)。

现在发生的只是运行第一个 else if:else if(jTextFieldNOME.getText() != null)

if(jTextFieldNOME.getText().equals("") && jTextFieldCPF.getText().equals("") && jTextFieldAPELIDO.getText().equals("") && jTextFieldIDADEMIN.getText().equals("") && jTextFieldIDADEMAX.getText().equals(""))

            JOptionPane.showMessageDialog(null, "Vazios\n");
            PreparedStatement stm=cn.prepareStatement("select * from cad_pessoa ");
            ResultSet rs = stm.executeQuery();
            
            DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
            tm.setRowCount(0);
        
        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);
                
        
            
        

        else if(jTextFieldNOME.getText() != null) 
        
        PreparedStatement ps=cn.prepareStatement("select cad_nome,cad_apelido,cad_cpf,cad_idade,cad_data from cad_pessoa where cad_nome like ? order by cad_nome asc, cad_cpf asc nulls last ");
        ps.setString(1,"%" + jTextFieldNOME.getText() + "%");

            ResultSet rs = ps.executeQuery();
            ps.execute();
            
        
        DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
        tm.setRowCount(0);
        JOptionPane.showMessageDialog(null, "nomes\n");
        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);
            
            
        
        
        
        else if (jTextFieldAPELIDO.getText() != null)
            
            PreparedStatement ps=cn.prepareStatement("select cad_nome,cad_apelido,cad_cpf,cad_idade,cad_data from cad_pessoa where cad_apelido like ? order by cad_nome asc, cad_cpf asc nulls last ");
        ps.setString(1,"%" + jTextFieldAPELIDO.getText() + "%");

            ResultSet rs = ps.executeQuery();
            ps.execute();
            
        
        DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
        tm.setRowCount(0);
        JOptionPane.showMessageDialog(null, "apelidos\n");
        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);

        
        
        

【问题讨论】:

【参考方案1】:

好的,经过这里的一些研究和一些教程,这就是我所做的:

为了解决空的jTextField 并且仍然运行我不想要的if 的问题,使用get length,在去数据库中搜索之前输入一些这个jTextField 需要的字母或数字。

代码如下:

if(jTextFieldNOME.getText().equals("") && jTextFieldCPF.getText().equals("") && jTextFieldAPELIDO.getText().equals("") && jTextFieldIDADEMIN.getText().equals("") && jTextFieldIDADEMAX.getText().equals(""))

            JOptionPane.showMessageDialog(null, "Vazios\n");
            PreparedStatement stm=cn.prepareStatement("select * from cad_pessoa ");
            ResultSet rs = stm.executeQuery();
            
            DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
            tm.setRowCount(0);
        
        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);
                
        
            
        

        else if(jTextFieldNOME.getText().length()>2) 
        
        PreparedStatement ps=cn.prepareStatement("select cad_nome,cad_apelido,cad_cpf,cad_idade,cad_data from cad_pessoa where cad_nome like ? order by cad_nome asc, cad_cpf asc nulls last ");
        ps.setString(1,"%" + jTextFieldNOME.getText() + "%");

            ResultSet rs = ps.executeQuery();
            ps.execute();
            
        
        DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
        tm.setRowCount(0);

        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);
            
            
        
        
        
        else if (jTextFieldAPELIDO.getText().length()>2)
            
            PreparedStatement ps=cn.prepareStatement("select cad_nome,cad_apelido,cad_cpf,cad_idade,cad_data from cad_pessoa where cad_apelido like ? order by cad_nome asc, cad_cpf asc nulls last ");
        ps.setString(1,"%" + jTextFieldAPELIDO.getText() + "%");

            ResultSet rs = ps.executeQuery();
            ps.execute();
            
        
        DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel();
        tm.setRowCount(0);

        while(rs.next())
            
            Object o []= rs.getString("cad_cpf"), rs.getString("cad_nome"), rs.getString("cad_apelido"), rs.getString("cad_idade"), rs.getDate("cad_data");
            tm.addRow(o);

        
        
        

就我而言,仅 2 个字节就足以进行搜索并显示在我的 jTable

【讨论】:

以上是关于使用任何过滤器在数据库中搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用全文搜索和其他条件搜索1300万条记录

我可以在Firestore搜索中过滤多个字段吗?

在编辑任何输入时呈现数据表单列表?

Vuejs 搜索栏过滤器不返回结果

如何使用 nodejs 和 express 在 REST API 中实现搜索和过滤

PHP MySQL & AJAX 搜索过滤器时间延迟