讲师中心 微信公众号
AI工具推荐 视频效率加速

MyBatis中如何使用bind标签_模糊查询LIKE语句的安全拼接方式

梦伟君_9936

梦伟君_9936

发布时间:2026-03-12 15:49:21

|

601人浏览过

|

来源于php中文网

原创

bind 标签需配合 #{} 使用才能实现安全有效的 LIKE 查询:先用 bind(如 @java.lang.String@format('%s%s%s', '%', name, '%'))预处理用户输入并处理空值,再在 SQL 中用 #{likeName} 引用;严禁用 ${} 拼接,避免 SQL 注入。

mybatis中如何使用bind标签_模糊查询like语句的安全拼接方式

bind 标签怎么写才能让 LIKE 查询既安全又生效

直接结论:bind 本身不防 SQL 注入,但它能帮你把用户输入先做预处理(比如加 %),再交给 #{} 参数化,这才是安全的关键。很多人误以为写了 bind 就万事大吉,结果还是用 ${} 拼字符串,照样被注入。

常见错误现象:org.apache.ibatis.executor.ExecutorException: Error preparing statement. Cause: java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis 或 MySQL 报错 You have an error in your SQL syntax,往往是因为 bind 里用了未转义的单引号、括号,或拼出了非法 SQL 片段。

  • bind 的表达式是 OGNL,不是 SQL,不能直接写 '%' + name + '%' 这种裸字符串拼接(OGNL 不支持 + 字符串连接)
  • 正确写法是用 concat('%', name, '%')(MySQL)或 '%' || name || '%'(Oracle/PostgreSQL),但更推荐统一用 Java 方法: @java.lang.String@format('%s%s%s', '%', name, '%')
  • 如果 name 为 null,concat 会返回 null,导致整个 WHERE 条件失效,必须提前判空或用 if 处理

为什么不用 ${} 直接拼 LIKE 字符串

因为 ${} 是字符串替换,用户输 admin' OR '1'='1,就会变成 WHERE username LIKE '%admin' OR '1'='1%' —— 典型注入。而 #{} 是预编译参数,数据库根本不会解析里面的逻辑。

使用场景很明确:只要涉及用户可控输入(搜索框、下拉筛选、URL 参数),LIKE 的左右通配符就必须由后端加,不能前端传 %xxx% 再 ${} 插入。

  • MySQL 下 concat('%', #{name}) 是错的 —— #{} 不能进函数参数,会被当成字符串字面量
  • 必须用 bind 先生成带通配符的变量,再用 #{} 引用,例如:<bind name="likeName" value="@java.lang.String@format('%s%s%s', '%', name, '%')"></bind>
  • Oracle 用户注意:|| 是拼接符,但空值参与时结果为 null,建议改用 CONCAT(CONCAT('%', NVL(name, '')), '%') 或在 Java 层处理空值

bind 和 if 组合处理空值与边界条件

用户可能不填搜索框,也可能只输空格。这时候 bind 生成的 likeName 如果是 '%%',查出来就是全表扫描,性能灾难;如果是 null,条件被跳过,结果为空。

所以得配合 <if test="name != null and name.trim() != ''"></if> 控制整个条件块是否出现,而不是靠 bind 硬扛。

  • bind 只负责“加工”,不负责“开关”;if 才决定这个 LIKE 条件要不要加进 SQL
  • 别在 bind 里写复杂逻辑,比如 value="name == null ? '%' : concat('%', name, '%')" —— OGNL 支持有限,容易报 ognl.ExpressionSyntaxException
  • 更稳的做法:Java DTO 中加一个 getLikeName() 方法,内部处理空值和 trim,XML 里直接 <bind name="likeName" value="likeName"></bind>

MySQL 与 PostgreSQL 的通配符转义差异

用户搜 100%,你希望匹配真实含百分号的字段,但默认 % 是通配符,必须转义。MyBatis 本身不处理这个,得靠数据库方言和 ESCAPE 子句。

这不是 bind 能解决的问题,但容易被忽略 —— 很多人加了 bind 就以为“模糊查询安全了”,结果特殊字符一搜就崩。

  • MySQL 示例:WHERE name LIKE #{likeName} ESCAPE '\',然后在 bind 中把 、%、_ 替换成 \、%、_
  • PostgreSQL 要用 ESCAPE + replace(),例如:value="replace(replace(replace(name, '\', '\\'), '%', '\%'), '_', '\_')"
  • 千万别用正则或 JavaScript 风格的 replaceAll —— OGNL 不支持,会抛 ognl.MethodFailedException

真正麻烦的不是语法,而是不同数据库对空格、Unicode 零宽字符、emoji 的 LIKE 行为不一致。上线前一定用真实数据测边界 case,比如搜一个空格、一个制表符、一个中文顿号。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2942

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

292

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

6329

2025.08.26

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

0

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

0

2026.11.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn