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數(shù)據(jù)庫進(jìn)行多字段模糊查詢(Like)
在mysql中使用Like進(jìn)行一些簡單輕量級的查詢,并不需要考慮太多效率問題。
一、Like單字段查詢比較簡單。
沒有特殊要求的話,直接使用%關(guān)鍵字%就進(jìn)行左右匹配查詢
.....<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>
那如果我需要查詢多個字段,比如一個輸入框,既可以輸入姓名也可以輸入電話、手機進(jìn)行查詢,又該如何呢?
二、關(guān)于多字段查詢,這里有兩個方式可供參考:
1、對多個字段分別查詢,使用OR連接,這種方式效率在數(shù)據(jù)量大時,效率很差
.....<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將多個字段拼接之后在進(jìn)行模糊查詢,相比第一種更推薦第二種,執(zhí)行效率更好
.....<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,這將導(dǎo)致你查不到正確數(shù)據(jù)。為了確保不為NULL,使用 IFNULL判斷下就可以了
IFNULL() 函數(shù)用于判斷第一個表達(dá)式是否為 NULL,如果為 NULL 則返回第二個參數(shù)的值,如果不為 NULL 則返回第一個參數(shù)的值。
以上這篇Mybatis多個字段模糊匹配同一個值的案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. db2v8的pdf文檔資料2. DB2比較常用與實用sql語句總結(jié)3. MySQL分支選擇參考:Percona還是MariaDB4. short int、long、float、double使用問題說明5. MySQL數(shù)據(jù)庫基礎(chǔ)學(xué)習(xí)之JSON函數(shù)各類操作詳解6. 恢復(fù)從 Access 2000、 Access 2002 或 Access 2003 中數(shù)據(jù)庫刪除表的方法7. db2 導(dǎo)入導(dǎo)出單個表的操作詳解8. 關(guān)于MariaDB安裝問題小記(CMake Error at)9. MySQL導(dǎo)入sql文件的三種方法小結(jié)10. Oracle中分割字符串的方法實例代碼
