頁面有個功能 為 根據 品牌名進行 關鍵字查詢,對應到數據庫的是brand表的name字段的模糊查詢
如果用的是SSM框架,在mybatis中我們需要自己寫sql語句,涉及到like的模糊查詢,mybatis中我們通常會使用#{}或${}來獲取pojo對象的變量值。
這兩個區別為 #{} 會在 變量外側 加上 單引號 如 select * from brand where name='牌1'
${} 並不會 加單引號 如 select * from brand where name=牌1 顯然這樣會有問題。所有通常我們用${}需自己加上單引號 如 '${name}' 。
但我們應盡量避免使用 ${} ,因為這個最終會將參數拼接到 sql語句上,存在sql注入的問題。但#{}不會,#{}類似於 hibernate中的 select * from brand where name=:name 然后再通過 query.setParameter('參數名',參數值)這種方式。
但是在 模糊查詢中 會出現一個問題, 模糊查詢通常都是 與 % 配合使用, 所以我們最終想要的結果是如下這種
select * from brand where name like '%牌%' , 也就是說 我們需要將 兩個百分號 與 ‘牌’ 這個字進行字符串拼接。
有人會 想到 用 '%${name}%' 用這種方式,但是這種方式並不好,上面說了,有sql注入的風險。
我們可以采用 and name like concat('%',#{name},'%') 這種方式來進行字符串拼接。
還有一個要說的是,我們在 mybatis 維護sql的 配置文件中。 肯定會判斷 <if test="name!=null"> 即 name這個變量是否為空。 但是如果這個對象 為 空字符串 就會大大影響我們查詢的效率。
如下所示
可以看到,我們依舊可以將數據查詢出來,但是加了一個模糊查詢的條件,這樣就降低了查詢的效率。
這種情況往往出現在 用戶 沒有輸入 關鍵字就點擊了搜索按鈕,這樣傳到后端的就是一個 空字符串,這里需要注意,當第一次進入這個頁面的時候 傳到后端的 參數為null。如下圖所示
還有一個要說的是,我們在 mybatis 維護sql的 配置文件中。 肯定會判斷 <if test="name!=null"> 即 name這個變量是否為空。 但是如果這個對象 為 空字符串 就會大大影響我們查詢的效率。
如下所示
可以看到,我們依舊可以將數據查詢出來,但是加了一個模糊查詢的條件,這樣就降低了查詢的效率。
這種情況往往出現在 用戶 沒有輸入 關鍵字就點擊了搜索按鈕,這樣傳到后端的就是一個 空字符串,這里需要注意,當第一次進入這個頁面的時候 傳到后端的 參數為null。如下圖所示
所以為了不影響 數據庫的查詢效率,我們需要 在 controller層 對 空字符串做一下處理。
如果 為空字符串 我們將其設置 為null
StringUtils 是一個 工具包,如果你也想使用 可以在maven中 添加 如下jar包
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>