高级模糊搜索条件设置,支持简单表达式(列表查询条件,如金额:》=50,《=100等)


原创地址: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="请输入要查询的金额范围,例如:&#10;大于某个数值:>5000,表示支出金额大于5000元&#10;大于等于数值:>=500,表示支出金额大于并包含500元&#10;金额区间数值:>=500,<=1000,表示大于等于500并且小于等于1000元&#10;【注意:请使用英文模式下的符号】">
	<input class="" type="text" id="jine_like" name="jine_like" value="${xmtjPage.jine_like}" placeholder="~ 例如:>=500,<=1000 ~" />
</td>

说明: &#10; 	 :就是一个回车换行的制表符。
	  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处理好的金额模糊查询的条件
注意:这里必须使用 jinelikejine_like,而不能使用常用的 #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)

现在我们回头看页面的话,页面的查询结果就是我们按照金额的范围来查询出的结果:
在这里插入图片描述

原文地址:https://www.cnblogs.com/QQ826688096/p/10713376.html