时间:2021-05-20
需求:
搜索框中可输入手机号,姓名,地址查询,后台需要对一个框中的多个字段做匹配查询。
搜索
可以在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('%',#{keyWord},'%')} OR c.mobile LIKE concat('%',#{keyWord},'%')} OR c.telphone LIKE concat('%',#{keyWord},'%')} </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('%',#{keyWord},'%')} </if> ORDER BY c.create_time DESC <select></mapper>特别提醒:由于CONCAT中只要有一个为NULL,则会返回NULL,这将导致你查不到正确数据。为了确保不为NULL,使用 IFNULL判断下就可以了
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
以上这篇Mybatis多个字段模糊匹配同一个值的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了thinkPHP实现多字段模糊匹配查询的方法。分享给大家供大家参考,具体如下:引言:有时候查询要匹配多个字段。比如查询地址,地址是由多个字段组成的
1、问题描述:最近项目需要提供一个搜索框对多个字段进行模糊查询的操作代替下拉列表选择单个字段条件进行模糊查询的操作。2、解决办法:之前的四个条件的模糊查询代码A
1.背景介绍最近在查询数据时,突然遇到了这样一个场景,如何对一个字段类型为long的字段进行模糊匹配。一顿操作以后发现不能使用like进行模糊查询,仔细查看了一
mybatis的if判断里面最好不要使用boolean值:mybatis会默认把空值转为false。所以如果遇见前段传空值,这个字段在mybatis里面永远就是
现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间。新建表d_user:createt