mybatisplus lambda表达式各种用法
时间: 2025-04-12 22:37:41 浏览: 45
<think>嗯,用户想了解MyBatis-Plus中Lambda表达式的不同用法。首先,我需要回忆一下MyBatis-Plus的Lambda查询功能。记得Lambda表达式在MyBatis-Plus中主要用于类型安全的查询,避免硬编码字段名,对吧?
首先,可能需要从基本的用法开始。比如,如何使用Lambda表达式进行条件构造。例如,eq、ne这些比较操作。然后可能还有范围查询,比如between、in之类的。还有排序和分组,比如orderBy和groupBy。还有嵌套条件,比如and和or的组合使用。此外,处理null值的情况也是用户可能关心的,比如使用isNull和isNotNull方法。
然后,用户提到“null”,可能想知道在Lambda表达式中如何处理null值,或者在条件中如何判断字段是否为null。比如,在SQL中,我们经常需要设置某个字段为NULL,或者在查询条件中筛选出NULL的记录。这时候,MyBatis-Plus的Lambda表达式应该提供相应的方法,比如isNull()和isNotNull()。
需要确认具体的API方法名称和用法是否正确。例如,是否确实有`isNull`和`isNotNull`方法,以及如何链式调用这些条件。同时,可能需要举例说明,比如查询某个字段为NULL的记录,或者更新某个字段为NULL的操作。
另外,用户可能对Lambda表达式在更新操作中的应用感兴趣,比如使用updateWrapper的set方法,结合Lambda表达式来指定要更新的字段和值,特别是设置为NULL的情况。这时候可能需要使用`setSql`方法,或者直接set(字段, null),但需要注意MyBatis-Plus的版本是否支持。
还要考虑到动态条件拼接,比如在条件构造器中根据情况动态添加条件,避免SQL注入,同时保持代码的可读性。例如,使用LambdaQueryWrapper的链式调用,根据业务逻辑添加不同的条件。
需要检查是否有遗漏的常用Lambda用法,比如select方法指定查询字段,或者使用函数式方法如apply来添加自定义SQL片段。此外,关联查询的情况下如何使用Lambda表达式,但MyBatis-Plus本身对联表查询的支持有限,可能更多是单表操作。
最后,总结不同用法,并确保每个例子都符合MyBatis-Plus的实际API,语法正确。可能还需要比较Lambda表达式和普通Wrapper的优势,比如类型安全,避免字段名拼写错误,重构友好等。
现在需要组织这些思路,分点列出不同用法,并给出示例代码。同时,确保使用正确的格式,行内代码用$...$,独立代码块用```,并且引用相关的参考文献中的示例,比如设置字段为NULL的更新操作,可能引用用户提供的引用[1]中的例子,但需要适应MyBatis-Plus的语法。</think>### MyBatis-Plus中Lambda表达式的用法详解
MyBatis-Plus的Lambda表达式通过类型安全的方式构建查询条件,避免直接操作数据库字段名的硬编码问题。以下是其核心用法:
---
#### 一、基础条件构造
1. **等值查询**
使用`eq`方法实现等于条件:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 25); // WHERE age = 25
```
2. **不等值查询**
使用`ne`方法实现不等于条件:
```java
wrapper.ne(User::getStatus, 0); // WHERE status != 0
```
3. **范围查询**
- `between`:区间查询
```java
wrapper.between(User::getScore, 60, 90); // WHERE score BETWEEN 60 AND 90
```
- `in`:包含值查询
```java
wrapper.in(User::getRole, Arrays.asList("admin", "editor")); // WHERE role IN ('admin','editor')
```
---
#### 二、Null值处理
1. **查询字段为Null**
使用`isNull`方法筛选字段为`NULL`的记录:
```java
wrapper.isNull(User::getPhone); // WHERE phone IS NULL
```
2. **查询字段非Null**
使用`isNotNull`方法过滤非空字段:
```java
wrapper.isNotNull(User::getEmail); // WHERE email IS NOT NULL
```
3. **更新字段为Null**
结合`UpdateWrapper`将字段设为`NULL`,类似于SQL的`UPDATE ... SET field=NULL`:
```java
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getPhone, null)
.eq(User::getUserId, 1);
userMapper.update(null, updateWrapper); // UPDATE users SET phone = NULL WHERE user_id = 1 [^1]
```
---
#### 三、复杂条件组合
1. **嵌套条件(AND/OR)**
使用`and`和`or`方法实现逻辑组合:
```java
wrapper.and(wp -> wp.gt(User::getAge, 18)
.lt(User::getAge, 30))
.or(wp -> wp.eq(User::getStatus, 1)); // WHERE (age > 18 AND age < 30) OR status = 1
```
2. **动态条件拼接**
根据业务逻辑动态添加条件:
```java
if (searchKey != null) {
wrapper.like(User::getName, searchKey); // 动态添加模糊查询
}
```
---
#### 四、排序与分组
1. **排序**
使用`orderByAsc`/`orderByDesc`实现排序:
```java
wrapper.orderByAsc(User::getCreateTime); // ORDER BY create_time ASC
```
2. **分组**
结合`groupBy`和聚合函数:
```java
wrapper.select(User::getRole, COUNT_STAR)
.groupBy(User::getRole); // SELECT role, COUNT(*) FROM user GROUP BY role
```
---
#### 五、自定义SQL片段
通过`apply`方法插入自定义SQL(需注意SQL注入风险):
```java
wrapper.apply("DATE(create_time) = '2023-01-01'"); // WHERE DATE(create_time) = '2023-01-01'
```
---
### 优势对比
| 场景 | Lambda表达式写法 | 传统Wrapper写法 |
|--------------------|----------------------------------|---------------------------------|
| 字段名引用 | `User::getName` | `"name"` |
| 类型安全 | 编译期检查字段是否存在 | 运行时可能因拼写错误导致异常 |
---
阅读全文
相关推荐


















