Spring Boot集成MyBatis-Plus核心查询方法详解
在使用 Spring Boot 开发 Java 应用时,MyBatis-Plus 提供了强大的 CRUD 及条件构造能力。本文通过具体的测试用例,系统梳理了 MyBatis-Plus 中普通查询、批量查询以及基于 QueryWrapper 和 LambdaQueryWrapper 的高级复杂查询技巧,帮助开发者快速掌握高效的数据检索方案。
基础环境准备
确保项目中已正确配置 Spring Boot 与 MyBatis-Plus 依赖,并完成基本的数据库连接设置(如结合 Druid 数据源)。以下示例均基于 Spring Test 环境编写,使用 @Autowired 注入 Mapper 接口进行测试。
基础查询:ID与批量获取
第1步:单条记录查询
目的:根据主键 ID 快速获取实体对象。
操作:调用 selectById 方法。
@Autowired
private StudentDao studentDao;
@Test
void selectById() {
// 传入主键值,返回对应的实体
Student student = studentDao.selectById(1000);
}
第2步:批量记录查询
目的:一次性查询多个指定主键的记录,减少数据库交互次数。
操作:构建 ID 列表,调用 selectBatchIds。
@SpringBootTest
class Spring1ApplicationTests {
@Autowired
private StudentDao studentDao;
@Test
void selectByIds() {
List<Integer> ids = Arrays.asList(1000, 1002);
List<Student> st = studentDao.selectBatchIds(ids);
}
}
高级查询:QueryWrapper 条件构造
QueryWrapper 是 MyBatis-Plus 实现多条件组合查询的核心组件。它支持丰富的链式调用方法来构建 WHERE 子句。
第1步:掌握常用比较运算符
在构造查询前,需熟悉以下关键方法的语义:
- 范围比较:
gt()(大于),ge()(大于等于),lt()(小于),le()(小于等于) - 精确匹配:
eq()(等于),ne()(不等于) - 模糊匹配:
like("name", "李")(包含),notLike(不包含),likeLeft(后缀匹配),likeRight(前缀匹配) - 空值判断:
isNull(),isNotNull() - 集合操作:
in()(包含),notIn()(不包含),between()(区间) - 排序与分页:
orderByAsc(),orderByDesc()
第2步:字符串模糊查询实例
目的:演示如何使用 like 进行非精确的文本检索。
入口:Service 或 Test 类中的 Mapper 调用。
@Test
void selectByName() {
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
// 相当于 SQL: LIKE '%李 Ming%'
queryWrapper.like("name","Li Ming");
List<Student> userInfoList = studentDao.selectList(queryWrapper);
}
第3步:多条件组合与逻辑嵌套
目的:处理复杂的业务查询,涉及 AND/OR 逻辑及字段排除。
动作:结合 and, or, nested 及 select 方法。
以下是几种典型场景的实现方式:
-
简单组合查询:名字包含“娟”且年龄小于30。
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(); queryWrapper.like("username","娟").lt("age",30); // 执行查询... -
区间与空值检查:名字含“娟”,年龄在 [20, 30] 之间,且邮箱非空。
queryWrapper.like("username","娟") .between("age",20,30) .isNotNull("email"); -
OR 逻辑与多重排序:姓肖的用户 或 年龄>=20的用户,按年龄降序、ID升序排列。
queryWrapper.likeRight("username","肖") .or().ge("age",20) .orderByDesc("age").orderByAsc("id"); -
原生 SQL 注入防护:使用日期函数过滤,推荐使用占位符防注入。
queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}","2019-10-02") .inSql("parent_id","select id from user where username like '王%'"); -
嵌套逻辑(AND/OR 混合):姓王 且 (年龄<40 或 邮箱不为空)。
这里利用 Lambda 表达式界定作用域,避免括号混淆。queryWrapper.likeRight("username","王") .and(wq->wq.lt("age",40).or().isNotNull("email")); -
子查询与过滤:仅选取特定字段(如 id, username),或使用 selectMaps 返回 Map 结构以节省内存。
queryWrapper.select("id","username").like("name","雨").lt("age",40); // 或使用 selectMaps 返回 List<Map> List<Map<String,Object>> maps = mapper.selectMaps(wrapper);
进阶技巧:Lambda 与特殊用法
第1步:使用 Lambda 避免硬编码
优势:直接使用 Java 方法引用(如 User::getAge),相比字符串属性名更安全,重构时代码会自动更新。
LambdaQueryWrapper<UserInfo> lambda = new LambdaQueryWrapper<>();
lambda.like(UserInfo::getUsername,"娟")
.lt(UserInfo::getAge,40);
第2步:链式调用简化代码
对于简单的单次查询,可直接使用 LambdaQueryChainWrapper 一步到位。
List<UserInfo> list = new LambdaQueryChainWrapper<UserInfo>(userInfoMapper)
.like(UserInfo::getUsername,"娟")
.ge(UserInfo::getAge,20)
.list();
第3步:全等查询与动态参数
AllEq 用法:适合所有字段都参与查询的场景,但需注意 null 值的处理策略。
Map<String, Object> params = new HashMap<>();
params.put("username", "xiaojuan");
// 第二个参数为 true 时可过滤掉值为 null 的键
queryWrapper.allEq((k,v)->!k.equals("excludedField"), params, true);
完成判断
当上述单元测试运行通过,控制台打印出预期的查询结果列表,且生成的 SQL 日志符合预期逻辑(如正确的 Where 子句拼接)时,表明 MyBatis-Plus 查询功能已正确集成并可灵活使用。
简要总结
以上就是 Spring Boot 中使用 MyBatis-Plus 进行各种类型查询的详细内容,包括基础主键查询、复杂的 Wrapper 条件组装以及 Lambda 安全写法。更多关于 MyBatis-Plus 性能优化与插件配置的后续资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













