模糊查询在mybatis配置xml文件中的写法

本文介绍了在使用MyBatis框架进行模糊查询时的一种有效方法:通过CONCAT('%',#{user_name}

由于不希望在使用ssm框架时,手动添加为模糊查询添加%,对字段又修改,容易出错,所以模糊查询的%%写在xml里面。

常见写法有    拼接方式,

AND user_name like '%#{user_name}%'

这种方式如果参数为空格,查询错误

拼接方式补充

AND user_name like ”%‘#{user_name}’%“

这种方式查询不完整,

最后确定  CONCAT('%', #{user_name}, '%')  能对空格正常查询,解决上面的问题。

完整示范:

</select>


<select id="test1" parameterType="java.util.Map" resultType="java.util.Map">
select * from e_user 
<where>
<if test="user_name!=null and user_name!='' ">
and user_name like CONCAT('%', #{user_name}, '%')
</if>
</where>

</select> 

好记性不如烂笔头,万一哪天忘了不好。

MyBatisXML 映射文件中,实现 **模糊查询(LIKE 查询)** 是非常常见的需求,尤其是在实现搜索功能时,例如根据用户名、标题等字段进行模糊匹配。 下面我们将详细说明如何在 MyBatis XML 文件中实现字段的模糊查询,并给出完整的示例。 --- ## ✅ 一、模糊查询的基本 SQL 语法 SQL 中模糊查询使用 `LIKE` 关键字,通配符 `%` 表示任意多个字符,`_` 表示单个字符。 ```sql SELECT * FROM user WHERE username LIKE '%admin%'; ``` --- ## ✅ 二、MyBatis XML 中实现模糊查询的几种方式 ### ✅ 1. 使用 `#{}` + Java 层拼接 `%` 这是最推荐的方式,**安全、清晰、可复用**。 #### Java 层拼接 `%` 示例: ```java String keyword = "admin"; List<User> users = userMapper.searchUsers("%" + keyword + "%"); ``` #### XML 映射文件: ```xml <select id="searchUsers" resultType="com.example.entity.User"> SELECT * FROM user WHERE username LIKE #{keyword} </select> ``` --- ### ✅ 2. 在 XML 中直接拼接 `%`(不推荐) 虽然也可以在 XML 中直接拼接 `%`,但不推荐这种方式,因为不利于参数复用和动态 SQL。 ```xml <select id="searchUsers" resultType="com.example.entity.User"> SELECT * FROM user WHERE username LIKE '%' #{keyword} '%' </select> ``` ⚠️ 注意:这种写法在某些数据库(如 MySQL)中会出错,因为 `'%' #{keyword} '%'` 会被解析为字符串拼接错误。 --- ### ✅ 3. 使用 `<bind>` 标签构造模糊查询参数(推荐) MyBatis 提供了 `<bind>` 标签,可以在 XML 中构造新的变量,适用于复杂的动态查询。 #### 示例: ```xml <select id="searchUsers" resultType="com.example.entity.User"> <bind name="pattern" value="'%' + keyword + '%'" /> SELECT * FROM user WHERE username LIKE #{pattern} </select> ``` #### Java 调用: ```java Map<String, Object> params = new HashMap<>(); params.put("keyword", "admin"); List<User> users = userMapper.searchUsers(params); ``` --- ## ✅ 三、结合动态 SQL 实现多字段模糊查询(推荐) 如果你想根据多个字段进行模糊查询,可以使用 `<if>` 和 `<where>` 动态 SQL 标签。 ### 示例:根据用户名或邮箱模糊查询 #### XML 映射文件: ```xml <select id="searchUsersByMultiFields" resultType="com.example.entity.User"> SELECT * FROM user <where> <if test="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if> <if test="email != null and email != ''"> AND email LIKE CONCAT('%', #{email}, '%') </if> </where> </select> ``` > 注意:`CONCAT('%', #{username}, '%')` 是 MySQL 的语法,其他数据库如 Oracle 使用 `||` 拼接字符串。 --- ## ✅ 四、不同数据库的模糊查询语法差异 | 数据库 | 拼接方式 | |--------|-----------| | MySQL | `CONCAT('%', #{keyword}, '%')` | | Oracle | `'%' || #{keyword} || '%'` | | SQL Server | `'%' + #{keyword} + '%'` | | PostgreSQL | `'%' || #{keyword} || '%'` 或 `CONCAT('%', #{keyword}, '%')` | --- ## ✅ 五、示例:完整接口和调用方式 ### Mapper 接口: ```java public interface UserMapper { List<User> searchUsers(@Param("keyword") String keyword); } ``` ### XML 映射文件: ```xml <select id="searchUsers" resultType="com.example.entity.User"> SELECT * FROM user WHERE username LIKE CONCAT('%', #{keyword}, '%') </select> ``` ### 调用方式: ```java List<User> users = userMapper.searchUsers("admin"); ``` --- ## ✅ 六、总结 | 方式 | 是否推荐 | 说明 | |------|----------|------| | Java 层拼接 `%` | ✅ 推荐 | 简洁、安全、易于维护 | | XML 中直接拼接 `%` | ❌ 不推荐 | 易出错,不利于复用 | | 使用 `<bind>` 构造 pattern | ✅ 推荐 | 灵活、适用于复杂场景 | | 结合 `<if>` 和 `<where>` 多字段模糊查询 | ✅ 推荐 | 动态查询最佳实践 | | 使用数据库特定函数(如 CONCAT) | ✅ 推荐 | 注意数据库兼容性 | --- ##
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值