bind 变量绑定
<bind> 标签通过 OGNL 表达式在动态 SQL 中创建变量,变量可在后续 SQL 中通过 #{} 引用,适用于字符串拼接、格式转换、数据库兼容等场景。
基本语法
XML
<bind name="变量名" value="OGNL表达式"/>
变量创建后使用 #{变量名} 引用。
模糊查询拼接
最常见场景是 LIKE 查询的 % 拼接:
XML
<select id="findByName" resultType="User">
<bind name="pattern" value="'%' + name + '%'"/>
SELECT * FROM user
WHERE name LIKE #{pattern}
</select>
传入 name = "张" 时,pattern 值为 %张%,最终 SQL:
SQL
SELECT * FROM user WHERE name LIKE ?
-- 参数: %张%
使用 bind 而非
${}拼接,避免 SQL 注入风险。
大小写转换
XML
<select id="findByEmail" resultType="User">
<bind name="emailLower" value="email.toLowerCase()"/>
SELECT * FROM user WHERE email = #{emailLower}
</select>
数据库兼容性适配
MySQL 和 Oracle 的 CONCAT 函数用法不同,使用 bind 统一处理:
XML
<!-- 统一写法,不依赖数据库函数 -->
<select id="searchUser" resultType="User">
<bind name="keywordPattern" value="'%' + keyword + '%'"/>
SELECT * FROM user
WHERE name LIKE #{keywordPattern}
OR email LIKE #{keywordPattern}
</select>
多值组合
bind 可串联创建多个变量:
XML
<select id="findUser" resultType="User">
<bind name="namePattern" value="'%' + name + '%'"/>
<bind name="emailPattern" value="'%' + email + '%'"/>
<bind name="startDate" value="startDate + ' 00:00:00'"/>
<bind name="endDate" value="endDate + ' 23:59:59'"/>
SELECT * FROM user
<where>
<if test="name != null">name LIKE #{namePattern}</if>
<if test="email != null">OR email LIKE #{emailPattern}</if>
<if test="startDate != null">AND create_time BETWEEN #{startDate} AND #{endDate}</if>
</where>
</select>
复杂 OGNL 表达式
bind 支持完整的 OGNL 表达式:
XML
<select id="findByCondition" resultType="User">
<!-- 字符串操作 -->
<bind name="trimmedName" value="name.trim()"/>
<bind name="upperName" value="name.toUpperCase()"/>
<!-- 数值计算 -->
<bind name="maxAge" value="minAge + 10"/>
<!-- 集合操作 -->
<bind name="firstRole" value="roles[0]"/>
<bind name="roleCount" value="roles.size()"/>
SELECT * FROM user WHERE name = #{trimmedName}
</select>
与直接拼接的对比
| 方式 | 安全性 | 可读性 | 跨库兼容 |
|---|---|---|---|
LIKE '%${name}%' | 不安全(SQL注入) | 一般 | 依赖 |
LIKE CONCAT('%', #{name}, '%') | 安全 | 一般 | 函数语法不同 |
<bind> + #{pattern} | 安全 | 好 | 不依赖数据库 |
bind 在 MyBatis 层完成字符串处理,不依赖数据库函数,移植性更好。
注意事项
- bind 使用 OGNL 表达式,不是 SQL 表达式,字符串用单引号
#{bind变量}走预编译,防止 SQL 注入${bind变量}走字符串替换,不推荐- 变量作用域为当前 Statement,不跨标签
要点总结
- bind 通过 OGNL 表达式创建变量,在动态 SQL 中复用
- 模糊查询推荐使用 bind 拼接
%,而非${}或 CONCAT 函数 - 支持字符串操作、数值计算、集合访问等 OGNL 表达式
- bind +
#{}走预编译,安全且跨数据库兼容 - 变量作用域限于当前 Statement
📝 发现内容有误?点击此处直接编辑