java中lambdaqueryWrapper.like
时间: 2025-07-19 21:34:16 浏览: 3
<think>我们正在讨论在Java中使用LambdaQueryWrapper的like方法进行模糊查询。
首先,LambdaQueryWrapper是MyBatis-Plus框架中的一个链式条件构造器,它允许我们使用Lambda表达式来构建查询条件,避免硬编码字段名。
like方法用于构建SQL中的LIKE条件,即模糊查询。
使用步骤:
1. 创建LambdaQueryWrapper实例,指定泛型为实体类。
2. 使用like方法,第一个参数是实体字段的Lambda表达式,第二个参数是匹配的值(可以包含通配符,但通常我们会在值中加上%)。
注意:like方法默认不会在值两边添加%,所以我们需要自己添加。例如,要查询名字中包含"张"的用户,我们应该传入"%张%"。
示例代码:
假设我们有一个User实体类,其中包含userName字段。
引用参考:在MyBatis-Plus官方文档中,关于条件构造器的使用有详细说明[^1]。
代码示例:
```java
// 引入必要的类
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
// 假设在Service中
public List<User> findUsersByName(String name) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 使用like方法,注意:这里我们手动添加了通配符%,表示前后任意字符
queryWrapper.like(User::getUserName, "%" + name + "%");
// 执行查询
return userMapper.selectList(queryWrapper);
}
```
另外,MyBatis-Plus还提供了其他几个类似的方法:
- likeLeft: 在值左侧添加%,如 `%value`
- likeRight: 在值右侧添加%,如 `value%`
- notLike: 反向的like
因此,上面的例子也可以写成:
```java
queryWrapper.likeRight(User::getUserName, name); // 这样会生成:user_name like 'name%'
// 或者
queryWrapper.likeLeft(User::getUserName, name); // 这样会生成:user_name like '%name'
// 而如果我们想要两边都加%,则使用like并自己添加%,或者使用like方法然后传入已经加了%的字符串。
// 实际上,我们也可以这样使用(效果与第一个例子相同):
queryWrapper.like(User::getUserName, name).apply("", "%"+name+"%"); // 但这样并不必要,因为like方法已经可以传入带%的字符串。
```
注意事项:
1. 如果传入的值为null,则条件不会加入查询。
2. 防止SQL注入:由于like方法内部使用的是预编译,所以传入的值会作为参数,不会直接拼接到SQL语句中,因此是安全的。
引用参考:MyBatis-Plus的条件构造器使用预编译机制,有效防止了SQL注入[^1]。
如果查询条件需要多个字段模糊查询同一个值,可以使用or或and连接多个条件。例如:
```java
queryWrapper.like(User::getUserName, "%"+name+"%")
.or()
.like(User::getNickName, "%"+name+"%");
```
这样会生成:user_name like ? OR nick_name like ?
总结:使用LambdaQueryWrapper的like方法进行模糊查询,需要自己添加通配符%,或者使用likeLeft/likeRight方法。同时,注意条件的组合。
相关问题:
1. LambdaQueryWrapper中如何同时使用多个条件(例如同时使用eq和like)?
2. 在MyBatis-Plus中,除了LambdaQueryWrapper还有哪些条件构造器?
3. 如何防止在使用LambdaQueryWrapper时出现SQL注入?
4. 在模糊查询中,如果查询的值包含通配符(如下划线_或百分号%),该如何处理?</think>### 在Java中使用LambdaQueryWrapper的like方法进行模糊查询
`LambdaQueryWrapper`是MyBatis-Plus框架提供的链式查询构造器,支持Lambda表达式写法,可避免字段名的硬编码。`like()`方法用于构建SQL的`LIKE`模糊查询条件,基本语法如下:
```java
.like(实体类::字段方法引用, 查询值)
```
#### 核心用法示例
```java
// 示例实体类
public class Product {
private Long id;
private String name; // 产品名称
private String origin; // 产地
}
// 模糊查询服务实现
public List<Product> searchProducts(String keyword) {
LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
// 单字段模糊查询(自动添加%通配符)
wrapper.like(Product::getName, keyword);
// 等效SQL: WHERE name LIKE '%keyword%'
// 多字段OR模糊查询
wrapper.like(Product::getName, keyword)
.or()
.like(Product::getOrigin, keyword);
// 等效SQL: WHERE name LIKE '%keyword%' OR origin LIKE '%keyword%'
return productMapper.selectList(wrapper);
}
```
#### 通配符控制方法
| 方法名 | 说明 | 示例 | 等效SQL |
|--------------|--------------------------|------------------------------|-----------------------|
| `like()` | 两侧添加`%` | `like(Product::getName, "苹果")` | `name LIKE '%苹果%'` |
| `likeLeft()` | 仅在左侧添加`%` | `likeLeft(Product::getName, "苹果")` | `name LIKE '%苹果'` |
| `likeRight()`| 仅在右侧添加`%` | `likeRight(Product::getName, "苹果")` | `name LIKE '苹果%'` |
| `notLike()` | 反向模糊匹配 | `notLike(Product::getName, "过期")` | `name NOT LIKE '%过期%'` |
#### 特殊字符处理
当查询值包含SQL通配符(`%`或`_`)时,需使用转义符:
```java
wrapper.like(Product::getName, "100%果汁")
.apply("ESCAPE '/'"); // 指定转义符
// 等效SQL: WHERE name LIKE '%100/%果汁%' ESCAPE '/'
```
#### 最佳实践建议
1. **空值处理**:添加非空校验避免无效查询
```java
if (StringUtils.isNotBlank(keyword)) {
wrapper.like(Product::getName, keyword);
}
```
2. **索引优化**:对高频查询字段建立数据库索引
3. **分页支持**:结合`Page`对象实现分页
```java
Page<Product> page = new Page<>(1, 10);
productMapper.selectPage(page, wrapper);
```
4. **大小写敏感**:需数据库层面配置(如MySQL的`utf8_general_ci`不区分大小写)
> 引用参考:MyBatis-Plus官方文档指出,条件构造器能有效简化SQL编写,同时通过预编译机制防止SQL注入[^1]。在实际项目中,应结合具体业务需求设计模糊查询策略,并注意接口性能优化[^1]。
---
### 相关问题
1. **`like()`与`eq()`方法在查询逻辑上有何本质区别?**
2. **如何实现多字段联合模糊查询并指定不同权重?**
3. **在分页场景下,模糊查询的性能优化有哪些具体手段?**
4. **MyBatis-Plus中`apply()`方法如何扩展like的复杂条件?**
[^1]: MyBatis-Plus官方文档 - 条件构造器章节
阅读全文
相关推荐


















