源本科技 | 码上会

SimpleQuery

2026/04/02
0
0

引言

SimpleQuery 是 MyBatis-Plus 提供的结果集快速处理工具类,基于 Lambda + Stream 封装,无需手动写流处理,直接实现查询→转换→分组→收集一站式操作,彻底简化单表查询后的结果处理代码,是企业开发中极简高效的工具。

它的核心价值:一行代码完成查询 + 字段提取 / 转 Map / 分组 / 遍历操作,告别冗余的 Stream 写法。


前置知识

依赖与环境

  • 版本:MyBatis-Plus 3.5.0+

  • 必须存在继承 BaseMapper 的 Mapper(SimpleQuery 底层依赖它查询)

  • 支持 Spring 环境,无需额外配置

核心包路径

import com.baomidou.mybatisplus.core.toolkit.SimpleQuery;

设计思想

  • 查询与结果处理一体化

  • 支持 peek 链式副作用操作(日志、赋值、缓存等,不影响最终结果)

  • 支持并行流(大数据量提升效率)

  • 纯工具类:无侵入、无性能损耗

核心方法

方法

作用

返回值

list()

查询并提取单个字段转 List

List<字段类型>

keyMap()

查询并转 Map<字段, 实体对象>

Map<K, T>

map()

查询并转 Map<字段, 字段>

Map<K, V>

group()

查询并按字段分组

Map<K, List<T>>


通用规则

  1. 参数顺序固定 SimpleQuery.方法(查询条件, 转换规则, 并行开关, peek操作...)

  2. peek 可变参数 可传0 个 /1 个 / 多个操作,按顺序执行,不影响最终返回结果

  3. 必须传 LambdaQueryWrapper 支持类型安全,无硬编码

  4. 并行流 大数据量可开启 isParallel = true,小数据量无需开启


四大核心方法

list()

提取单字段转 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 集合、名称集合、手机号集合

  • 下拉框选项数据


keyMap()

转 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< 字段, 字段 >

键值对映射:只需要两个字段关联,无需整个对象

方法签名

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 → 名称快速查询


group()

按字段分组

支持基础分组高级聚合分组

基础分组

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 操作

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 条以上数据 不适用:小数据量(反而损耗性能)


SimpleQuery 优势

传统写法

List<User> userList = userMapper.selectList(wrapper);
List<Long> ids = new ArrayList<>();
for (User user : userList) {
    ids.add(user.getId());
    System.out.println(user);
}

SimpleQuery 写法

List<Long> ids = SimpleQuery.list(wrapper, User::getId, System.out::println);

代码精简 70%,可读性大幅提升!


注意事项

  1. 必须有 Mapper 必须存在对应实体的 BaseMapper,否则报错

  2. null 值安全 字段为 null 会正常存入集合,不会空指针

  3. 不支持联表查询 仅支持单表,多表请用 XML/ 自定义 SQL

  4. peek 不影响返回 无论怎么修改对象,返回结果不变

  5. 与 Chain 配合使用 lambdaQuery() + SimpleQuery 是企业最佳实践


最佳实践

  1. 提取 ID/ 名称用 list()

  2. 对象映射用 keyMap()

  3. 键值对字典用 map()

  4. 统计分组用 group()

  5. 日志 / 预处理统一用 peek()

  6. 单表结果处理优先使用 SimpleQuery


总结

SimpleQuery 是 MyBatis-Plus 的结果集处理神器

  • 一行完成查询、转换、分组、操作

  • 四大核心方法:list / keyMap / map / group

  • 支持 peek 链式处理 + 并行流

  • 无冗余代码、无硬编码、高性能

  • 企业单表查询必备工具