Java Boot分页案例怎么实现开发

wen java案例 32

Java Boot分页案例实现开发全攻略:从零到精通

目录导读

  1. 分页技术概述与核心原理
  2. Spring Boot分页基础搭建
  3. MyBatis Plus分页插件实战
  4. PageHelper分页案例详解
  5. 前端分页组件集成
  6. 常见问题与性能优化

分页技术概述与核心原理

什么是分页?

分页是将大量数据分割成多个小页面显示的技术,核心目标是减少单次数据加载量,提升用户体验和系统性能,在Java Boot开发中,分页主要分为物理分页和逻辑分页两种。

Java Boot分页案例怎么实现开发

物理分页:通过SQL语句的LIMIT/OFFSET关键字直接操作数据库,只查询当前页所需数据。 逻辑分页:一次性查询所有数据,在内存中通过Java代码截取当前页数据。

开发建议:大型项目请务必使用物理分页,避免内存溢出。

为什么需要分页?

  • 提升页面加载速度(肉眼可见的体验差异)
  • 减轻数据库和服务器的压力
  • 便于数据导航和用户操作
  • 符合搜索引擎对结构化数据的偏好

Spring Boot分页基础搭建

1 环境准备

首先在pom.xml中引入核心依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.12</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

2 实体类与数据库设计

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String email;
    private LocalDateTime createTime;
}

3 原生JDBC分页实现(不推荐生产使用)

public List<User> getUsersByPage(int page, int size) {
    String sql = "SELECT * FROM user LIMIT ? OFFSET ?";
    // 计算偏移量
    int offset = (page - 1) * size;
    // 执行查询并返回结果
}

MyBatis Plus分页插件实战

1 添加依赖

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

2 配置分页插件

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

3 Service层实现

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public IPage<User> getUsersPage(int current, int size) {
        Page<User> page = new Page<>(current, size);
        return this.page(page);
    }
}

4 Controller层接口

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/page")
    public Result<IPage<User>> list(@RequestParam(defaultValue = "1") int page,
                                     @RequestParam(defaultValue = "10") int size) {
        IPage<User> userPage = userService.getUsersPage(page, size);
        return Result.success(userPage);
    }
}

问答环节:MyBatis Plus分页会自动计算总记录数吗? 答:是的,Page对象会自动执行count查询,但建议在数据量极大时关闭自动count,改为手动统计以提高性能。


PageHelper分页案例详解

1 引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>

2 基础使用方式

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    public PageInfo<User> getUsersByPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<User> userList = userMapper.selectAll();
        return new PageInfo<>(userList);
    }
}

3 与MyBatis Plus对比

特性 MyBatis Plus PageHelper
配置复杂度 需配置插件 自动配置
性能开销 更优(可控制count) 略高(自动count)
兼容性 强(与MP深度集成) 通用(适配多种框架)

问答环节:PageHelper的线程安全问题如何处理? 答:PageHelper使用ThreadLocal存储分页参数,务必在查询后立即调用PageHelper.clearPage()清理,或在Service层使用try-finally包裹。


前端分页组件集成

1 基于Vue3 + Element Plus的实现

<template>
  <el-pagination
    v-model:current-page="page"
    :page-size="size"
    :total="total"
    @current-change="handlePageChange"
  />
</template>
<script setup>
const page = ref(1)
const size = ref(10)
const total = ref(0)
const fetchData = async () => {
  const res = await axios.get('/api/users/page', {
    params: { page: page.value, size: size.value }
  })
  total.value = res.data.data.total
}
</script>

2 前端分页参数设计原则

  • 起始页码从1开始(与后端默认值一致)
  • 每页条数建议允许用户自定义(10、20、50、100)
  • 分页组件需包含“前往”按钮和页码跳转功能

常见问题与性能优化

问题1:分页查询结果不准?

原因:数据在分页过程中发生增删改。 解决方案:使用乐观锁或版本号控制,或接受“近似正确”的分页结果。

问题2:深度分页性能差?

问题表现:查询第10000页时变慢。 解决方案

  1. 限制最大翻页数(如只允许前100页)
  2. 使用游标分页(基于ID或时间戳)
  3. 采用“延迟关联”技术

性能优化要点

  • 索引优化:确保ORDER BY和WHERE字段建立联合索引
  • **避免SELECT ***:只查询需要的字段
  • 缓存策略:高频分页数据可缓存到Redis
  • 异步分页:搭配消息队列实现非阻塞分页

问答环节:大表分页应该用哪种方案? 答:推荐使用“覆盖索引+子查询”方案,

SELECT * FROM user 
WHERE id > (SELECT id FROM user ORDER BY id LIMIT 100000, 1)
LIMIT 10;

本文从分页原理出发,详细介绍了Spring Boot中三种主流分页实现方案:原生JDBC、MyBatis Plus分页插件、PageHelper,重点突出了生产环境推荐的MyBatis Plus方案,并提供了前端集成示例和性能优化指南。

核心建议

  1. 中小型项目优先使用MyBatis Plus分页插件
  2. 大型系统评估使用游标分页或覆盖索引方案
  3. 始终配置合理的分页参数校验和异常处理
  4. 前端与后端分页参数保持严格一致

通过本文的案例代码和最佳实践,开发者可以快速在Java Boot项目中实现高效、稳定的分页功能。

抱歉,评论功能暂时关闭!