需求說明
概述:前端頁面查詢列表中有個“二級類目”的多選下拉框,用戶選擇二級類目后,需要從后台數據庫查詢條件內的數據。
目標:將前端頁面傳入后端的字符串例如"女性護理,美妝工具,口腔護理" 拼接為 ('女性護理','美妝工具','口腔護理')。
xxVo.java
/** * 添加二級類目字段以及Getter和Setter方法 */ private String secondCateNames; public String getSecondCateNames() { return secondCateNames; } public void setSecondCateNames(String secondCateNames) { this.secondCateNames = secondCateNames; }
Mapper.java
//二級類目查詢 //方法一 if (StringUtils.isNoneBlank(vo.getSecondCateNames())) { String[] strArr = vo.getSecondCateNames().split(","); StringBuilder strBuilder = new StringBuilder(); for (int i = 0; i < strArr.length; i++) { strBuilder.append("'").append(strArr[i]).append("'").append(","); } sql.append(" AND eod.second_cate_name in (" + strBuilder.substring(0, strBuilder.length()-1 ) + ")"); } //方法二 運用Java8中的Stream表達式(推薦),告別For循環 if (StringUtils.isNotBlank(vo.getSecondCateNames())) { //拼接前后單引號 String[] split = vo.getSecondCateNames().split(","); List<String> secondCateNameList = Arrays.asList(split).stream().filter(Objects::nonNull) .map(secondCateName -> "'" + secondCateName + "'").collect(Collectors.toList()); sql.append(" AND eod.second_cate_name in (") .append(StringUtils.join(secondCateNameList, ",")).append(")"); }
其中最后使用的StringUtils.join(final Iterable<?> iterable, final String separator)等價於使用
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix),該方法接受一個字符串序列作為拼接符,並在拼接完成后添加傳遞的前綴和后綴。
//方法一 sql.append(" AND eod.second_cate_name in (").append(StringUtils.join(secondCateNameList, ",")).append(")"); //方法二 sql.append(" AND eod.second_cate_name in ").append(secondCateNameList.stream().collect(Collectors.joining(",","(",")")));
實例DEMO
/** * @author liao.wenhui * @date 2019/7/15 10:49 * 目標是將"女性護理,美妝工具,口腔護理" -> ('女性護理','美妝工具','口腔護理') */ public class secondCateNameList { public static void main(String[] args) { //假設前端用戶在多選框勾選后傳入后端VO的二級類目字符串為secondCateNames String secondCateNames = "女性護理,美妝工具,口腔護理"; //將字符串轉換成數組,使用apache的StringUtils.split(string,char) String[] split = StringUtils.splitString(secondCateNames,","); //使用Stream轉換,過濾,用單引號進行拼接。 List<String> secondCateNameList = Arrays.asList(split).stream().filter(Objects::nonNull) .map(secondCateName -> "'" + secondCateName + "'").collect(Collectors.toList()); System.out.println("secondCateNameList:"+secondCateNameList); //將集合轉換成字符串 //方法一:join(Collection var0, String var1) String a = StringUtils.join(secondCateNameList, ","); System.out.println("AND eod.second_cate_name in("+ a + ")"); //方法二:joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) String b = secondCateNameList.stream().collect(Collectors.joining(",","(",")")); System.out.println("AND eod.second_cate_name in"+ b); } }
如您對Java8中的Stream流不熟悉,可閱讀博主--雨點的名字寫的Java8 Stream
成長的速度,一定要超過父母老去的速度。