Java Swing实现数据库多筛选搜索时jTextField非空判断及else if异常问题
问题根因与修复方案
核心问题1:空值判断逻辑错误
JTextField的getText()方法默认返回空字符串"",永远不会返回null,你写的jTextFieldNOME.getText() != null判断结果永远为真,只要进入else if分支就会第一个触发,后面的分支永远不会执行。
核心问题2:互斥分支逻辑不支持多条件组合查询
你现在用的else if是互斥逻辑,即便空值判断修复了,也只能支持单个条件查询,无法满足用户同时输入姓名和昵称两个条件检索的需求。
其他冗余问题
代码中先调用executeQuery()获取结果集,又调用ps.execute()属于重复执行SQL,无意义可以直接删除。
修复方案
第一步:统一空值判断方法
先封装一个判断输入框是否为空的逻辑,避免重复代码,同时兼容用户输入全空格的场景:
// 判断输入框是否有有效输入(非空且不是全空格) private boolean isTextFieldNotEmpty(JTextField field) { return field.getText() != null && !field.getText().trim().isEmpty(); }
第二步:改用动态拼接SQL的方式实现多条件查询
不要写死多个互斥分支,动态拼接WHERE条件,支持任意组合的筛选:
try { DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel(); tm.setRowCount(0); // 基础SQL,加1=1方便后续拼接条件 StringBuilder sql = new StringBuilder("select cad_cpf, cad_nome, cad_apelido, cad_idade, cad_data from cad_pessoa where 1=1 "); List<Object> params = new ArrayList<>(); // 逐个判断输入框,动态拼接查询条件 if (isTextFieldNotEmpty(jTextFieldNOME)) { sql.append("and cad_nome like ? "); params.add("%" + jTextFieldNOME.getText().trim() + "%"); } if (isTextFieldNotEmpty(jTextFieldCPF)) { sql.append("and cad_cpf like ? "); params.add("%" + jTextFieldCPF.getText().trim() + "%"); } if (isTextFieldNotEmpty(jTextFieldAPELIDO)) { sql.append("and cad_apelido like ? "); params.add("%" + jTextFieldAPELIDO.getText().trim() + "%"); } if (isTextFieldNotEmpty(jTextFieldIDADEMIN)) { sql.append("and cad_idade >= ? "); params.add(Integer.parseInt(jTextFieldIDADEMIN.getText().trim())); } if (isTextFieldNotEmpty(jTextFieldIDADEMAX)) { sql.append("and cad_idade <= ? "); params.add(Integer.parseInt(jTextFieldIDADEMAX.getText().trim())); } // 拼接排序规则 sql.append("order by cad_nome asc, cad_cpf asc nulls last "); // 预编译SQL并填充参数 PreparedStatement ps = cn.prepareStatement(sql.toString()); for (int i = 0; i < params.size(); i++) { ps.setObject(i+1, params.get(i)); } ResultSet rs = ps.executeQuery(); // 填充jTable数据 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); } } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "查询失败:" + e.getMessage()); }
第三步:全空输入场景兼容
如果所有输入框都为空,上述动态SQL逻辑已经自动兼容查询全量数据的需求,不需要单独写if分支判断,也可以根据业务需要自行增加全空时的提示逻辑。
内容的提问来源于stack exchange,提问作者Luís Felipe Ambrozin
相关产品推荐
相关产品推荐

