带过滤条件查询数据库并展示到jTable,如何实现任意位置姓名模糊匹配
问题解答
语法选择结论
你的需求直接用LIKE即可,完全满足匹配字段任意位置关键词的要求,且兼容性远高于SIMILAR TO:
LIKE是所有主流关系型数据库都支持的SQL标准模糊匹配语法,用%作为通配符代表任意长度的任意字符,你只需要把用户输入的关键词前后拼接上%,就能匹配所有包含该关键词的结果,比如关键词Santos拼接为%Santos%,就可以同时匹配到Lucas Santos、Santos Jr这类结果。SIMILAR TO是PostgreSQL数据库独有的语法,支持正则表达式匹配,功能更强但兼容性极差,你的简单模糊匹配需求完全用不到正则,没必要使用。
现有代码问题修正
你当前的代码存在几个明显问题,需要同步修改:
- 你注释了
else分支,导致无论输入框是否为空,都会执行两次查询逻辑,最终jTable会被带筛选条件的查询结果覆盖,需要把else的注释放开,让两个分支互斥执行。 - 模糊匹配参数没有拼接通配符,直接塞入用户输入的内容会变成精确匹配,无法实现任意位置匹配。
- 执行查询时多余调用了一次
ps.execute(),属于冗余代码,直接删除即可。 - 建议补充资源关闭逻辑,避免数据库连接泄漏。
修正后参考代码
try{ Connection cn=DB.connector.getConnection(); String searchKey = jTextFieldNOME.getText().trim(); DefaultTableModel tm=(DefaultTableModel) jTableDADOS.getModel(); tm.setRowCount(0); if(searchKey.equals("")){ // 输入为空时查询全量数据 PreparedStatement stm=cn.prepareStatement("select cad_cpf,cad_nome,cad_apelido,cad_idade,cad_data from cad_pessoa order by cad_nome asc, cad_cpf asc nulls last"); ResultSet rs = stm.executeQuery(); 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); } stm.close(); rs.close(); }else{ // 输入不为空时走模糊查询 PreparedStatement ps=cn.prepareStatement("select cad_cpf,cad_nome,cad_apelido,cad_idade,cad_data from cad_pessoa where cad_nome like ? order by cad_nome asc, cad_cpf asc nulls last "); // 拼接前后通配符实现任意位置匹配 ps.setString(1, "%" + searchKey + "%"); ResultSet rs = ps.executeQuery(); 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); } ps.close(); rs.close(); } cn.close(); }catch (Exception e){ JOptionPane.showMessageDialog(this, e); }
内容的提问来源于stack exchange,提问作者Luís Felipe Ambrozin
相关产品推荐
相关产品推荐

