Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例
需求:
搜索框中可輸入手機(jī)號(hào),姓名,地址查詢,后臺(tái)需要對(duì)一個(gè)框中的多個(gè)字段做匹配查詢。
搜索

可以在sql語句中做拼接條件查詢:
<if test="condition!=null and condition!=''">
AND CONCAT(r.name,a.name,a.phone,a.addr_detail) LIKE '%' #{condition} '%'
</if>
補(bǔ)充知識(shí):在Mybatis xml使用mysql數(shù)據(jù)庫進(jìn)行多字段模糊查詢(Like)
在mysql中使用Like進(jìn)行一些簡(jiǎn)單輕量級(jí)的查詢,并不需要考慮太多效率問題。
一、Like單字段查詢比較簡(jiǎn)單。
沒有特殊要求的話,直接使用%關(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>
那如果我需要查詢多個(gè)字段,比如一個(gè)輸入框,既可以輸入姓名也可以輸入電話、手機(jī)進(jìn)行查詢,又該如何呢?
二、關(guān)于多字段查詢,這里有兩個(gè)方式可供參考:
1、對(duì)多個(gè)字段分別查詢,使用OR連接,這種方式效率在數(shù)據(jù)量大時(shí),效率很差
.....
<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將多個(gè)字段拼接之后在進(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中只要有一個(gè)為NULL,則會(huì)返回NULL,這將導(dǎo)致你查不到正確數(shù)據(jù)。為了確保不為NULL,使用 IFNULL判斷下就可以了
IFNULL() 函數(shù)用于判斷第一個(gè)表達(dá)式是否為 NULL,如果為 NULL 則返回第二個(gè)參數(shù)的值,如果不為 NULL 則返回第一個(gè)參數(shù)的值。
以上這篇Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot自動(dòng)裝配之@ComponentScan使用方式
@componentScan注解用于掃描指定路徑下的組件,并自動(dòng)將它們注冊(cè)為Spring?Bean,該注解支持多種過濾規(guī)則,可以自定義掃描過濾規(guī)則,Spring?Boot通過ConfigurationClassPostProcessor處理@ComponentScan注解,并在啟動(dòng)時(shí)創(chuàng)建和注冊(cè)BeanDefinition對(duì)象2025-01-01
Java面試題沖刺第十九天--數(shù)據(jù)庫(4)
這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于數(shù)據(jù)庫的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-08-08
springboot配置文件中使用${}注入值的兩種方式小結(jié)
這篇文章主要介紹了springboot配置文件中使用${}注入值的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案
JSON數(shù)據(jù)現(xiàn)在是我們開發(fā)中用的最多的,百分之九十的數(shù)據(jù)都是通過JSON方式進(jìn)行傳輸,下面這篇文章主要給大家介紹了關(guān)于SpringBoot默認(rèn)的JSON解析方案的相關(guān)資料,需要的朋友可以參考下2021-08-08
SpringBoot通過AOP與注解實(shí)現(xiàn)入?yún)⑿r?yàn)詳情
這篇文章主要介紹了SpringBoot通過AOP與注解實(shí)現(xiàn)入?yún)⑿r?yàn)詳情,文章從相關(guān)問題展開全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法
這篇文章主要介紹了SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java實(shí)現(xiàn)按權(quán)重隨機(jī)數(shù)
這篇文章主要介紹了Java實(shí)現(xiàn)按權(quán)重隨機(jī)數(shù),本文給出了提出問題、分析問題、解決問題三個(gè)步驟,需要的朋友可以參考下2015-04-04
Java實(shí)現(xiàn)List集合轉(zhuǎn)樹形結(jié)構(gòu)的示例詳解
在開發(fā)中,我們通常需要將從數(shù)據(jù)庫中查詢的集合數(shù)據(jù)轉(zhuǎn)換成類似文件系統(tǒng)一樣的樹形集合。本文將利用Java語言實(shí)現(xiàn)這一功能,感興趣的可以了解一下2022-08-08

