精心整理了最新的面试资料和简历模板,有需要的可以自行获取
MyBatis-Plus 复杂查询与分页教程
目录
- 环境准备
- 基础回顾
- 复杂查询实现
- 条件构造器
QueryWrapper
- 动态条件拼接
- 多表关联查询(非Join方案)
- 条件构造器
- 分页功能
- 分页插件配置
- 分页查询基本用法
- 分页与复杂查询结合
- 完整示例代码
- 常见问题与注意事项
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,但可通过以下方式实现:
- 自定义 SQL 片段:在 XML 中编写 SQL,使用
@Select
注解或 XML 映射。 - 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. 常见问题与注意事项
- 分页失效:确保已正确配置分页插件。
- 性能优化:复杂查询建议添加索引,避免全表扫描。
- 逻辑删除:若启用逻辑删除(
@TableLogic
),默认会自动附加删除条件。 - 参数安全:避免直接将用户输入拼接为 SQL 片段,使用条件构造器防注入。
- 自定义 SQL 分页:在 XML 中编写 SQL 时,返回值类型需为
IPage<T>
,且无需手动统计总数。
通过本教程,您可快速掌握 MyBatis-Plus 中复杂查询与分页的核心用法。如需更高级功能(如多租户、乐观锁等),可参考官方文档进一步学习。