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

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

















