實現模糊查詢時對特殊字符進行處理和對查詢結果進行處理


最近正處於期末考試周,博客好久沒有更新。而且代碼也寫的比較少所以也不知道有什么好東西分享給大家。在這次的課程設計中老師布置了一個完成信息檢索的作業,我是用網頁實現的。功能比較簡單寫了將近半天的時間就完成功能,但是我還有點意猶未盡的感覺所以自己又完善了一下細節。然后我注意到如果在實際開發中,我們要用模糊查詢來進行檢索那返回的結果中最好是應該把查詢條件進行高亮顯示的這樣也算是提高用戶體驗。所以知道做什么了之后,馬上就想到應該是在封裝結果集的時候在返回的字符串結果中添加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上了,有興趣的可以看看,並不是正經項目就是一個課設。所以代碼有些簡陋。。。

點擊查看代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM