mybatis-plus 常用方法
📅 2026/7/15 19:50:24
👁️ 阅读次数
📝 编程学习
selectList
importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importjava.util.List;// 假设有一个 User 实体类List<User>users=userMapper.selectList(newLambdaQueryWrapper<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);复杂条件示例
LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<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);条件动态拼接(非常实用)
Stringname="张";IntegerminAge=null;LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<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. 调用的
在学习的时候, 发现 lambdaQuery().one()
lambdaQuery().one()
ApplyInfoModelapplyInfoModel=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 可以直接使用:
getOne(wrapper)// 查询单条getOne(wrapper,false)// 查询单条,多条时不抛异常list(wrapper)// 条件查询列表count(wrapper)// 条件统计page(page,wrapper)// 分页查询getOne(wrapper)// 查询单条getOne(wrapper,false)// 查询单条,多条时不抛异常list(wrapper)// 条件查询列表count(wrapper)// 条件统计page(page,wrapper)// 分页查询lambdaQuery()// 返回 LambdaQueryChainWrapper,支持 .eq().like().one() 等链式调用lambdaUpdate()// 返回 LambdaUpdateChainWrapper,支持链式更新query()// 返回 QueryChainWrapperupdate()// 返回 UpdateChainWrapper继承ServiceImpl | 不继承(普通 Service) | |
|---|---|---|
| 调用 MP 方法 | ✅ 直接调用,无需注入 Mapper | ❌ 需要手动@AutowiredMapper |
| 链式查询 | ✅ 支持lambdaQuery() | ❌ 不支持 |
| 代码简洁度 | 高 | 一般 |
编程学习
技术分享
实战经验