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

news/2024/5/8 2:11:47

说明

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

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

本地表数据

具体方式

  方式一

在Mybatis中的写法:

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

 在代码中加上%

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

输出以下语句:

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

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

方式三

 在Mybatis中的写法:

    <select id="queryLists"  parameterType="java.lang.String" resultMap="BaseResultMap">select * from stuinfowhere 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 stuinfowhere 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")@ResponseBodypublic 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 stuinfowhere 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.mrgr.cn/p/10820725

相关文章

HarmonyOS 鸿蒙隔离层设计

在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装…

利用两个栈实现队列的入队出队以及判断队列是否为空

利用两个栈实现队列的入队出队以及判断队列是否为空bool enQueue(SeqStack_t *S1, SeqStack_t *S2, int x) {DataType_t temp = x;// 判断S1是否满if (SeqStack_IsFull(S1)){// 判断S2是空if (SeqStack_IsEmpty(S2))![image](uploading...){while (!SeqStack_IsEmpty(S1)){temp…

寻道大学•逐梦启航

寻道大学•逐梦启航 Seeking the Way, Dreaming of a New Beginning 都匀一中 —— 四川大学站 点此跳转 宣传片(bushi) 点此跳转 宣传片

资源推荐

持续更新中......代码编辑器推荐 c/c++ : visual studio(初学者可用dev c++)点此跳转 python : pycharm点此下载 易语言:点此百度网盘下载 提取码 6678 点此蓝奏云盘下载编程刷题网站 洛谷 leetcode编程学习网站 c语言:bilibili黑马程序员 python:Python_子木 易语言:觅风易…

Selenium IDE 常见错误笔记

错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反扒机制&#xff0c;脚本运行…

浮动布局

浮动 应用场景文字环绕(最初的使用场景) 横向排列浮动的基本特点当一个元素浮动后,元素必定为块盒(会更改display为block) 浮动元素的包含块与常规流一致为父元素的内容盒。盒子尺寸宽度为auto时,适应内容高度 高度为auto时,与常规流一致,适应内容高度 margin为auto, 为…

GK320刷机

仓库地址 Gitee页面 https://gitee.com/jeanhua/super-engine-for-GK320 GitHub页面 https://github.com/jeanhua/super-engine-for-GK320 提供GK320/GK310智能电子学生证的破解刷机服务这本来是我高一(2020)用易语言写的,到高二基本完成所有工作,旨在破解这个学生证,给无聊…

客服专用的宝藏快捷回复软件

提起客服&#xff0c;很多人会觉得现在智能机器人的自动回复功能就可以将其替代。我始终不是这么认为的。人工客服始终能为一家店铺乃至一个企业起着非常关键重要的作用。今天就来给大家推荐一个客服专用的宝藏软件——客服宝聊天助手。感兴趣的话&#xff0c;可以发给你的客服…

链式栈接口程序

链式栈接口程序 目录链式栈接口程序以链表作为基础实现栈空间(链式栈)头文件链式栈的创建创建一个空的链式栈节点入栈出栈验证输出结果 以链表作为基础实现栈空间(链式栈) 图解头文件 /********************************************************************* file name: …

Java_web的复习之maven

Apache maven是一个项目管理和构建工具,它基于项目对象管理模型的概念,通过一小段描述信息来管理项目的构建 2.作用:方便的依赖管理 统一的项目结构 标准的项目构建流程 3.通过maven中的各种各样的插件,我们就可以完成对应的功能 例如通过编译插件就可以对项目进行编译,通过…

两个栈模拟一个队列(Stacks Imitate Queue)

/**************************************************************************** @file name: :StacksSimulateQueue* @brief :两个栈实现队列的功能* @author :wvjnuhhail@126.com* @date :2024/04/26* @version 1.0 :V1.0* @property :None* @note :…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

&#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e; 文章目录 &#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e;摘要引言正文&#x1f4d8; 识别问题&#x1f4d9; 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…

Rust HTTP 客户端:易于使用、功能强大 | 开源日报 No.228

seanmonstar/reqwest Stars: 8.9k License: Apache-2.0 reqwest 是一个易于使用且功能强大的 Rust HTTP 客户端。 异步和阻塞客户端支持普通数据、JSON、urlencoded 和 multipart 数据格式可定制的重定向策略支持 HTTP 代理和系统原生 TLS 或 rustls 的 HTTPSCookie 存储功能…

DSNeRF复现流程

创建虚拟环境安装依赖 conda create -n DSNeRF python3.7pip install -r requirements.txt下载LLFF数据放在创建的data文件下 https://drive.google.com/file/d/1RjhfcbsywOvw0ts1AFSri91mKANvEVOa/view?uspsharing 下载预先训练好的模型 bash download_models.sh渲染视频…

Qt xml示范

1.数据格式 #ifndef XML_DATA_H #define XML_DATA_H#include<QWidget>struct Student {int s_id;QString s_name;double s_math_score;double s_english_score;}; struct Teacher{int t_id;QString t_name;QVector<Student> t_students_v; };#endif // XML_DATA_H…

Day01 Web服务搭建站库分离路由访问

常规的Web应用搭建: 1.购买云服务器,购买域名2.云服务器去搭建中间件 windows server 安装web角色后默认可以直接通过域名打开网站首页3.下载并上传Web程序源码 zblog源码官网可下载4.添加网站并绑定域名目录 域名解析设置:二级域名ablog.whgojp.top 解析到该服务器zblog程序…

网络安全防护措施:保障信息安全的关键

随着互联网的普及和信息技术的快速发展&#xff0c;网络安全已成为企业和个人必须重视的重要问题。网络安全不仅涉及到保护个人隐私和机密信息&#xff0c;还关系到企业的声誉和财务安全。在这个信息爆炸的时代&#xff0c;制定有效的网络安全防护措施至关重要。本文将探讨几种…

什么是langchain

概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力&#xff1a; -可以将 LLM 模型&#xff08;大规模语言模型&#xff09;与外部数据源进行连接 -允许与 LLM 模型进行交互基础功能 支持多种模型接口&#xff0c;比如 OpenAI、Hugging Fac…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…