SimpleQuery 是 MyBatis-Plus 提供的结果集快速处理工具类,基于 Lambda + Stream 封装,无需手动写流处理,直接实现查询→转换→分组→收集一站式操作,彻底简化单表查询后的结果处理代码,是企业开发中极简高效的工具。
它的核心价值:一行代码完成查询 + 字段提取 / 转 Map / 分组 / 遍历操作,告别冗余的 Stream 写法。
版本:MyBatis-Plus 3.5.0+
必须存在继承 BaseMapper 的 Mapper(SimpleQuery 底层依赖它查询)
支持 Spring 环境,无需额外配置
import com.baomidou.mybatisplus.core.toolkit.SimpleQuery;查询与结果处理一体化
支持 peek 链式副作用操作(日志、赋值、缓存等,不影响最终结果)
支持并行流(大数据量提升效率)
纯工具类:无侵入、无性能损耗
参数顺序固定 SimpleQuery.方法(查询条件, 转换规则, 并行开关, peek操作...)
peek 可变参数 可传0 个 /1 个 / 多个操作,按顺序执行,不影响最终返回结果
必须传 LambdaQueryWrapper 支持类型安全,无硬编码
并行流 大数据量可开启 isParallel = true,小数据量无需开启
提取单字段转 List
最常用:直接提取某一列数据,无需手动遍历
方法签名
List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> field, Consumer<E>... peeks);
List<A> list(..., boolean isParallel, ...);示例
// 需求:查询状态正常的用户ID列表,并打印日志
List<Long> userIdList = SimpleQuery.list(
Wrappers.lambdaQuery(User.class)
.eq(User::getStatus, 1), // 查询条件
User::getId, // 提取字段:只需要ID
user -> System.out.println("查询到用户:" + user.getId()), // peek操作
user -> log.info("处理用户:{}", user.getUsername()) // 第二个peek
);适用场景
获取 ID 集合、名称集合、手机号集合
下拉框选项数据
转 Map< 字段, 实体对象 >
快速构建对象映射,根据某个字段直接获取整个对象
方法签名
Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyField, Consumer<E>... peeks);示例
// 需求:用户ID -> 用户对象
Map<Long, User> idUserMap = SimpleQuery.keyMap(
Wrappers.lambdaQuery(User.class).eq(User::getDelFlag, 0),
User::getId, // Key:用户ID
user -> user.setUsername("【激活】" + user.getUsername()) // 统一处理名称
);适用场景
根据 ID/ 编码快速获取对象
关联查询时批量匹配数据
转 Map< 字段, 字段 >
键值对映射:只需要两个字段关联,无需整个对象
方法签名
Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E,A> key, SFunction<E,P> value, ...);示例
// 需求:用户ID -> 用户名
Map<Long, String> idNameMap = SimpleQuery.map(
Wrappers.lambdaQuery(User.class),
User::getId, // Key
User::getUsername // Value
);适用场景
字典映射:编码 → 名称
ID → 名称快速查询
按字段分组
支持基础分组和高级聚合分组
基础分组
Map< 字段, List< 实体 >>
// 按年龄分组用户
Map<Integer, List<User>> ageUserMap = SimpleQuery.group(
Wrappers.lambdaQuery(User.class),
User::getAge
);高级分组
聚合计算(计数 / 求和 / 平均值)
// 按部门ID分组,统计每个部门人数
Map<Long, Long> deptCountMap = SimpleQuery.group(
Wrappers.lambdaQuery(User.class),
User::getDeptId,
Collectors.counting() // 下游收集器:计数
);
// 按部门分组,求平均年龄
Map<Long, Double> deptAvgAgeMap = SimpleQuery.group(
Wrappers.lambdaQuery(User.class),
User::getDeptId,
Collectors.averagingInt(User::getAge)
);适用场景
按状态 / 类型 / 部门分组
统计报表、聚合计算
peek 是副作用操作,不会改变返回结果,可用于:
打印日志
数据预处理
赋值 / 脱敏
发送消息 / 更新缓存
数据校验
示例:
SimpleQuery.list(
wrapper,
User::getId,
user -> log.info("用户:{}", user), // 日志
user -> user.setPhone(desensitize(user.getPhone())), // 脱敏
user -> cacheService.updateCache(user) // 缓存
);大数据量优化
// 开启并行流(true)
List<Long> ids = SimpleQuery.list(wrapper, User::getId, true);适用:1000 条以上数据 不适用:小数据量(反而损耗性能)
List<User> userList = userMapper.selectList(wrapper);
List<Long> ids = new ArrayList<>();
for (User user : userList) {
ids.add(user.getId());
System.out.println(user);
}List<Long> ids = SimpleQuery.list(wrapper, User::getId, System.out::println);代码精简 70%,可读性大幅提升!
必须有 Mapper 必须存在对应实体的 BaseMapper,否则报错
null 值安全 字段为 null 会正常存入集合,不会空指针
不支持联表查询 仅支持单表,多表请用 XML/ 自定义 SQL
peek 不影响返回 无论怎么修改对象,返回结果不变
与 Chain 配合使用 lambdaQuery() + SimpleQuery 是企业最佳实践
提取 ID/ 名称用 list()
对象映射用 keyMap()
键值对字典用 map()
统计分组用 group()
日志 / 预处理统一用 peek()
单表结果处理优先使用 SimpleQuery
SimpleQuery 是 MyBatis-Plus 的结果集处理神器:
一行完成查询、转换、分组、操作
四大核心方法:list / keyMap / map / group
支持 peek 链式处理 + 并行流
无冗余代码、无硬编码、高性能
企业单表查询必备工具