Spring Boot 中Mybatis使用Like的使用方式和注意点

news2025/1/10 17:02:48

说明

       模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。

      使用Springboot简单配置一下Mybatis,然后进行说明。Springboot集成Mybatis这里就不做介绍了,这里我们主要介绍一下在mybatis配置文件中怎么使用模糊查询。

本地表数据

具体方式

  方式一

在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">
        select * from stuinfo
        where 1=1
        <if test="name != null and name != ''">
            AND name like '%${name}%'
        </if>
        order by id desc
    </select>

输出以下语句:

      这种会有sql注入的问题,需要明白在 Mybatis中 $ 和 # 使用的区别。这种写法也不能加jdbcType=VARCHAR,否则也会报错。

注意:种方式在实际开发过程中千万要注意,不要写成这样了。

方式二

     在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">
        select * from stuinfo
        where 1=1
        <if test="name != null and name != ''">
            AND name like #{name,jdbcType=VARCHAR}
        </if>
        order by id desc
    </select>

 在代码中加上%

    @GetMapping("/lists")
    @ResponseBody
    public List<StuInfo> lists(String name){
        return stuInfoService.getLists('%'+name+'%');
    }

输出以下语句:

       这种方式在一些项目中也会看到。如果没有使用如Mybatis等ORM框架,直接写sql查询就这样拼接了。

      第一种方式和第二种方式基本上一致

方式三

 在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">
        select * from stuinfo
        where 1=1
        <if test="name != null and name != ''">
            AND name like concat('%', #{name}, '%')
        </if>
        order by id desc
    </select>

输出以下语句:

说明:在实际开发中推荐使用这种方式。

方式四

 在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">
        select * from stuinfo
        where 1=1
        <if test="name != null and name != ''">
            and POSITION(#{name} IN name) > 0
        </if>
        order by id desc
    </select>

      以上写法是在postgresql中的函数:POSITION(#{name} IN name)  在mysql中 请使用: INSTR(name, #{name}) > 0

输出以下语句:

需要注意

        当使用方式三的时候,如果查询的关键字就是%,  get 请使用%25 url编码 ,那情况会就会变成什么呢! 初始化数据中name有6条数据中包含%。

查询的sql如下:

select * from stuinfo where name like concat('%','%','%')

查出来全部的数据,并不是只包含了%的数据,如果查询也是一样的。

那这种情况肯定是不满足查询需求的,则需要调整。

解决以上问题

 代码中处理:

    @GetMapping("/lists")
    @ResponseBody
    public List<StuInfo> lists(String name){
        name = name.replaceAll("_", "\\\\_");
        name = name.replaceAll("%", "\\\\%");
        return stuInfoService.getLists(name);
    }

 在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">
        select * from stuinfo
        where 1=1
        <if test="name != null and name != ''">
            AND name like concat('%',#{name,jdbcType=VARCHAR},'%') ESCAPE '\'
        </if>
        order by id desc
    </select>

输出以下语句:

      以上两种本质都是对查询的关键字进行了处理,这种处理在代码中可以使用拦截器或者AOP等技术统一处理。

总结

1、不要写方式一的这种模糊查询,容易发生sql注入!

     建议使用第三种方式进行模糊查询

2、上面这前三种模糊查询,都是使用%关键字%,这种方式是不会走索引的,大数据量时候有查询效率低,第四中使用字符串包含函数。

看情况,可以使用全文索引;或者使用ES进行

3、注意关键词中有%、_ 这些特殊字符如何处理。

1、业务上不允许输入这些字符,需要通过(前台、后台)进行过滤。

2、使用上面的ESCAPE或者转义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode面试经典150题】59. 合并两个有序链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

SPI总线通讯协议

文章目录 SPIQSPISPI配置SPI读写一个字节W25Q128初始化读取SPI FLASH写SPI FLASH SPI SPI:串行外围设备接口(Serial peripheral interface)&#xff0c;一种高速&#xff0c; 全双工、同步的通信总线。 SPI使用4条线通信&#xff1a; MISO&#xff1a;主设备数据输入&#xf…

为主机配置IP

第一种方法:nmcli #nmcli connection modify eth0 ipv4.method manual ipv4.addresses 172.25.254.100/24 ipv4.gateway 172.25.254.2 ipv4.dns 114.114.114.114 autoconnect yes #nmcli c up etho //激活网卡命令(网卡早就配好,只是修改ip就不用输入这条命令了) 第二…

【解决】echarts条形图纵坐标显示不全

先说结论&#xff1a; option:{...grid: {containLabel: true},... }这个属性是控制整体的坐标标签的。加上这个就可以显示完整了。然后再根据其他属性调整标签的字体、颜色之类的 yAxis : [{...axisLabel:{width:100,overflow:break,truncate:...,color:red,fontSize:10,},..…

PHP定时任务框架taskPHP3.0学习记录5环境部署常见问题及解决方案

php版本问题 当出现一下错误&#xff0c;说明php版本不支持&#xff0c;建议升级php版本&#xff0c;至少>5.6 Failed loading /usr/local/zend/php55/ZendGuardLoader.so: /usr/local/zend/php55/ZendGuardLoader.so: undefined symbol: zval_used_for_init PHP Warning:…

计算机网络:CSMA/CA协议

计算机网络&#xff1a;CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听CS&#xff1a…

Grass注册不了、按钮灰色的解决方案

近期相信grass挂机项目不少人有所有接触。还有不了解这个项目的可以看看博客&#xff1a; http://t.csdnimg.cn/bI4UO 但是不少人注册时遇到无法注册的问题&#xff0c;或者是注册按钮显示灰色&#xff0c;放上鼠标时显示禁止。这也是博主在尝试时遇到的问题。 经过探索&…

【HarmonyOS 4+NEXT】开发工具安装指南

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;开发工具安装 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言准备工作下载开发工具安装开发工具配置开发环境总结 前言 随着科技的不断进步&#xff0c;智能设…

Scrapy 框架基础

Scrapy框架基础Scrapy框架进阶 Scrapy 框架基础 【一】框架介绍 【1】简介 Scrapy是一个用于网络爬取的快速高级框架&#xff0c;使用Python编写他不仅可以用于数据挖掘&#xff0c;还可以用于检测和自动化测试等任务 【2】框架 官网链接https://docs.scrapy.org/en/late…

105.从前序遍历与中序遍历序列构造二叉树

力扣链接&#xff1a;105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 问题主体&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构…

Operating System Introduction

What is an Operating System? A program that acts as an intermediary between a user of a computer and the computer hardware 操作系统即用户与计算机硬件中的类似中介的程序 Operating system goals: Execute user programs and make solving user problems easier Mak…

代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

文章目录 93.复原IP地址思路确定非法的范围树形结构 伪代码 78.子集思路伪代码实现CPP代码 90.子集II思路CPP代码用used去重的办法用set去重的版本不使用used数组、set的版本 93.复原IP地址 力扣题目链接 文章讲解&#xff1a;93.复原IP地址 视频讲解&#xff1a;回溯算法如何分…

Hadoop数据压缩

Hadoop数据压缩 Hadoop 数据压缩是一种用于减少存储空间和网络传输成本的技术&#xff0c;通常应用于大数据处理场景。随着数据量的不断增长&#xff0c;对存储和网络带宽的需求也在增加&#xff0c;因此采用数据压缩技术可以有效地减少数据的存储和传输成本&#xff0c;提高数…

ERROR in [eslint] reorder to top import/first

情景再现&#xff1a;在react开发的时候&#xff0c;导入组件、函数时报错&#xff1a;Import in body of module; reorder to top import/first … 原因&#xff1a;在import语句前有变量声明 解决&#xff1a; 变量的声明&#xff0c;要放在import之后 // 错误示例 import {…

Transformer 代码详解(Pytorch版)

前言 基于上一篇经典网络架构学习-Transformer的学习&#xff0c;今天我们来使用pytorch 搭建自己的transformer模型&#xff0c;加深对transformer的理解&#xff0c;不仅在NLP领域绕不开transformer&#xff0c;而且在CV领域也是很火热&#xff0c;很多模型都用到了注意力机…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 一、简单介绍 二、简单人脸眼睛检测添加…

手机照片误删怎么恢复?别慌,教你轻松恢复!

如今数字化的时代&#xff0c;人们已经离不开手机&#xff0c;手机里珍藏的照片也成为了人与人之间的羁绊。然而有时候我们会因为手机故障或者操作失误&#xff0c;将手机照片误删。那么手机照片误删怎么恢复呢&#xff1f;三招教你找回误删的手机照片&#xff0c;有效实用且方…

激活函数:GELU(Gaussian Error Linear Units)

激活函数&#xff1a;GELU&#xff08;Gaussian Error Linear Units&#xff09; 前言相关介绍GELU&#xff08;Gaussian Error Linear Units&#xff09;代码示例 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点…

LUA脚本判断是否为空

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Lua是一个小巧的脚…