网站首页 > 技术文章 正文
做一个积极的人
编码、改bug、提升自己
我有一个乐园,面向编程,春暖花开!
模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。
使用Springboot简单配置一下Mybatis,然后进行说明。Springboot集成Mybatis这里就不做介绍了。
初始数据
方式一
在Mybatis中的第一种写法:
<!--有sql注入问题--> <select id="findUserByLikeName1" parameterType="java.lang.String" resultMap="user"> select * from t_user where name like '%${name}%' </select>
这种会有sql注入的问题,需要明白在 Mybatis中 $ 和 # 使用的区别。这种写法也不能加jdbcType=VARCHAR,否则也会报错。
做了个简单的测试:
@Test public void findUserByLikeName1(){ List<User> test = userMapper.findUserByLikeName1("Cloud"); //select * from t_user where name like '%Cloud%' System.out.println(test.size());// 查出一条 List<User> test1 = userMapper.findUserByLikeName1("' or '1=1"); //select * from t_user where name like '%' or '1=1%' // 分析: '1=1%' 成立 System.out.println(test1.size());// 查出了全部数据 }
注意:排序的字段也容易出现这个问题,在使用的时候也一定要注意。
order by ${orderBy}
第一种方式在实际开发过程中千万要注意,不要写成这样了。
方式二
在Mybatis中的第二种写法:
<!--直接在代码中拼接%, 不存在sql注入--> <select id="findUserByLikeName2" parameterType="java.lang.String" resultMap="user"> select * from t_user where name like #{name,jdbcType=VARCHAR} </select>
在代码中加上%。
@Test public void findUserByLikeName2(){ String name = "Cloud"; List<User> test = userMapper.findUserByLikeName2("%" +name+"%"); // select * from t_user where name like ? // %Cloud%(String) System.out.println(test.size()); }
这种方式在一些项目中也会看到。如果没有使用如Mybatis等ORM框架,直接写sql查询就这样拼接了。
方式三
在Mybatis中的第三种写法:
<!--concat Mysql和 Oracle区别 ,不存在sql注入--> <select id="findUserByLikeName3" parameterType="java.lang.String" resultMap="user"> select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%') </select>
测试:
@Test public void findUserByLikeName3(){ String name = "Cloud"; List<User> test = userMapper.findUserByLikeName3(name); // select * from t_user where name like concat('%',?,'%') // Cloud(String) System.out.println(test.size()); }
在实际开发中推荐使用这种方式。
小注意
当使用方式三的时候,如果查询的关键字就是% ,那情况会是什么? 初始化数据中name有9条数据中包含%。
查询的sql如下:
select * from t_user where name like concat('%','%','%')
查出来全部的数据,并不是只包含了%的数据,如果查询_也是一样的。
那这种情况肯定是不满足查询需求的,则需要调整。
①在代码中进行转义
@Test public void findUserByLikeName3(){ String name = "%"; name = name.replaceAll("_", "\\\\_"); name = name.replaceAll("%", "\\\\%"); List<User> test = userMapper.findUserByLikeName3(name); System.out.println(test.size()); }
②使用ESCAPE
<select id="findUserByLikeName4" parameterType="java.lang.String" resultMap="user"> select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%') ESCAPE '/' </select>
测试:
@Test public void findUserByLikeName4(){ // replaceAll("%", "/%").replaceAll("_", "/_") String name = "%"; List<User> test = userMapper.findUserByLikeName4(name); System.out.println(test.size());// 查到全部 List<User> test1 = userMapper.findUserByLikeName4("/" +name); System.out.println(test1.size());//查到匹配%的记录 }
这两种本质都是对查询的关键字进行了处理,这种处理在代码中可以使用拦截器或者AOP等技术统一处理。
小总结
1、不要写方式1的这种模糊查询,容易发生sql注入!
建议使用第三种方式进行模糊查询
2、上面这三种模糊查询,都是使用%关键字%,这种方式是不会走索引的,大数据量时候有查询效率问题
看情况,可以使用全文索引;或者使用ES进行
说明:网上有一些优化like的查询的,但是亲测后没啥用
3、注意关键词中有%、_这些特殊字符如何处理。
1、业务上不允许输入这些字符,直接过滤(前台、后台过滤)
2、使用上面的ESCAPE或者转义
备注: 由于本人能力有限,文中若有错误之处,欢迎指正。
猜你喜欢
- 2024-11-07 Java 常见的49个错误及避免方法!翻译作业:码农网-小峰
- 2024-11-07 「开源资讯」可视化数据库管理平台DBeaver7.2.1发布
- 2024-11-07 Java 14 带来了 5 项新特性,能支持 H5 文本开发了
- 2024-11-07 JDK13正式发布:Switch表达式、GC新垃圾回收算法、低延时GC、ZGC
- 2024-11-07 sql语句基础篇 sql语句基础语句
- 2024-11-07 sql注入 sql注入原理
- 2024-11-07 SQL注入攻防入门详解 sql注入攻击原理与解决方法
- 2024-11-07 一通操作!黑客赚得数十万美元,还有一辆特斯拉
- 2024-11-07 Java数据库连接JDBC基础问答50例,Java程序员和数据库管理员必备
- 2024-11-07 应用最广的两类数据库的区别、优势对比、查询优化方法及案例实践
你 发表评论:
欢迎- 617℃几个Oracle空值处理函数 oracle处理null值的函数
- 610℃Oracle分析函数之Lag和Lead()使用
- 599℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 595℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 591℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 582℃【数据统计分析】详解Oracle分组函数之CUBE
- 572℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 560℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)