selectList
java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
// 假设有一个 User 实体类
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.eq(User::getId, 1001) // WHERE id = 1001
.gt(User::getAge, 18) // AND age > 18
.like(User::getName, "张") // AND name LIKE '%张%'
.orderByDesc(User::getCreateTime) // ORDER BY create_time DESC
);
复杂条件示例
java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.and(w -> w.gt(User::getAge, 18).or().isNotNull(User::getEmail))
.orderByDesc(User::getCreateTime)
.last("LIMIT 10"); // 拼接原生 SQL 片段
List<User> users = userMapper.selectList(wrapper);
条件动态拼接(非常实用)
java
String name = "张";
Integer minAge = null;
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.like(name != null, User::getName, name) // 条件为 true 时才拼接
.gt(minAge != null, User::getAge, minAge); // minAge 为 null,这行不会生效
List<User> users = userMapper.selectList(wrapper);
LambdaQueryWrapper
| 方法 | 说明 | 示例 |
|---|---|---|
eq(字段, 值) |
等于 = |
.eq(User::getId, 1) |
ne(字段, 值) |
不等于 != |
.ne(User::getStatus, 0) |
gt(字段, 值) |
大于 > |
.gt(User::getAge, 18) |
ge(字段, 值) |
大于等于 >= |
.ge(User::getAge, 18) |
lt(字段, 值) |
小于 < |
.lt(User::getAge, 60) |
le(字段, 值) |
小于等于 <= |
.le(User::getAge, 60) |
like(字段, 值) |
模糊匹配 LIKE '%值%' |
.like(User::getName, "张") |
likeLeft(字段, 值) |
左模糊 LIKE '%值' |
.likeLeft(User::getName, "三") |
likeRight(字段, 值) |
右模糊 LIKE '值%' |
.likeRight(User::getName, "张") |
in(字段, 集合) |
IN 查询 | .in(User::getId, Arrays.asList(1,2,3)) |
isNull(字段) |
为 NULL | .isNull(User::getEmail) |
isNotNull(字段) |
不为 NULL | .isNotNull(User::getEmail) |
orderByAsc(字段) |
升序 | .orderByAsc(User::getAge) |
orderByDesc(字段) |
降序 | .orderByDesc(User::getCreateTime) |
between(字段, 值1, 值2) |
区间查询 | .between(User::getAge, 18, 60) |
and(条件) |
嵌套 AND | .and(w -> w.gt(User::getAge, 18).lt(User::getAge, 60)) |
or() |
OR | .eq(User::getId, 1).or().eq(User::getId, 2) |
select(字段...) |
指定查询列 | .select(User::getId, User::getName) |
这些方法都是mapper层的 是mapper. 调用的
等一下,等一下 这个selectList方法意味着什么呢?
我们在mapper层里也自己定义了一些方法, 然后隐射到xml 里, 这些方法就意味着和我们在mapper层 接口里 定义的方法是同级的, 只不过这是mybatis-plus自己定义好,我们可以直接使用的
在学习的时候, 发现 lambdaQuery().one()
lambdaQuery().one()
java
ApplyInfoModel applyInfoModel = applyInfoService.lambdaQuery()
.eq(ApplyInfoModel::getProcessInstId, list.get(0).getProcessInstId())
.one();
lambdaQuery().one() 和 selectOne() 都是 MyBatis-Plus 中查询单条记录的方法,但它们所属的层级不同、使用方式不同、行为也有差异。
| 对比项 | lambdaQuery().one() |
selectOne() |
|---|---|---|
| 所属层级 | Service 层(链式查询) | Mapper 层 |
| 调用者 | 继承 ServiceImpl 的 Service |
继承 BaseMapper 的 Mapper |
| 参数 | 通过链式 .eq()、.like() 等拼接条件 |
传入一个 Wrapper 对象 |
| 返回值 | 实体对象(或 null) |
实体对象(或 null) |
| 场景 | lambdaQuery().one() |
selectOne() |
|---|---|---|
| 查到 0 条 | 返回 null |
返回 null |
| 查到 1 条 | 返回该记录 | 返回该记录 |
| 查到 多条 | 抛出 TooManyResultsException |
返回第一条,不抛异常 |
继承 ServiceImpl 层的service 也具有调用mybatis-plus里方法的能力
继承 ServiceImpl<YourMapper, YourEntity> 后,你的 Service 可以直接使用:
sql
getOne(wrapper) // 查询单条
getOne(wrapper, false) // 查询单条,多条时不抛异常
list(wrapper) // 条件查询列表
count(wrapper) // 条件统计
page(page, wrapper) // 分页查询
sql
getOne(wrapper) // 查询单条
getOne(wrapper, false) // 查询单条,多条时不抛异常
list(wrapper) // 条件查询列表
count(wrapper) // 条件统计
page(page, wrapper) // 分页查询
sql
lambdaQuery() // 返回 LambdaQueryChainWrapper,支持 .eq().like().one() 等链式调用
lambdaUpdate() // 返回 LambdaUpdateChainWrapper,支持链式更新
query() // 返回 QueryChainWrapper
update() // 返回 UpdateChainWrapper
继承 ServiceImpl |
不继承(普通 Service) | |
|---|---|---|
| 调用 MP 方法 | ✅ 直接调用,无需注入 Mapper | ❌ 需要手动 @Autowired Mapper |
| 链式查询 | ✅ 支持 lambdaQuery() |
❌ 不支持 |
| 代码简洁度 | 高 | 一般 |