mysql多條件過濾查詢之mysq高階查詢

一樂樂發表於2021-12-30

一、什麼是高階查詢:

① 多條件的過濾查詢

簡單說,即拼接sql語句,在sql查詢語句之後使用:

where 條件1  and/or 條件2 and/or 條件3 …

② 分頁查詢


二、多條件過濾查詢:

1,WHERE 1=1:

​ 是一個永遠為true的條件【mysql安全注入漏洞】,通過 1=1 的條件,避免判斷where後邊應該接收那個欄位【考慮到拼接的幾個欄位都為空】。

   	StringBuilder sql = new StringBuilder();
   	sql.append(" WHERE 1=1");
   	// 拼接姓名
   	if (StringUtils.isNotBlank(name)) {
   		sql.append(" AND name LIKE ?");		
   		parameters.add("%" + name + "%");
   	}
   	// 拼接最小年齡
   	if (minAge != null) {
   		sql.append(" AND age >= ?");	
   		parameters.add(minAge);
   	}

2、WHERE 1=1 問題:影響效能,因為不能使用索引查詢了。

解決where 1=1 索引問題【定義一個容器,當容器放進了條件,取出容器的條件(第一個條件前拼接上where,其他拼接and)

sql.append(" WHERE ");
//利用Apached 的元件 Apache commons-lang 元件:StringUtils的join方法:把集合中每個元素使用特定的字串連線起來
sql.append(StringUtils.join(conditions, " AND "));


3、思維:封裝與職責分離

1:封裝:引數過多應該封裝成一個物件

2:職責分離:誰擁有該資料,誰就應該包含操作該資料的方法



4、關鍵字查詢(從多個列中做查詢)

例如:查詢商品名稱中或者商品品牌中帶有'中國'。

細節:AND的優先順序高於OR 關鍵字查詢的多列查詢拼接sql要記得使用()括起來

   //暴露給子類:讓子類在customizedQuery中呼叫,新增位元組的查詢條件和引數
	protected void addQuery(String condition, Object... param) {
		//細節:不定長的引數是陣列----集合parameters.add(陣列)是將陣列作為一個元素新增進來
		//解決:先將陣列轉成集合,然後集合parameters.addAll(集合)
		this.conditions.add(condition);
		this.parameters.addAll(Arrays.asList(param));
	}


	//拼接關鍵詞
	if (keyword != null) {
		super.addQuery("(name LIKE ? OR dormBuildId LIKE ?)","%" + keyword + "%", "%" + keyword + "%");
	}

相關文章