当前位置: 首页 > news >正文

MyBatis 模糊查询终极教程:安全高效的搜索实现

一、模糊查询的核心概念

什么是模糊查询?

模糊查询是数据库搜索中允许部分匹配的技术,使用 SQL 的 LIKE 关键字配合通配符实现:

  • % 匹配任意数量字符
  • _ 匹配单个字符

示例场景

用户输入部分名称搜索食材:

输入"苹果" → 匹配"红富士苹果"、"苹果汁"等
输入"果" → 匹配所有包含"果"字的食材

二、安全模糊查询的核心实现

安全模糊查询模板

<select id="searchFoods" resultType="cn.cjxy.domain.FoodInfo">SELECT id, name, type, price, buyer, buy_timeFROM tb_foods<where><if test="type != null and type != ''">type LIKE CONCAT('%', #{type}, '%')</if><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if></where>ORDER BY buy_time DESC
</select>

安全三要素解析

  1. **预编译占位符 **#{}
    • 不是字符串拼接,而是将参数作为整体传给数据库
    • 用户输入始终被当作数据值处理,而非SQL代码
    • 即使输入包含SQL关键字(SELECTDELETE等)也不会影响结构
  2. CONCAT函数的作用
CONCAT('%', #{input}, '%')
- 构建完整的模糊匹配模式
- 保证通配符位置固定(两边都有%)
- 避免用户控制模糊匹配的范围
  1. 动态条件判断
<if test="type != null and type != ''">
- 只有当参数非空时添加条件
- 提高查询效率
- 避免空条件污染SQL

三、为什么这种实现最安全?

SQL注入攻击场景模拟

假设恶意用户输入:' OR '1'='1

  1. 安全实现的效果
-- 实际执行的SQL
WHERE name LIKE CONCAT('%', '\' OR \'1\'=\'1', '%')
- 搜索名称包含 `' OR '1'='1` 的记录
- 不会返回所有数据
  1. 不安全的写法对比
<!-- 危险!直接字符串拼接 -->
WHERE name LIKE '%${input}%'
-- 执行的SQL (危险!)
WHERE name LIKE '%' OR '1'='1%'
-- 等同于
WHERE 1=1 -- 返回所有数据!

四、高级模糊查询技巧

1. 精确位置控制

<!-- 前缀匹配 (apple%) -->
LIKE CONCAT(#{input}, '%')<!-- 后缀匹配 (%apple) -->
LIKE CONCAT('%', #{input})<!-- 固定位置匹配 (a_pl_) -->
LIKE CONCAT('a_', #{input}, '_e%')

2. 特殊字符处理

<if test="name != null">name LIKE CONCAT('%', REPLACE(#{name}, '_', '\\_'), '%') ESCAPE '\'
</if>
  • 转义 _% 字符
  • 使用 ESCAPE 关键字定义转义符

3. 大小写不敏感查询

LOWER(name) LIKE CONCAT('%', LOWER(#{name}), '%')

五、性能优化指南

1. 索引使用策略

查询类型能否使用索引优化建议
LIKE 'value%'✅ 是最适合索引
LIKE '%value'❌ 否考虑反向索引
LIKE '%value%'❌ 否限制结果数量

2. 覆盖索引优化

ALTER TABLE tb_foods ADD INDEX idx_name_type (name, type);

3. 分页控制结果集

<select id="searchFoods" resultType="...">...LIMIT #{offset}, #{pageSize}
</select>

六、最佳实践总结

  1. **始终使用 #{} + **CONCAT()
    • 绝对安全的标准做法
    • 全数据库兼容
  2. 动态条件选择
    • 使用 <if test="..."> 仅添加有效条件
    • 避免空条件降低性能
  3. 特殊场景处理
    • 转义特殊字符(%, _)
    • 使用 LOWER() 忽略大小写
    • 对于固定前缀使用 LIKE 'prefix%'
  4. 性能考量
    • 为常用搜索字段建立索引
    • 避免全表扫描的模糊查询
    • 使用分页限制结果数量
  5. 参数预处理
// 在Service层处理参数
if (input != null) {// 去除空格input = input.trim();// 限制长度input = input.length() > 50 ? input.substring(0, 50) : input;
}

七、完整实现流程图

用户输入搜索条件
条件是否有效?
使用预编译占位符
构建安全查询
返回所有数据
使用CONCAT函数
包裹通配符
执行数据库查询
返回结果集
展示结果

这种模糊查询实现方式提供了企业级的安全保障,同时保持了查询的灵活性和高性能。它在保持易用性的同时,从根本上杜绝了SQL注入风险,是开发搜索功能时的首选方案。

相关文章:

  • NLP学习路线图(五十一):PyTorch/TensorFlow
  • 论文笔记:Repetition Improves Language Model Embeddings
  • 人工智能100问☞第48问:GPT是怎么生成文本的?
  • Attention Backend的认识
  • 【完整源码+数据集+部署教程】水位面图像分割系统源码和数据集:改进yolo11-EMSC
  • 【C++】unordered_map和unordered_set的使用
  • 物理学 | 本质 / 体系 / 应用 / 教育启示
  • Java 中 DataSource-数据源 的基础介绍
  • day33 MLP神经网络的训练
  • FPGA基础 -- Verilog HDL 结构风格的描述
  • 企业级 Vue3 项目 iframe 封装方案
  • Excel单元格数值统计 - 华为OD机试真题(Python题解)
  • 宇宙尽头是WPS之——【Excel】一个自动重新排序的宏
  • Vivaldi浏览器6.4.3160.42安装教程 - 64位下载安装步骤详解(包含历史版本)
  • “贴身日记”购物网站的设计与实现
  • Matlab自学笔记五十九:符号变量的代入和替代subs精讲
  • Flutter中将bytes转换成XFile对象上传
  • 8.TCP Server端实现
  • AWS ELB 可观测性最佳实践
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • 网站建设衤金手指花总/百度搜索提交入口
  • 营销型网站费用/品牌推广策划营销策划
  • 学习做网站只学过c/360优化大师安卓手机版下载安装
  • 茶叶网站策划方案/站长工具在线查询
  • 单页网站 挣钱/十大搜索引擎入口
  • ppt怎么做网站/最新注册域名查询