金额模糊搜索查询,支持简单表达式
原创地址:https://blog.csdn.net/QQ826688096/article/details/89075836
想要实现一个功能,就是,在页面的查询条件里面,可以在一个输入框里面,让用户可以
模糊搜索金额;支持像 >、>=、<、<=、=、>=20,<=50等一些基本的运算符的表达式。
输入框的Title 可以设置为:
请输入要查询的金额范围,例如:
大于某个数值:>5000,表示支出金额大于5000元
大于等于数值:>=500,表示支出金额大于并包含500元
金额区间数值:>=500,<=1000,表示大于等于500并且小于等于1000元
【注意:请使用英文模式下的符号】
输入框的默认placeholder提示内容可以设置为:~ 例如:>=500,<=1000 ~
设计步骤:
1,jsp页面代码
<td title="请输入要查询的金额范围,例如: 大于某个数值:>5000,表示支出金额大于5000元 大于等于数值:>=500,表示支出金额大于并包含500元 金额区间数值:>=500,<=1000,表示大于等于500并且小于等于1000元 【注意:请使用英文模式下的符号】">
<input class="" type="text" id="jine_like" name="jine_like" value="${xmtjPage.jine_like}" placeholder="~ 例如:>=500,<=1000 ~" />
</td>
说明: :就是一个回车换行的制表符。
placeholder:就是html等文件中的输入框(如input)值为空的时候的默认显示,注意,这只是显示,当鼠标键入的时候,该提示会消失。
2,java控制代码
@RequestMapping("/queryXmZctjList")
public String queryXmZctjList(Model modelXmtjPage xmtjPage) {
String jine_like_demo = xmtjPage.getJine_like();
if(checkNumber(xmtjPage.getJine_like())){//校验查询条件的金额是否合法
String dmeo1 = xmtjPage.getJine_like();
if(null!=dmeo1 &&dmeo1.indexOf(",") != -1){
dmeo1 = dmeo1.replace(",", " and to_number(nvl(t.sjbxje,0)) ");
xmtjPage.setJine_like(dmeo1);
}
}else{
xmtjPage.setJine_like("");
model.addAttribute("errMes", "您输入的查询条件含有不允许的字符,请检查后重新操作");
}
List<ZctjEntity> zctjList = xmwhService.query(xmtjPage);
model.addAttribute("zctjList", zctjList);
xmtjPage.setJine_like(jine_like_demo);
return "/../../listZctj";
}
checkNumber( )方法:校验用户输入的 字符串是否合法
说明:这个方法时很有必要的,可以检测并控制用户的输入,防止一些人输入一些非法字符导致系统报错,甚至SQL脚本注入等危险操作的发生(这也只是我临时写的,很有可能把控的不够严谨,不吝赐教!)。
// 校验字符串是否合法
public boolean checkNumber(String str) {
boolean bb = true;
if (null != str && !"".equals(str)) {
if (containsStr(str)) {
bb = false;
}
if (str.indexOf("《") != -1 || str.indexOf("》") != -1 || str.indexOf(",") != -1 || str.indexOf("。") != -1) {
bb = false;
}
if (null != str && str.indexOf(",") != -1) {
str = str.replace(",", " and sa.aass ");
}
try {
kkssqService.query("xmwh.queryResultByDual", str);// 测试是否可以通过sql语法校验
} catch (Exception e) {
bb = false;
}
}
return bb;
}
containsStr( )方法:检查是否包含英文字母
//检查是否包含英文字母
public boolean containsStr(String cardNum) {
String regex=".*[a-zA-Z]+.*";
Matcher m=Pattern.compile(regex).matcher(cardNum);
return m.matches();
}
3,xml中sql控制
在xml(sql管理)里面,方法的合适位置写上java处理好的金额模糊查询的条件
注意:这里必须使用 j i n e l i k e jine_like jinelike,而不能使用常用的 #jine_like# 来取值了,因为java后台传递过来的参数值中包含敏感字符。
where 1=1
<isNotEmpty prepend="and" property="jine_like">
(to_number(nvl(t.sjbxje,0)) $jine_like$ )
</isNotEmpty>
例如我们输入的是: >=300,<1500
断点到这里的时候,我们看到了前端传递过来的值如下图:
然后,经过方法的合法性检查、处理后,得到如下参数:
这时候,我们看控制台打印出来的最终的执行sql的where条件那块代码是这样的:
....
where 1 = 1 and (to_number(nvl(t.sjbxje, 0)) >= 300 and to_number(nvl(t.sjbxje, 0)) < 1500)
现在我们回头看页面的话,页面的查询结果就是我们按照金额的范围来查询出的结果: