多字段非連續模糊查詢java實現

  工做須要,寫了一個實現數據庫多字段模糊查詢的方法,背景是輸入用戶的信息,如用戶的userid,姓名,拼音等,能夠查出相關的用戶數據庫

  具體以下app

  1. 操做一張表,能夠設置表前綴測試

  2. 能夠實現中文的不連續查詢(如經過輸入中國能夠查出中華人民共和國)ui

  3. 能夠實現以輸入文字開頭的字段的查詢spa

  4. 能夠實現包含輸入文字的字段的查詢code

  5. 能夠自定義是否加and前綴blog

  6. 能夠實現大小寫不敏感的查詢開發

  7. 能夠實現預編譯的查詢語句字符串

  很少說,上代碼編譯

/** * 構建一個不連續文字的模糊查詢語句:如經過手資能夠查到手術資料 * @param searchStr 檢索字符串 * @param tabPrefix 表前綴 * @param likeFields 比較字段 * @param preAnd 是否在語句前加and * @param chineseDisContinuousSearch 檢索內容含中文才進行不連續查詢,不然進行連續查詢 * @param startMatch 檢索是否從字段開頭進行匹配 * @param isPreparedStatement 是不是預編譯語句(將參數用?代替) * @return
     */
    public static String buildProFuzzySearch(String searchStr, String tabPrefix, String[] likeFields,   boolean preAnd, boolean chineseDisContinuousSearch, boolean startMatch, boolean isPreparedStatement) { StringBuilder result = new StringBuilder(); StringBuilder tempBuilder = new StringBuilder(); if(StringUtils.isNotEmpty(searchStr) && null != likeFields && likeFields.length > 0) { if(preAnd) { result.append("and "); } result.append("("); searchStr = searchStr.toUpperCase(); if(!chineseDisContinuousSearch || !isContainChinese(searchStr))//chineseDisContinuousSearch爲false或者不包含中文(連續查詢)
 { for(int i = 0, length = likeFields.length; i < length; i++) { if(tempBuilder.length() > 0) { tempBuilder.append("or "); } tempBuilder.append("UPPER("); if(StringUtils.isNotEmpty(tabPrefix)) { tempBuilder.append(tabPrefix).append("."); } tempBuilder.append(likeFields[i]).append(") ").append("like "); if(isPreparedStatement) { tempBuilder.append("? "); } else { if(startMatch) { tempBuilder.append("'"); } else { tempBuilder.append("'%"); } tempBuilder.append(searchStr).append("%' "); } } } else//chineseDisContinuousSearch爲ture且包含中文時(不連續查詢)
 { for(int i = 0, length = likeFields.length; i < length; i++) { if(tempBuilder.length() > 0) { tempBuilder.append("or "); } tempBuilder.append("UPPER("); if(StringUtils.isNotEmpty(tabPrefix)) { tempBuilder.append(tabPrefix).append("."); } tempBuilder.append(likeFields[i]).append(") ").append("like "); if(isPreparedStatement) { tempBuilder.append("? "); } else { char[] searchChars = searchStr.toCharArray(); tempBuilder.append("'%"); for(int j = 0, charLength = searchChars.length; j < charLength; j++) { tempBuilder.append(String.valueOf(searchChars[j])).append("%"); } tempBuilder.append("' "); } } } result.append(tempBuilder.toString()); result.append(")"); } return result.toString(); } 

  public static boolean isContainChinese(String str) {
        
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        return m.find();
    }

  下面看一下測試效果

  測試代碼:

public static void main(String[] args) { String searchStr = "張三"; String tabPrefix = "user"; String[] likeFields = {"userID", "userName", "PY"};
        System.out.println("中文不連續檢索,不加and前綴,非預編譯形式:"); System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, false, true, false, false)); System.out.println("連續檢索,不加and前綴,非預編譯形式,非開頭匹配:"); System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, false, false, false, false)); System.out.println("連續檢索,加and前綴,非預編譯形式,開頭匹配:"); System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, true, false, true, false)); System.out.println("加and前綴,預編譯形式:"); System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, true, false, true, true)); System.out.println("中文不連續檢索,不加表前綴,加and前綴,非預編譯形式:"); System.out.println(buildProFuzzySearch(searchStr, null, likeFields, true, true, true, false)); }

  測試結果:

  要說明的是,有些參數會覆蓋其它參數的效果,如設置最後一個參數爲true,預編譯形式,那麼開頭匹配,連續匹配,中文不連續匹配均失效;若是爲中文不連續匹配,且檢索字符串中含中文,那麼開頭匹配,預編譯參數失效等。

  有相似需求的能夠修改上面的代碼以知足本身的實際須要,代碼沒有什麼難的,只是在作一個功能的時候就想把相似能夠會用到的狀況都考慮一下,方便下次使用,或者下次只要在原有的基礎上進行少許的修改,提升開發效率,同時養成一個觸類旁通,多方面考慮的好習慣。

相關文章
相關標籤/搜索