全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 日志框架集成
下一篇 → choose-when-otherwise 分支
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库