MyBatis模糊查询(MySQL和Oracle)

本文探讨了在MyBatis中进行模糊查询的方法,对比了MySQL和Oracle数据库的不同实现方式。在MySQL中,可以使用LIKE或REGEXP操作符;而在Oracle中,推荐使用LIKE操作符进行模糊匹配。

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

MySQL版:

可以使用 "%"#{字段名}"%" ,也可以使用 CONCAT('%',#{字段名},'%')

<select id="selectUserByName" parameterType="string" resultType="User">
	select * from t_user where `name` like "%"#{name}"%"
</select>

Oracle版:

使用 '%'||#{字段名}||'%'

<select id="selectUserByName" parameterType="string" resultType="User">
	select * from t_user where `name`  like '%'||#{name}||'%'
</select>
<think>我们正在讨论MyBatis中如何传递参数实现模糊查询。根据引用内容,有几种常见方法: 1. 使用Map传递参数(引用[1]引用[3]提到) 2. 使用对象传递参数(引用[1]引用[3]提到) 3. 使用注解传递多个参数(引用[1]提到) 4. 在SQL语句中拼接模糊查询的通配符(引用[2]示例) 具体实现: 方法一:使用Map传递参数 在Mapper接口中定义方法,参数类型为Map。 例如:List<User> getUserLike(Map<String, Object> map); 在XML映射文件中: <select id="getUserLike" parameterType="map" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%') </select> 调用时,将参数放入Map中: Map<String, Object> map = new HashMap<>(); map.put("name", "张"); List<User> users = mapper.getUserLike(map); 方法二:使用对象传递参数 如果有一个User对象,其中包含name属性,可以直接传递User对象。 Mapper接口:List<User> getUserLike(User user); XML映射文件: <select id="getUserLike" parameterType="User" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%') </select> 调用时: User user = new User(); user.setName("张"); List<User> users = mapper.getUserLike(user); 方法三:使用注解传递参数(适用于多个参数) 在Mapper接口中,使用@Param注解指定参数名。 List<User> getUserLike(@Param("userName") String name); XML映射文件: <select id="getUserLike" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{userName}, '%') </select> 方法四:在SQL语句中直接拼接(如引用[2]所示) 这种方法在SQL中直接使用"%"拼接,注意这里使用双引号包裹百分号,然后使用#{}取参数。 <select id="getUserLike2" parameterType="String" resultType="User"> select * from user where name like "%"#{name}"%" </select> 注意:这种方法虽然简洁,但可能在不同数据库中存在兼容性问题(例如,在Oracle中可能不适用)。而使用CONCAT函数则更通用。 另外,还可以在Java代码中拼接好带通配符的字符串,然后作为参数传递。例如: String name = "%张%"; 然后传递name,在SQL中直接使用LIKE #{name}。 总结:推荐使用CONCAT函数或Java代码中拼接,以保证数据库兼容性。 §§相关问题§§ 1. MyBatis中如何传递多个参数? 2. MyBatis的#{}${}在模糊查询中有什么区别? 3. 如何防止MyBatis中的SQL注入? 4. MyBatis中如何实现动态SQL的模糊查询?</think>### MyBatis模糊查询参数传递方法 在MyBatis中实现模糊查询,主要有以下几种参数传递方式: #### 1. **使用Map传递参数**(推荐) ```xml <!-- userMapper.xml --> <select id="getUserLike" parameterType="map" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{keyword}, '%') </select> ``` ```java // Java调用 Map<String, Object> map = new HashMap<>(); map.put("keyword", "张"); // 传入搜索词 List<User> users = userMapper.getUserLike(map); ``` **特点**: - 灵活传递多个参数 - SQL中通过`#{key}`取值 - 使用`CONCAT()`保证数据库兼容性[^1][^3] #### 2. **对象属性传递** ```xml <!-- 参数为实体类对象 --> <select id="getUserLike" parameterType="User" resultType="User"> SELECT * FROM user WHERE name LIKE '%${name}%' </select> ``` ```java // Java调用 User query = new User(); query.setName("张"); List<User> users = userMapper.getUserLike(query); ``` **注意**:`${}`有SQL注入风险,建议改用`CONCAT('%', #{name}, '%')` #### 3. **注解传递参数**(单参数) ```java // Mapper接口 List<User> getUserLike(@Param("kw") String keyword); ``` ```xml <select id="getUserLike" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{kw}, '%') </select> ``` #### 4. **SQL拼接法**(需注意兼容性) ```xml <select id="getUserLike" parameterType="String"> SELECT * FROM user WHERE name LIKE "%"#{name}"%" </select> ``` **适用场景**:仅限支持字符串连接的数据库(如MySQL)[^2] --- ### ⚠️ 重要安全建议 1. **优先使用#{}** `#{}`会预编译参数,防止SQL注入;`${}`直接拼接字符串,存在安全风险 ```xml <!-- 安全写法 --> LIKE CONCAT('%', #{param}, '%') <!-- 危险写法 --> LIKE '%${param}%' ``` 2. **通配符处理** 可在Java层预处理参数: ```java String keyword = "张"; keyword = "%" + keyword + "%"; // 添加通配符 ``` --- ### 性能优化技巧 - **索引利用**:确保查询字段有索引,避免全表扫描 - **动态SQL**:结合`<if>`标签实现条件组合 ```xml <select id="searchUser" parameterType="map"> SELECT * FROM user <where> <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="email != null"> AND email LIKE CONCAT('%', #{email}, '%') </if> </where> </select> ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值