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

目录
  • 使用正则模糊匹配多个数据
    • 背景
    • mybaits正则匹配
  • Mybatis多字段模糊匹配同一个值
    • CityDAO
    • XML

使用正则模糊匹配多个数据

背景

有这样一个需求,需要模糊匹配一个List<String>的所有元素,如果采用LIKE则需要写很多个语句,这时候其实可以采用正则匹配

mybaits正则匹配

Mysql模糊匹配姓名为a、b、c的所有学生

select * from table where name REGEXP 'a|b|c'

那么用mybatis怎么写呢?我们第一时间可能会这样写:

<select id="selectAll" resultMap="BaseResultMap" parameterType="java.util.List">
    select *
    from student
    where name REGEXP
    <foreach collection="list" item="item" open="'" close="'" separator="|">
            #{item}
    </foreach>
</select>

但这样是错误的,因为翻译成sql,语句是

select * from student where name REGEXP ' ? | ? | ? '

不能在SQL语句中使用占位符?

正确的SQL应该是以下两种:

select * from student where name REGEXP ?
select * from student where name REGEXP CONCAT_WS('|',?,?,?)

对于前一个来说,占位符的数据应该在Java代码中拼接完成;对于后面一个,CONCAT_WS的参数应该在foreach标签中完成

<select id="selectAll" resultMap="BaseResultMap" parameterType="java.util.List">
    select *
    from student
    where name REGEXP CONCAT_WS('|',
    <foreach collection="list" item="item" open="" close="" separator=",">
        #{item}
    </foreach>
    )
</select>

Mybatis多字段模糊匹配同一个值

CityDAO

    List<Map<String, Object>> findByMap(Map<String, Object>map);
    List<Map<String, Object>> findByMap2(Map<String, Object>map);

XML

使用concat将多个字段拼接之后在进行模糊查询,相比第一种更推荐第二种,执行效率更好

  <select id="findByMap" resultType="java.util.Map">
        SELECT id,pid as pIDDD,city_name,type FROM city
        WHERE 1=1
        <if test="keyWord != null and keyWord != ''">
            AND pid LIKE concat('%',#{keyWord},'%')
            OR city_name LIKE concat('%',#{keyWord},'%')
            OR type LIKE concat('%',#{keyWord},'%')
        </if>
    </select>

    <select id="findByMap2" resultType="java.util.Map">
        SELECT id,pid as pIDDD,city_name,type FROM city
        WHERE 1=1
        <if test="keyWord != null and keyWord != ''">
            AND CONCAT(IFNULL(pid,''),IFNULL(city_name,''),IFNULL(type,'')) LIKE concat('%',#{keyWord},'%')
        </if>
    </select>

特别提醒:由于CONCAT中只要有一个为NULL,则会返回NULL,这将导致你查不到正确数据。为了确保不为NULL,使用 IFNULL判断下就可以了

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis中正则使用foreach拼接字符串

    目录 正则使用foreach拼接字符串 foreach标签拼接多字段in ,和union 正则使用foreach拼接字符串 业务需求:使用代理名字查询该代理的所有下级代理 数据库: pid存储的是该字段的上级集合 实现步骤: 1.先用名字在用户表中查询出用户id集合 2.在数据库中判断字段pids中是否出现这些id,再去重 -------上重点-------: 在mybatis中写拼接这个sql碰到了很多坑,记录下这个教训: 1.foreach拼接字符串,开头和结尾用单引号,否则报错 2.中括号

  • MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: 起初我在MyBatis的mapper文件中是这样写的: <select id="searchStudents" resultType="com.example.entity.StudentEntity" parameterType="com.exampl

  • 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 实现一个搜索框对多个字段进行模糊查询

    1.问题描述: 最近项目需要提供一个搜索框对多个字段进行模糊查询的操作代替下拉列表选择单个字段条件进行模糊查询的操作. 2.解决办法: 之前的四个条件的模糊查询代码 <if test="featureCode != null"> AND plm_model_option.feature_code= #{featureCode} </if> <if test="featureName != null"> AND plm_featur

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

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

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

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

  • shell模糊匹配与正则详解

    前言: 正则可以实现一些简单的功能,并用在脚本中,如检测ip地址是否符合规范,检测文件名是否符合规范等等. 正则表达式 正则表达式主要是用来描述一个句法规则的模式.其实说的通俗一点,就是利用字符和元字符的组合,对一些符合既定句法的模式进行模糊匹配.它的主要功能是文本查询和字符串操作. 正则表达式的基本元素包括普通字符和元字符,在Linux shell里面,常用的正则表达式元字符集为:S={*  .  ^  $  []  \  \<\>  \{\}  \{n,\}  \{n,m\} },每一个元

  • Mybatis如何解决sql中like通配符模糊匹配问题

    目录 sql中like通配符模糊匹配问题 将查询条件通过功能类处理 后台Contronller获得查询条件 mapper.xml中对应的使用方法 使用like实现模糊匹配 方式一 方式二 方式三 sql中like通配符模糊匹配问题 针对oracle数据库: 将查询条件通过功能类处理 /**      * Description: 处理转义字符%和_,针对ORACLE数据库      *       * @param str      * @return      */     public st

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

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

  • 解决MyBatis中模糊搜索使用like匹配带%字符时失效问题

    目录 1.问题背景 2.解决方法 2.1.在入参SearchVo上进行特殊符号relpace转换 2.2.使用ESCAPE 2.3.总结 1.问题背景 Mybatis是我们日常项目中经常使用的框架,在项目中我们一般会使用like查询作为模糊匹配字符进行搜索匹配,下面的Mapper.xml是我们使用like在项目中进行模糊匹配的常用方式: <sql id="searchCondition"> <trim prefix="where" prefixOv

  • 正则表达式实现字符的模糊匹配功能示例

    本文实例讲述了正则表达式实现字符的模糊匹配功能.分享给大家供大家参考,具体如下: package com.cn.util; import java.util.regex.Pattern; /** * 正则表达式 工具类 * * @author lifangyu */ public class RegexUtil { /* * IP地址的匹配标达式 ( // \\d{1,3}) // :\d // 0~9数字,{1,3} // 至少一位,最多三位) */ private static String

  • IOS实现邮箱模糊匹配的功能

    先来看看要实现的效果图 一.介绍一下功能 当输入一个邮箱的数字,会默认在后面匹配出来@qq.com,当然这个默认@qq.com可以换成其他的如@163.com等等.这里默认是@qq.com,因为我们的产品汪做过统计大多数用户还是用的qq邮箱,所以默认是@qq.com. 当输入@符号还是不会有所变化,但是如果在@之后再输入字符,会将这个字符和你想要提示的邮箱后缀做匹配,我这里是需要匹配@qq.com,@163.com,@126.com,@yahoo.com,@139.com,@henu.com类型

  • Mybatis中的like模糊查询功能

    1.  参数中直接加入%% param.setUsername("%CD%"); param.setPassword("%11%"); <select id="selectPersons" resultType="person" parameterType="person"> select id,sex,age,username,password from person where true &

随机推荐