标签用于mybatis中安全构造模糊查询,通过ognl预处理参数生成新变量再用#{}引用,避免sql注入且跨数据库兼容。

${},同时屏蔽不同数据库拼接函数(如 MySQL 的 CONCAT、Oracle 的 ||)差异。
为什么用 做模糊查询
直接写 username LIKE '%#{keyword}%' 是无效的——#{} 是预编译占位符,整个 '%#{keyword}%' 会被当作字面字符串,不是 SQL 拼接;而用 ${keyword} 拼接又容易引发 SQL 注入。#{} 引用,既安全又跨库。
基本写法:前后加百分号
适用于单字段简单模糊匹配:
- 在
<select></select>内、<where></where>或条件判断中插入<bind></bind> -
name是自定义变量名,后续用#{变量名}引用 -
value是 OGNL 表达式,支持字符串拼接、方法调用等
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
进阶用法:调用工具类处理
当拼接规则更复杂(比如统一前后缀、忽略空格、转小写)时,可封装成 Java 工具方法,在 <bind></bind> 中通过 OGNL 调用:
- 确保工具类是 public static 方法
- OGNL 语法为:
@全限定类名@方法名(参数) - 方法需能处理 null 或空字符串,避免运行时异常
例如:
user_name LIKE #{searchName}
注意事项
注意几个关键点,避免常见错误:
-
<bind></bind>必须放在引用它的 SQL 片段之前(变量作用域是当前标签块) -
value中的单引号必须成对,OGNL 字符串字面量用单引号 - 如果参数是对象属性(如
user.username),表达式里写'%' + _parameter.username + '%'或'%' + username + '%'(MyBatis 会自动解析上下文) - 不支持在
<insert></insert>或<update></update>的SET子句中用于字段值拼接(应改用<set></set>+<if></if>)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










