请介绍在使用 MyBatis Plus 框架时,如何通过 QueryWrapper 实现对 MySQL 数据库的灵活查询?
考察说明
考查对 MyBatis Plus 中 QueryWrapper 的核心 API 和动态查询能力的掌握程度。
回答思路
- 【回答框架 1】QueryWrapper 是 MyBatis Plus 提供的条件构造器,用于以链式方式构建 SQL 查询条件,避免手写 XML 或注解 SQL,可动态拼接 WHERE 子句。其核心方法包括 eq、ne、like、between、in、isNull、orderBy 等,支持 Lambda 表达式版本 LambdaQueryWrapper 以避免硬编码字段名。
- 【回答框架 2】典型用法是在 Service 或 Mapper 层创建 QueryWrapper 实例,调用条件方法后传给 selectList、selectOne、selectPage 等方法。例如 wrapper.eq("name", "张三").like("email", "@qq.com")。通过判断条件是否为空,可以按需添加查询条件,实现灵活查询。
- 【回答框架 3】LambdaQueryWrapper 使用实体类的 Lambda 方法引用,例如 wrapper.lambda().eq(User::getName, name),编译期校验字段名,减少重构维护成本。此外,QueryWrapper 支持嵌套条件(and、or 方法)和分组(groupBy)、排序(orderByAsc/Desc)等,可直接构建复杂 SQL。
- 【回答框架 4】在性能方面,QueryWrapper 生成的 SQL 依赖底层数据库优化,合理的索引和避免全表扫描是关键。对于大批量查询,应配合分页插件 Page 使用,避免内存溢出。对于动态多条件查询,需注意防止 SQL 注入,MyBatis Plus 内部使用预编译机制,但当使用 apply 方法拼接字符串时应特别谨慎。
- 【关键点 1】QueryWrapper 是 MyBatis Plus 的条件构造器,支持链式调用和动态条件拼接。
- 【关键点 2】LambdaQueryWrapper 通过 Lambda 表达式避免字段硬编码,提升类型安全。
- 【关键点 3】常用方法 eq、like、between、in、orderBy 等可满足大多数查询需求。
- 【关键点 4】动态查询需结合逻辑判断按需添加条件,避免不必要的查询开销。
- 【关键点 5】使用 apply 方法自定义 SQL 片段时注意 SQL 注入风险。
- 【易错点 1】误将 QueryWrapper 用于复杂多表关联查询,导致性能瓶颈,应使用自定义 SQL。
- 【易错点 2】不区分 eq 和 like 的语义,导致查询结果不准确。
- 【易错点 3】动态条件未判空,导致生成无条件查询或空条件报错;或使用 apply 时拼接未过滤的用户输入造成注入。