1. 程式人生 > 程式設計 >Mybatis多個欄位模糊匹配同一個值的案例

Mybatis多個欄位模糊匹配同一個值的案例

需求:

搜尋框中可輸入手機號,姓名,地址查詢,後臺需要對一個框中的多個欄位做匹配查詢。

搜尋

Mybatis多個欄位模糊匹配同一個值的案例

可以在sql語句中做拼接條件查詢:

<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單欄位查詢比較簡單。

沒有特殊要求的話,直接使用%關鍵字%就進行左右匹配查詢

.....
<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連線,這種方式效率在資料量大時,效率很差

.....
<mapper..>
  ...
  <select...>
    SELECT c.* FROM contacts c
    WHERE c.delete_time IS NULL
    <if test="keyWord != null and keyWord != ''">
      AND c.name LIKE concat('%','%')}
      OR c.mobile LIKE concat('%','%')}
      OR c.telphone LIKE concat('%','%')}
    </if>
    ORDER BY c.create_time DESC
  <select>
</mapper>

2、使用concat將多個欄位拼接之後在進行模糊查詢,相比第一種更推薦第二種,執行效率更好

.....
<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('%','%')}
    </if>
    ORDER BY c.create_time DESC
  <select>
</mapper>

特別提醒:由於CONCAT中只要有一個為NULL,則會返回NULL,這將導致你查不到正確資料。為了確保不為NULL,使用 IFNULL判斷下就可以了

IFNULL() 函式用於判斷第一個表示式是否為 NULL,如果為 NULL 則返回第二個引數的值,如果不為 NULL 則返回第一個引數的值。

以上這篇Mybatis多個欄位模糊匹配同一個值的案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。