实现模糊查询时对特殊字符进行处理和对查询结果进行处理

最近正处于期末考试周,博客好久没有更新。而且代码也写的比较少所以也不知道有什么好东西分享给大家。在这次的课程设计中老师布置了一个完成信息检索的作业,我是用网页实现的。功能比较简单写了将近半天的时间就完成功能,但是我还有点意犹未尽的感觉所以自己又完善了一下细节。然后我注意到如果在实际开发中,我们要用模糊查询来进行检索那返回的结果中最好是应该把查询条件进行高亮显示的这样也算是提高用户体验。所以知道做什么了之后,马上就想到应该是在封装结果集的时候在返回的字符串结果中添加html元素(哼  我这么机智,肯定分分钟就想到了)。我的思路是在封装RowMapper的时候用已经添加了html元素的字符串替换原来的字符串(String的replace()方法)。原来的字符串也就是传到后台的查询条件。RowMapper获取查询条件的方式我用的是构造方法传参。好 解决问题的基本思路就是这样,下面请看代码:

    private class SearchByResumeRowMapper implements RowMpper<List<Info>> {
        
        private String name;
        
        public SearchByResumeRowMapper(String name) {
            this.name = name.replace("%","");
        }
        
        @Override
        public List<Info> mapperRow(ResultSet rs) throws SQLException {
            List<Info> list = new ArrayList<Info>();
            while(rs.next()){
                Info info = new Info();
                info.setTypeName(rs.getString("typeName"));
                info.setAuther(rs.getString("auther"));
                info.setResume((rs.getString("resume")).replace(name, "<b style="color:red">" + name + "</b>"));
                info.setOrigin(rs.getString("origin"));
                info.setPublishDate(rs.getString("publishDate"));
                info.setTitle(rs.getString("title"));
                
                list.add(info);
            }
            
            return list;
        }
    }

这里我只贴出来了RowMapper这个类。

这时问题来了,如果我们在页面上的查询条件写成“%”或者是“_”,这时查出来的结果就会出问题。原因是我们没有对模糊查询的特殊字符进行处理,所以对sql进行改进:

SELECT 字段 FROM info WHERE param LIKE ? ESCAPE '\';

这句sql的ESCAPE的意思是对后面的一个字符只当成普通字符处理(sql语句中用两个反斜杠是因为转义字符,其实就是一个反斜杠)。比如SELECT 字段 FROM info WHERE param LIKE '%\%%' ESCAPE '\';这句话的意思是查询含有%的param字段。(为了避免java转义字符反斜杠造成程序的混乱 这里我们可以用别的字符 比如正斜杠。楼主这里用的是反斜杠)。下面是改良过后的代码:

在servlet里对特殊字符进行处理

content = content.replace("\", "\\");
content = content.replace("_", "\_");
content = content.replace("%", "\%");
content = content.replace("[", "\["); 
content = content.replace("]", "\]");

然后下边是改良后的RowMapper

    private class SearchByResumeRowMapper implements RowMpper<List<Info>> {
        
        private String name;
        
        public SearchByResumeRowMapper(String name) {
            String tmp = name.substring(1,name.length()-1); 
            //deal the "_","%","[","]","" in result and the sequence can't be changed!
            //English of Chinese boy... sorry...
            tmp = tmp.replace("\_", "_");
            tmp = tmp.replace("\%", "%");
            tmp = tmp.replace("\[", "["); 
            tmp = tmp.replace("\]", "]");
            tmp = tmp.replace("\\", "\");
            this.name = tmp;
        }
        
        @Override
        public List<Info> mapperRow(ResultSet rs) throws SQLException {
            List<Info> list = new ArrayList<Info>();
            while(rs.next()){
                Info info = new Info();
                info.setTypeName(rs.getString("typeName"));
                info.setAuther(rs.getString("auther"));
                info.setResume((rs.getString("resume")).replace(name, "<b style="color:red">" + name + "</b>"));
                info.setOrigin(rs.getString("origin"));
                info.setPublishDate(rs.getString("publishDate"));
                info.setTitle(rs.getString("title"));
                
                list.add(info);
            }
            
            return list;
        }
    }

当然了 这只是一个很简单的小功能,但是觉得收获也挺大的,所以记录一下。

把代码放到github上了,有兴趣的可以看看,并不是正经项目就是一个课设。所以代码有些简陋。。。

点击查看代码

原文地址:https://www.cnblogs.com/Vdiao/p/6217505.html