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('%',#{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多个字段模糊匹配同一个值的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解MyBatis模糊查询LIKE的三种方式

    模糊查询也是数据库SQL中使用频率很高的SQL语句,使用MyBatis来进行更加灵活的模糊查询. 直接传参法 直接传参法,就是将要查询的关键字keyword,在代码中拼接好要查询的格式,如%keyword%,然后直接作为参数传入mapper.xml的映射文件中. public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%"; String roleType = "

  • mybatis模糊查询、分页和别名配置的方法

    mybatis模糊查询(3种) 第一种 select * from user where username like "%" #{name} "%" 第二种 select * from user where username like "%${value}%" 第三种 <!--concat拼接字符串 mysql独有的函数--> select * from user where username like concat("%&

  • MyBatis-plus 模糊查询的使用

    在使用MyBatis-plus的时候,一些基础的增删改查可以不用再自己写sql了: public interface UserDao extends BaseMapper<FykUser>{ } 就这样,就可以实现user表的增删改查了. 模糊查询 使用userDao.selectList(queryWrapper)方法,就可以查询出一个用户列表. 如果需要模糊查询,代码如下: //条件封装 QueryWrapper<FykUser> queryWrapper = new Quer

  • 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)

  • Mybatis如何使用正则模糊匹配多个数据

    目录 使用正则模糊匹配多个数据 背景 mybaits正则匹配 Mybatis多字段模糊匹配同一个值 CityDAO XML 使用正则模糊匹配多个数据 背景 有这样一个需求,需要模糊匹配一个List<String>的所有元素,如果采用LIKE则需要写很多个语句,这时候其实可以采用正则匹配 mybaits正则匹配 Mysql模糊匹配姓名为a.b.c的所有学生 select * from table where name REGEXP 'a|b|c' 那么用mybatis怎么写呢?我们第一时间可能会

  • Redis Cluster 字段模糊匹配及删除

    Questions 在数据库内我们可以通过like关键字.%.*或者REGEX关键字进行模糊匹配.而在Redis内我们如何进行模糊匹配呢?集群情况Redis Cluster的情况是否和单机一致呢?前段时间我对于这个议题进行了调查和研究. 单节点的情况 Jedis 参考stackoverflow上的解答,在Java内使用Jedis主要有如下2中写法: ### 方法1 Set<String> keys = jedis.keys(pattern); for (String key : keys) {

  • thinkPHP实现多字段模糊匹配查询的方法

    本文实例讲述了thinkPHP实现多字段模糊匹配查询的方法.分享给大家供大家参考,具体如下: 引言:有时候查询要匹配多个字段.比如查询地址,地址是由多个字段组成的.有省.市.区等等,以及详细地址.这个时候如何查询呢? 实现不同字段相同的查询条件 $User = M("User"); // 实例化User对象 $map['name|title'] = 'thinkphp'; // 把查询条件传入查询方法 $User->where($map)->select(); 用到项目中

  • SQL多表联合查询时如何采用字段模糊匹配

    目录 先说一下背景和要求 方法一 方法二 方法三 先说一下背景和要求 背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容. 要求:实现A表的名称字段和B表的名称字段要模糊匹配. 上图: 假如A表长这样: B表长这样: 然后我要想变成这样: 简单说就是在我关联查询两表时,条件字段的取值看起来不一样,但是意思是一样的,应该要把这种数据关联起来.但是SQL里面“=”两边又必须严格相同,所以现在怎么办呢? 方法一 可以采用类似于LIKE模糊查

  • ORACLE数据库对long类型字段进行模糊匹配的解决思路

    1.背景介绍 最近在查询数据时,突然遇到了这样一个场景,如何对一个字段类型为long的字段进行模糊匹配.一顿操作以后发现不能使用like进行模糊查询,仔细查看了一下官方文档才发现,long数据类型并不支持该操作.然后就想着将long类型转换为varchar类型然后在进行模糊匹配,通过百度尝试了多种方法,发现效果不太理想.(如果你们发现好的方法欢迎在评论区留言) 2.解决思路 笔者这里采用的思路是: 先创建一个新表,然后将关键信息通过数据类型转换为合适的类型(此处是运用to_lob函数将long类

  • Python+FuzzyWuzzy实现模糊匹配的示例详解

    目录 1. 前言 2. FuzzyWuzzy库介绍 2.1 fuzz模块 2.2 process模块 3. 实战应用 3.1 公司名称字段模糊匹配 3.2 省份字段模糊匹配 4. 全部函数代码 在日常开发工作中,经常会遇到这样的一个问题:要对数据中的某个字段进行匹配,但这个字段有可能会有微小的差异.比如同样是招聘岗位的数据,里面省份一栏有的写“广西”,有的写“广西壮族自治区”,甚至还有写“广西省”……为此不得不增加许多代码来处理这些情况. 今天跟大家分享FuzzyWuzzy一个简单易用的模糊字符

  • mybatis中实现让返回值与bean中字段相匹配

    1. 编写目的 这个介绍的与那些修改mybatis.xml文件的方法不一样,目的也不一样. 当我们需要查询的数据跟entity的bean完全不匹配的时候(比如说需要统计的时候),我们不可能写多个dao层的查询接口,然后一个一个map到xml中去. 我们可以专门写一个类,根据自己的需要把统计的属性都写到里面去,然后一次性查询,就可以获得所有需要统计的数据. 2. 重要方法 专门编写一个实体类.实体类中包含的都是自己需要统计的属性. 编写dao层的接口方法的返回值就是这个实体类. 在映射的map.x

  • python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配

    已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接举例来说吧 随便举例: 按青岛城市的城区来说, 我数据库中存储的城区是个list:['市北区', '市南区', '莱州市', '四方区']等 从其它的数据来源得到一个城区是:市北 我怎么得到与市北相似相近的市北区 解决方案: In [1]: import difflib In [2]: cityar

  • mybatis 实体类字段大小写问题 字段获取不到值的解决

    目录 mybatis实体类字段大小写问题 字段获取不到值 解决办法 推断 踩坑mybatis 转换大小写问题 解决方法 mybatis实体类字段大小写问题 字段获取不到值 由于前期设计问题,项目中需要用到的一个字段 rootpath,所以我再实体层加了这么一个字段. 然后,我在前台向后台传数据的时候,这个rootpath一直都获取不到值.经过排查对比,发现我写的set和get方法名称后面的RootPath 中的P字母大写导致的. 解决办法 将set和get方法后面的P改为小写p就可以了 推断 m

随机推荐