高級模糊搜索條件設置,支持簡單表達式(列表查詢條件,如金額:》=50,《=100等)

金額模糊搜索查詢,支持簡單表達式


原創地址:https://blog.csdn.net/QQ826688096/article/details/89075836

想要實現一個功能,就是,在頁面的查詢條件裏面,能夠在一個輸入框裏面,讓用戶能夠
模糊搜索金額;支持像 >、>=、<、<=、=、>=20,<=50等一些基本的運算符的表達式。javascript

在這裏插入圖片描述

輸入框的Title 能夠設置爲:
請輸入要查詢的金額範圍,例如:
大於某個數值:>5000,表示支出金額大於5000元
大於等於數值:>=500,表示支出金額大於幷包含500元
金額區間數值:>=500,<=1000,表示大於等於500而且小於等於1000元
【注意:請使用英文模式下的符號】
輸入框的默認placeholder提示內容能夠設置爲:~ 例如:>=500,<=1000 ~html

設計步驟:

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( )方法:檢查是否包含英文字母java

//檢查是否包含英文字母
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_likejinelike,而不能使用經常使用的 #jine_like# 來取值了,由於java後臺傳遞過來的參數值中包含敏感字符。sql

where 1=1
<isNotEmpty prepend="and" property="jine_like">
	(to_number(nvl(t.sjbxje,0)) $jine_like$ )
</isNotEmpty>

例如咱們輸入的是: >=300,<1500
斷點到這裏的時候,咱們看到了前端傳遞過來的值以下圖:
阿斯頓發生的發生地方
而後,通過方法的合法性檢查、處理後,獲得以下參數:
在這裏插入圖片描述app

這時候,咱們看控制檯打印出來的最終的執行sql的where條件那塊代碼是這樣的:jsp

....
where 1 = 1 and (to_number(nvl(t.sjbxje, 0)) >= 300 and to_number(nvl(t.sjbxje, 0)) < 1500)

如今咱們回頭看頁面的話,頁面的查詢結果就是咱們按照金額的範圍來查詢出的結果:
在這裏插入圖片描述測試

相關文章
相關標籤/搜索