MyBatis-Plus 复杂查询与分页教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


MyBatis-Plus 复杂查询与分页教程

目录

  1. 环境准备
  2. 基础回顾
  3. 复杂查询实现
    • 条件构造器 QueryWrapper
    • 动态条件拼接
    • 多表关联查询(非Join方案)
  4. 分页功能
    • 分页插件配置
    • 分页查询基本用法
    • 分页与复杂查询结合
  5. 完整示例代码
  6. 常见问题与注意事项

1. 环境准备

确保项目中已引入 MyBatis-Plus 依赖(以 Maven 为例):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

2. 基础回顾

  • 实体类:使用 @TableName 注解绑定数据库表。
  • Mapper 接口:继承 BaseMapper<T>,获得基础 CRUD 方法。
  • Service 层:可通过 ServiceImpl<Mapper, Entity> 快速实现服务。

3. 复杂查询实现

3.1 条件构造器 QueryWrapper

通过链式调用构建查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
    .like("username", "张") // 模糊查询
    .between("age", 18, 30) // 范围查询
    .isNotNull("email") // 非空判断
    .orderByDesc("create_time"); // 排序
List<User> users = userMapper.selectList(queryWrapper);

3.2 动态条件拼接

根据业务逻辑动态添加条件(避免 SQL 注入):

public List<User> searchUsers(String keyword, Integer minAge, Integer maxAge) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(keyword)) {
        wrapper.and(w -> w.like("username", keyword).or().like("email", keyword));
    }
    if (minAge != null && maxAge != null) {
        wrapper.between("age", minAge, maxAge);
    }
    return userMapper.selectList(wrapper);
}

3.3 多表关联查询

MyBatis-Plus 不直接支持 Join,但可通过以下方式实现:

  1. 自定义 SQL 片段:在 XML 中编写 SQL,使用 @Select 注解或 XML 映射。
  2. Service 层组合查询:分步查询后聚合数据(适用于简单关联)。

示例(XML 方式):

<!-- UserMapper.xml -->
<select id="selectUserWithRole" resultType="UserVO">
    SELECT u.*, r.role_name 
    FROM user u
    LEFT JOIN role r ON u.role_id = r.id
    WHERE u.id = #{userId}
</select>

4. 分页功能

4.1 分页插件配置

在 Spring Boot 启动类或配置类中添加:

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

4.2 基础分页查询

// 页码从 1 开始
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
QueryWrapper<User> wrapper = new QueryWrapper<User>().ge("age", 18);
Page<User> result = userMapper.selectPage(page, wrapper);

// 获取分页数据
List<User> records = result.getRecords(); // 当前页数据
long total = result.getTotal(); // 总记录数

4.3 复杂查询 + 分页

结合条件构造器与分页:

public Page<User> searchPage(String keyword, Integer pageNum, Integer pageSize) {
    Page<User> page = new Page<>(pageNum, pageSize);
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("username", keyword)
           .orderByAsc("age");
    return userMapper.selectPage(page, wrapper);
}

5. 完整示例代码

// Controller 示例
@GetMapping("/users")
public R<Page<User>> getUsers(
    @RequestParam(required = false) String keyword,
    @RequestParam(defaultValue = "1") Integer pageNum,
    @RequestParam(defaultValue = "10") Integer pageSize
) {
    Page<User> page = userService.searchUserPage(keyword, pageNum, pageSize);
    return R.ok(page);
}

// Service 实现
@Override
public Page<User> searchUserPage(String keyword, Integer pageNum, Integer pageSize) {
    Page<User> page = new Page<>(pageNum, pageSize);
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(keyword)) {
        wrapper.like("username", keyword)
               .or()
               .like("email", keyword);
    }
    wrapper.orderByDesc("create_time");
    return userMapper.selectPage(page, wrapper);
}

6. 常见问题与注意事项

  1. 分页失效:确保已正确配置分页插件。
  2. 性能优化:复杂查询建议添加索引,避免全表扫描。
  3. 逻辑删除:若启用逻辑删除(@TableLogic),默认会自动附加删除条件。
  4. 参数安全:避免直接将用户输入拼接为 SQL 片段,使用条件构造器防注入。
  5. 自定义 SQL 分页:在 XML 中编写 SQL 时,返回值类型需为 IPage<T>,且无需手动统计总数。

通过本教程,您可快速掌握 MyBatis-Plus 中复杂查询与分页的核心用法。如需更高级功能(如多租户、乐观锁等),可参考官方文档进一步学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘵奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值