Mybatis关于like的处理

本文介绍如何使用SQL实现模糊查询,包括使用%符号进行参数拼接和利用bind标签实现动态SQL构造的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、利用"%"对入参进行拼接

2、SQL语句字符串拼接

    SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');

3、bind标签

<select id="findUserByFuzzyEmail" resultMap="BaseResultMap"
        parameterType="java.lang.String">
        select id,username,email,status,createtime,updatetime from tb_user
        <bind name="pattern" value="'%'+_parameter.getEmail() +'%'" />
        <where>
            <if test="email != null and email != ''">
                email like #{pattern}
            </if>
        </where>
    </select>



MyBatis 中,实现 `LIKE` 模糊查询是常见的数据库操作之一。根据不同的使用场景,可以通过多种方式实现,主要包括使用 `#{} `和 `${}` 占位符、结合 SQL 函数(如 `CONCAT`)以及动态 SQL 标签来构建查询条件。 ### 使用 `#{} `和 `CONCAT` 实现模糊查询 通过 `#{} `占位符与 `CONCAT` 函数结合,可以安全地构造模糊查询语句,防止 SQL 注入攻击。例如,在 XML 映射文件中可以这样写: ```xml <select id="selectUsersByName" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%') </select> ``` 这种方式将参数 `#{name}` 作为预编译值传入,确保了安全性[^2]。 ### 使用 `${} `实现模糊查询 虽然不推荐使用 `${} `占位符进行模糊查询,因为它存在 SQL 注入的风险,但在某些特定场景下仍然可以使用: ```xml <select id="selectUsersByName" resultType="User"> SELECT * FROM user WHERE name LIKE '%${name}%' </select> ``` 注意,使用 `${} `时必须确保传入的参数是可信的,否则可能导致安全问题[^4]。 ### 使用注解方式实现模糊查询 在 MyBatis 中,还可以通过注解的方式实现模糊查询。例如,使用 `@Select` 注解并结合 `CONCAT` 函数: ```java @Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')") List<User> likeSelectUser(String name); ``` 该方式在简洁性和可读性上具有优势,适用于简单的查询场景[^2]。 ### 使用动态 SQL 实现模糊查询 MyBatis 提供了强大的动态 SQL 功能,可以通过 `<if>` 和 `<where>` 标签实现条件判断,从而构建更复杂的查询语句。例如: ```xml <select id="dynamicLikeQuery" resultType="User"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> </where> </select> ``` 该方式允许根据参数是否存在动态生成 SQL 语句,提高查询的灵活性和可维护性[^3]。 ### 安全性与性能对比 | 对比项 | `#{}` | `${}` | |--------------|-------------------------------------|--------------------------------------| | 处理方式 | 预编译(`?` 占位符),参数类型自动适配 | 直接字符串替换,原样拼接到 SQL 中 | | 安全性 | ✅ 防止 SQL 注入 | ❌ 存在 SQL 注入风险 | | 引号处理 | 自动添加(如字符串变为 `'value'`) | 需手动添加引号(如 `'${value}'`) | | 适用场景 | 动态值(`WHERE` 条件、`INSERT` 值等) | 动态 SQL 片段(表名、字段名、排序语句等) | | 不适用场景 | 表名、字段名、排序语句等非值场景 | 值传递(需手动处理引号和注入问题) | | 性能影响 | 无(预编译优化,索引有效) | 可能索引失效(如数字强制加引号) | 建议在模糊查询中优先使用 `#{}` 占位符结合 `CONCAT` 函数的方式,以保证查询的安全性和性能[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值