mybatis 集合的方式写模糊查询
时间: 2025-03-31 10:13:44 浏览: 35
<think>嗯,用户想知道怎么用MyBatis的集合参数实现模糊查询。首先,我得回忆一下MyBatis处理集合参数的方式。通常,当传入List或数组时,MyBatis会自动包装成Map,比如List用"list"作为键,数组用"array"。然后,在XML中,需要用foreach标签遍历集合,对吧?
那模糊查询的话,通常是在参数前后加%,比如用concat函数拼接。但如果要同时用集合参数,比如多个关键字进行模糊查询,可能需要每个元素都加上%符号。比如用户传入一个包含多个关键字的List,希望查询某个字段包含任意一个关键字的结果。
这时候,可能需要结合foreach和concat函数。比如在foreach里,对每个元素用concat('%', #{it}, '%'),这样每个元素都会被处理成%keyword%的形式。然后在SQL里用OR连接多个like条件。
比如用户想查询bookName里包含集合中的任何一个词,SQL应该是select * from book where bookName like '%keyword1%' or like '%keyword2%'等等。这样在XML中,foreach循环生成多个like条件,用OR连接。
不过要注意集合参数的引用方式,如果是List类型,collection属性应该设为"list"。然后每个item在循环中处理成like的条件。同时,可能需要使用动态SQL的where标签来避免语法错误,比如当集合为空时的情况。
另外,参考引用中的例子,比如引用4提到在concat函数里拼接%,所以可以借鉴这个方法到foreach里。比如每个元素都通过concat加上通配符。然后整个foreach生成多个OR条件。
还有,用户可能希望参数是动态的,比如不同的字段进行模糊查询,或者多个条件组合。这时候可能需要更复杂的动态SQL,但当前问题主要是集合参数和模糊查询的结合。
总结步骤应该是:定义接口方法接受集合参数,XML中使用foreach遍历,每个元素用concat处理,生成多个like条件用OR连接。测试时传入List参数即可。
可能需要注意的地方是SQL注入的问题,但MyBatis的#{}已经做了预编译,应该没问题。另外,如果集合为空,需要处理,可以用if标签判断,避免SQL错误。</think>### MyBatis使用集合参数实现模糊查询的方法
在MyBatis中,通过`<foreach>`标签结合模糊查询语法,可以实现基于集合参数的动态模糊查询。以下是具体实现步骤:
---
#### 1. 定义持久层接口方法
接口需接收集合参数(如`List<String>`):
```java
List<Book> fuzzyQueryByList(@Param("keywords") List<String> keywords);
```
---
#### 2. XML映射文件配置
在SQL语句中,使用`<foreach>`遍历集合,并通过MySQL的`CONCAT()`函数拼接模糊查询通配符`%`:
```xml
<select id="fuzzyQueryByList" resultType="com.example.Book">
SELECT * FROM book
WHERE
<foreach collection="keywords" item="keyword" separator=" OR ">
bookName LIKE CONCAT('%', #{keyword}, '%')
</foreach>
</select>
```
- **`collection`**:指定集合参数名称,若接口方法使用`@Param("keywords")`,则此处填`keywords`
- **`item`**:定义集合元素的临时变量名
- **`separator`**:设置循环间的连接符(此处用`OR`实现多条件匹配)[^3][^4]
---
#### 3. 动态SQL优化
若需处理空集合或增强灵活性,可添加`<if>`和`<where>`标签:
```xml
<select id="fuzzyQueryByList" resultType="com.example.Book">
SELECT * FROM book
<where>
<if test="keywords != null and keywords.size() > 0">
<foreach collection="keywords" item="keyword" separator=" OR ">
bookName LIKE CONCAT('%', #{keyword}, '%')
</foreach>
</if>
</where>
</select>
```
---
#### 4. 测试调用
传入List参数执行模糊查询:
```java
List<String> keywords = Arrays.asList("Java", "Spring");
List<Book> books = bookMapper.fuzzyQueryByList(keywords);
```
---
### 实现原理说明
1. **集合参数处理**:MyBatis自动将List包装为Map,键名为`keywords`(由`@Param`定义)
2. **通配符拼接**:`CONCAT('%', #{keyword}, '%')`生成`%Java%`格式的模糊查询条件
3. **动态条件生成**:`<foreach>`遍历集合生成多个`LIKE`条件,通过`OR`连接实现多关键词匹配
---
阅读全文
相关推荐


















