本文共 1897 字,大约阅读时间需要 6 分钟。
前段时间我在开发项目的时候,就关于模糊查询遇到了一点问题,主要是有两大问题:1、通配符问题;2、不连续关键字查询。下面我一一说出我是怎么解决的:
1、统配符问题
比如说在搜索框中输入'%'、'_'、'/'时会出错,因为这些特殊符号在sql语句查询的时候是有他特定的意义的,所有这里要对前台传过来的keyword搜索内容进行排除通配符处理,我是在工具类中写了一个方法代码如下:
/**
* 根据搜索特殊字符串 * @param id * @return 取不到返回null */ public static String specialStr(String str){ Integer index=str.indexOf("%"); Integer index1=str.indexOf("_"); Integer index2=str.indexOf("\\"); StringBuffer stringBuffer = new StringBuffer(str); if(index!=-1) { stringBuffer.insert(index, "\\"); } if(index1!=-1) { stringBuffer.insert(index1, "\\"); } if(index2!=-1) { stringBuffer.insert(index2, "\\"); } return stringBuffer.toString(); }然后在controller层导入该工具类,使用specialStr方法就ok了,代码如下:
String keyword = request.getParameter("keyword");
String keyword1 = ""; if (!"".equals(keyword) && keyword != null) { keyword1 = CommonUtils.specialStr(request.getParameter("keyword"));// 排除%等通配符}最后将keyword1作为搜索内容带到数据库中查询就行了。
2、不连续关键字查询
当在搜索框中输入不连续的关键字时,也能从数据库中搜索的到该内容,就比如:我想搜索公司名称为阿里巴巴的数据信息时,我输入阿巴也能搜索的到阿里巴巴,这该怎么处理呢?其实很简单,也是写一个工具类,将搜索框中的字符串每两个字符之间都加上一个‘%’就ok了,具体代码如下:
public static String specialStrKeyword(String str){ if(str==null||str==""){ return null; } StringBuffer stringBuffer = new StringBuffer(str); int length=str.length(); for (int i = 0; i <length; i++) { char chari=stringBuffer.charAt(i); if(i==0){ if(chari=='%'||chari=='_'||chari=='\\'){ stringBuffer.insert(i, "\\"); i++; length++; } }else{ if(chari=='%'||chari=='_'||chari=='\\'){ stringBuffer.insert(i, "%\\"); i+=2; length+=2; }else{ stringBuffer.insert(i, "%"); i++; length++; } } } return stringBuffer.toString(); }同样在controller层导入该工具类,使用specialStrKeyword方法就ok了,代码如下:
String keyword = request.getParameter("keyword");
String keyword1 = ''; if (!"".equals(keyword) && keyword != null) { keyword1 = CommonUtils.specialStr(request.getParameter("keyword"));// 排除%等通配符 keyword1 = CommonUtils.specialStrKeyword(keyword1); }最后将keyword1作为搜索内容带到数据库中查询就行了。
转载地址:http://rungi.baihongyu.com/