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

说明

       模糊查询在项目中还是经常使用的,本文就简单整理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.mzph.cn/bicheng/397.shtml

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

相关文章

【Rust】——项目实例:——命令行实例(一)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)

1.简介 上一篇宏哥用PageFactory实现了POM&#xff0c;宏哥再介绍一下如果不用PageFactory如何实现POM。 2.项目实战 在这里宏哥以百度首页登录的例子&#xff0c;如果用POM实现&#xff0c;在测试脚本中实际代码就几行。 2.1代码设计 1.先新建一个pageObjects包&#xff…

算法打卡day38

今日任务&#xff1a; 1&#xff09;完全背包理论基础(卡码网52. 携带研究材料) 2&#xff09;518.零钱兑换II 3&#xff09;377. 组合总和 Ⅳ 4&#xff09;复习day13 完全背包理论基础(卡码网52. 携带研究材料) 题目链接&#xff1a;52. 携带研究材料&#xff08;第七期模拟…

使用LangChain和GPT-4,创建Pandas DataFrame智能体

大家好&#xff0c;数据分析和数据处理是数据科学领域每天都在进行的基本任务。高效和快速的数据转换对于提取有意义的见解和基于数据做出明智决策至关重要。其中最受欢迎的工具之一是Python库Pandas&#xff0c;它提供了一个功能强大的DataFrame工具&#xff0c;使用灵活直观的…

docker部署sqlserver过程记录

目录 前言 一、基础概念 二、过程步骤 1.docker操作 2.问题及解决 总结 前言 最近接触到了NL2SQL&#xff0c;有个相对比较适合自己的开源项目&#xff0c;就说看下。忽然发现自己电脑都没安装个数据库。那就安装一个吧&#xff0c;自从有了docker&#xff0c;能docker安…

华为OD-C卷-开源项目热榜[100分]Python3-100%

题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。 对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源…

基于51单片机土壤湿度检测及自动浇花系统

基于51单片机土壤湿度检测及自动浇花 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.LCD1602实时显示湿度、湿度上下限&#xff1b; 2.可用按键设置湿度、湿度上下限&#xff1b; 3.当湿度低于下限…

分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据…

搭建电商供应链需要用到哪些电商接口?||主流电商API接口解说

搭建供应链系统时&#xff0c;您可能需要与电商平台进行集成&#xff0c;以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口&#xff0c;可以帮助您构建供应链系统&#xff1a; 1. **淘宝开放平台接口**&#xff1a;淘宝开放平台提供了丰富的接口&#xff…

(六)PostgreSQL的组织结构(2)-默认数据库

PostgreSQL的组织结构(2)-默认数据库 安装完postgresql后&#xff0c;我们发现它自带了3个数据库。postgres、template0、template1 postgres# \lList of databasesName | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules |…

4399下架了的flash游戏 网盘自提取

下载好游戏后&#xff0c;需要使用flash进行打开&#xff0c;直接拖动游戏文件到flash文件&#xff0c;即可用flash快捷打开。 flash下载 百度网盘链接&#xff1a;https://pan.baidu.com/s/1KUz4ymg0SS7wFGH54hdE3A?pwdnisj 提取码&#xff1a;nisj 一、幻想纹章 不太行了…

elasticsearch 关于向量化检索

1、elasticsearch使用的是8.5.0 索引和mapping构建&#xff1a; PUT image-index {"mappings": {"properties": {"mydatavector": {"type": "dense_vector","dims": 3,"index": true,"similarit…

什么是死锁?死锁产生的条件是什么?

死锁 死锁是指两个或两个以上的进程(或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相等待的进…

【学习】linux实用命令

LINUX命令 普通用户查询系统信息 命令 &#xff1a; [wlm]$ cat /ect/os-release NAME "Kylin" VERSION ""功能&#xff1a; 这个输出会告诉你正在使用的操作系统的名称&#xff08;NAME&#xff09;、版本&#xff08;VERSION 或 VERSION_ID&#xf…

基于sfunction builder的c-sfunction编写——自定义函数编写

目录 前言 1、sfunction builder自定义函数编写方法一 2、sfunction builder自定义函数编写方法二 3.总结

Node.JS后端开发笔记整理(简洁版)

前端 1. 开发环境和技术栈 开发工具&#xff1a;Visual Studio CodeNode.js版本&#xff1a;18.19.0&#xff08;建议保持在18&#xff09;包管理器&#xff1a;npm前端框架&#xff1a;Vue3.4脚本语言&#xff1a;TypeScript构建工具&#xff1a;Vite后端框架&#xff1a;Ex…

ubuntu设置扩充swap交换空间

Swap是指Linux系统中的交换分区,类似于Windows的虚拟内存,当内存不足的时候,把一部分硬盘空间虚拟成内存来使用,从而解决内存不足的问题。交换分区,它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行! …

Golang基础-13

Go语言基础 介绍 并发 channel goroutine 互斥锁 读写锁 原子操作 select 超时处理 sync包 runtime包 介绍 本文介绍Go语言中 channel、goroutine、互斥锁、读写锁、原子操作、select、超时处理、sync包、runtime包等相关知识。 并发 进程是是最小的资源管理单元…

异步FIFO约束set_max_delay

1.最大延迟set_max_delay set_max_delay [-datapath_only] -from [ node_list] -to [node_list] delay_value 在Set Max Delay约束中使用-datapath_only选项时&#xff0c;它指示综合工具在优化设计时仅考虑数据通路的延迟&#xff0c;而不考虑控制逻辑的延迟。 关于最大最小…

大话数据结构学习笔记-线性表(二)-顺序存储结构

顺序存储定义 线性表的顺序存储结构&#xff0c;指的是用一段地址连续的存储单元一次存储线性表的数据元素。一般就是用一维数组来实现。 顺序存储结构定义 描述顺序存储结构的线性表需要以下三个属性 1)存储空间的起始位置:数组data。它的存储位置就是存储空间的存储位置 2…