Spring Boot集成MyBatis-Plus核心查询方法详解

唐可
唐可
发布时间:2026-10-15 | 5人浏览过
原创

在使用 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 方法。

以下是几种典型场景的实现方式:

  1. 简单组合查询:名字包含“娟”且年龄小于30。
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("username","娟").lt("age",30);
    // 执行查询...
    
  2. 区间与空值检查:名字含“娟”,年龄在 [20, 30] 之间,且邮箱非空。
    queryWrapper.like("username","娟")
               .between("age",20,30)
               .isNotNull("email");
    
  3. OR 逻辑与多重排序:姓肖的用户 或 年龄>=20的用户,按年龄降序、ID升序排列。
    queryWrapper.likeRight("username","肖")
                .or().ge("age",20)
                .orderByDesc("age").orderByAsc("id");
    
  4. 原生 SQL 注入防护:使用日期函数过滤,推荐使用占位符防注入。
    queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}","2019-10-02")
               .inSql("parent_id","select id from user where username like '王%'");
    
  5. 嵌套逻辑(AND/OR 混合):姓王 且 (年龄<40 或 邮箱不为空)。
    这里利用 Lambda 表达式界定作用域,避免括号混淆。
    queryWrapper.likeRight("username","王")
               .and(wq->wq.lt("age",40).or().isNotNull("email"));
    
  6. 子查询与过滤:仅选取特定字段(如 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 性能优化与插件配置的后续资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表