序言:
最近, 笔者整理了一些 曾经在江湖闯荡(在小黑屋中码代码) 中遇到的一些问题所总结的招式秘籍: 拿走不谢
一.拆招
写过web 的童鞋们 肯定会遇到一个多条件查询
的场景, 注意: 本文针对的是多条件查询,如果你的后台就处理3个以下的参数, (别走,你以后会遇到的! 看看吧)
OK ,这么多参数我们少不了进行类型转换
后 才会去调用后台业务代码
一般对于这么多参数我们无非两种处理:
-
直接用对象作为形参
使用对象传参的同学, 估计和笔者一样 偷懒的萌芽从一开始就已经在蠢蠢欲动,
首先, 这样做肯定没有问题, 但是(套路就是这样来的…) 不可避免要解决这样两个 问题:- 如果请求参数为空, 而恰好处理业务时, 数据库要求该字段非空
你是直接修改数据库呢? 还是要跟该对象分手呢?(那就意味者你得让客户做你的玩偶, 指哪打哪, 醒醒…) - 前台只传一个参数, 你却用一个对象保存
很显然, 资源消耗大, 没有必要为了一个参数 而用一个对象保存, 如果你真的这样搞, 老板请你喝茶也快到了
- 如果请求参数为空, 而恰好处理业务时, 数据库要求该字段非空
当然这种方式并不是没有用武之地, 对于插入数据 或者更修改数据 它还是不二之选, 只不过这个应用场景决定它的局限性
-
web传参,多多益善
这种方式, 那就是在需求分析
时 充分考虑了多条件查询的所有情况
即:每个查询条件都单独作为参数传递
这种方式的优点:-
为了避免非空参数传递, 可以通过
required=false
指定非必须参数
很显然,如果前台参数为空 ,那后台完全不需要care, 我只接受非空的参数 -
按需接收参数, 自然不会有资源损耗问题
相反还节省了不少流量 -
直接操作参数, 快速类型转换
这个相比上面是明显优势,:我们多数情况都需要对前台参数进一步的处理,这其中多半类型转换占了大部分
如果使用对象接受参数 你还需要调用对象的get方法
进行处理 , 完了之后还要set回去
直接传参 那就可以直接进行类型转换 ,从代码量上那都是嗖嗖的
-
不过,它的缺点也显而易见,就是前期在dao层编写的代码量有点恐怖
二. 修炼
Ok,说了这么多, 来看看笔者的一个不敢说有多完美的实现(针对第二种方式), 装一下足够了
注意: 我下面的意图是将前台的传来的参数 统一转换为整形处理
- 特别注意两个形参
首先这两个数组长度相同, 所以
第一个参数:用来唯一标识第二个参数的,并最终作为map.key
第二个参数:是前台参数集合 最终统一进行类型转换后作为map.value
/**
* 将请求参数转为整形后 存储在map中
* 便于统一异常处理 和 获取
* @param paramStr map.key
* @param params map.value
* @return value值为Integer的map
*/
private HashMap<String, Integer> getIntegerParamsMap(String[] paramStr, String[] params) {
HashMap<String, Integer> paramMap = new HashMap<>();
if(Objects.isNull(params) || params.length == 0)
return paramMap;
//key 和 value 长度必须对应
if(paramStr.length != params.length)
return paramMap;
for (int i = 0; i < paramStr.length; i++) {
if(!Objects.isNull(params[i]) && !("").equals(params[i])){
try {
Integer newParam = Integer.valueOf(params[i].trim());
paramMap.put(paramStr[i], newParam);
} catch (NumberFormatException e) {
throw new NumberFormatException(paramStr[i]+"输入类型不匹配, 请检查后再试!");
}
}
}
return paramMap;
}
通过上面的函数封装 可以发现这样几个优点
- 实现类型统一转换
- 统一处理异常, 同时还能精准定位是那个参数类型转换异常
- 代码量少, 这才是很多大佬毕生追求的方向
几点建议:
- 你可以直接copy这个code 到你的项目中, 但是呢一定注意保证两个形参长度一致(这个只要眼神还行,基本不会错)
- 还需要保证表示value的数组中不能有相同的key