需求说明
概述:前端页面查询列表中有个“二级类目”的多选下拉框,用户选择二级类目后,需要从后台数据库查询条件内的数据。
目标:将前端页面传入后端的字符串例如"女性护理,美妆工具,口腔护理" 拼接为 ('女性护理','美妆工具','口腔护理')。
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
成长的速度,一定要超过父母老去的速度。