需求:
搜索框中可輸入手機號,姓名,地址查詢,后臺需要對一個框中的多個字段做匹配查詢。
搜索
可以在sql語句中做拼接條件查詢:
1
2
3
|
<if test= "condition!=null and condition!=''" > AND CONCAT(r. name ,a. name ,a.phone,a.addr_detail) LIKE '%' #{condition} '%' </if> |
補充知識:在Mybatis xml使用mysql數據庫進行多字段模糊查詢(Like)
在mysql中使用Like進行一些簡單輕量級的查詢,并不需要考慮太多效率問題。
一、Like單字段查詢比較簡單。
沒有特殊要求的話,直接使用%關鍵字%就進行左右匹配查詢
1
2
3
4
5
6
7
8
9
10
11
12
|
..... <mapper..> ... < select ...> SELECT c.* FROM contacts c WHERE c.delete_time IS NULL <if test= "keyWord != null and keyWord != ''" > AND c. name LIKE concat( '%' ,#{keyWord}, '%' )} </if> ORDER BY c.create_time DESC < select > </mapper> |
那如果我需要查詢多個字段,比如一個輸入框,既可以輸入姓名也可以輸入電話、手機進行查詢,又該如何呢?
二、關于多字段查詢,這里有兩個方式可供參考:
1、對多個字段分別查詢,使用OR連接,這種方式效率在數據量大時,效率很差
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
..... <mapper..> ... < select ...> SELECT c.* FROM contacts c WHERE c.delete_time IS NULL <if test= "keyWord != null and keyWord != ''" > AND c. name LIKE concat( '%' ,#{keyWord}, '%' )} OR c.mobile LIKE concat( '%' ,#{keyWord}, '%' )} OR c.telphone LIKE concat( '%' ,#{keyWord}, '%' )} </if> ORDER BY c.create_time DESC < select > </mapper> |
2、使用concat將多個字段拼接之后在進行模糊查詢,相比第一種更推薦第二種,執行效率更好
1
2
3
4
5
6
7
8
9
10
11
12
|
..... <mapper..> ... < select ...> SELECT c.* FROM contacts c WHERE c.delete_time IS NULL <if test= "keyWord != null and keyWord != ''" > AND CONCAT(IFNULL(c. name , '' ),IFNULL(c.mobile, '' ),IFNULL(c.telephone, '' )) LIKE concat( '%' ,#{keyWord}, '%' )} </if> ORDER BY c.create_time DESC < select > </mapper> |
特別提醒:由于CONCAT中只要有一個為NULL,則會返回NULL,這將導致你查不到正確數據。為了確保不為NULL,使用 IFNULL判斷下就可以了
IFNULL() 函數用于判斷第一個表達式是否為 NULL,如果為 NULL 則返回第二個參數的值,如果不為 NULL 則返回第一個參數的值。
以上這篇Mybatis多個字段模糊匹配同一個值的案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/xqnode/article/details/77654435