SpringBoot整合Mybatis-Plus实现高效分页查询完整指南

我们先从技术选型开始。在SpringBoot项目中整合Mybatis-Plus进行分页查询,需要准备以下环境:

  1. JDK 1.8+
  2. SpringBoot 2.3+
  3. Mybatis-Plus 3.4+
  4. MySQL 5.7+

推荐使用IDEA开发工具和Maven构建工具,下面是具体的实现步骤:


一、项目搭建与配置

1. 创建SpringBoot项目

使用Spring Initializr创建项目时选择:

  • Web -> Spring Web
  • SQL -> MySQL Driver
  • MyBatis Framework

在pom.xml中添加Mybatis-Plus依赖:

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

2. 数据库配置

application.yml配置示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志

3. 配置分页插件

创建配置类:

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

二、基础代码实现

1. 实体类创建

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

2. Mapper接口

public interface UserMapper extends BaseMapper<User> {
    // 自定义SQL分页查询示例
    @Select("SELECT * FROM user WHERE age > #{age}")
    Page<User> selectByAgePage(@Param("age") Integer age, Page<User> page);
}

3. Service层实现

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    public Page<User> getPageList(Integer pageNum, Integer pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return baseMapper.selectPage(page, null);
    }
}

三、分页查询实战

1. 基本分页查询

Controller示例:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/page")
    public R<Page<User>> getPage(@RequestParam(defaultValue = "1") Integer pageNum,
                                 @RequestParam(defaultValue = "10") Integer pageSize) {
        return R.success(userService.getPageList(pageNum, pageSize));
    }
}

2. 带条件分页查询

使用QueryWrapper构建条件:

public Page<User> queryByCondition(PageQuery query) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like(StringUtils.isNotBlank(query.getName()), "name", query.getName())
           .ge(query.getMinAge() != null, "age", query.getMinAge())
           .le(query.getMaxAge() != null, "age", query.getMaxAge());
    
    return baseMapper.selectPage(new Page<>(query.getPageNum(), query.getPageSize()), wrapper);
}

四、接口测试与验证

1. Postman测试

请求示例:

GET http://localhost:8080/user/page?pageNum=2&pageSize=5

响应结果示例:

{
  "code": 200,
  "msg": "success",
  "data": {
    "records": [
      {
        "id": 6,
        "name": "Jack",
        "age": 25,
        "email": "jack@example.com"
      },
      // ...其他记录
    ],
    "total": 20,
    "size": 5,
    "current": 2,
    "pages": 4
  }
}

2. 分页参数说明

  • current:当前页码
  • size:每页显示条数
  • total:总记录数
  • pages:总页数
  • records:当前页数据列表

五、扩展功能实现

1. 分页结果优化

自定义返回结构:

public class PageResult<T> {
    private Long current;
    private Long size;
    private Long total;
    private Long pages;
    private List<T> records;
    
    public static <T> PageResult<T> success(Page<T> page) {
        PageResult<T> result = new PageResult<>();
        result.setCurrent(page.getCurrent());
        result.setSize(page.getSize());
        result.setTotal(page.getTotal());
        result.setPages(page.getPages());
        result.setRecords(page.getRecords());
        return result;
    }
}

2. 全局分页配置

统一分页参数接收:

public class PageQuery {
    @Min(1)
    private Integer pageNum = 1;
    
    @Min(1)
    @Max(100)
    private Integer pageSize = 10;
    
    // 转换Mybatis-Plus的Page对象
    public <T> Page<T> toPage() {
        return new Page<>(pageNum, pageSize);
    }
}

六、常见问题排查

  1. 分页失效问题

    • 检查是否配置分页插件
    • 确认Mapper方法的参数中包含Page对象
    • 查看生成的SQL是否包含LIMIT
  2. 总条数不准确

    • 检查是否使用正确的selectPage方法
    • 确认没有自定义count语句导致冲突
  3. 性能优化建议

    // 关闭count查询(当确定不需要总条数时)
    Page<User> page = new Page<>(pageNum, pageSize).setSearchCount(false);
    

正文到此结束
评论插件初始化中...
Loading...