mybatis中模糊查詢的使用以及一些細節問題的注意事項


頁面有個功能 為 根據 品牌名進行 關鍵字查詢,對應到數據庫的是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>
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM