一、什麼是高階查詢:
① 多條件的過濾查詢
簡單說,即拼接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 + "%");
}