springboot + mybatisplus 写一个分页功能
时间: 2025-06-07 12:07:24 浏览: 23
<think>好的,用户想了解如何在Spring Boot和MyBatis-Plus中实现分页功能。我需要分步骤解释清楚,确保他们能理解整个过程。首先,我应该确认他们是否已经熟悉基本的Spring Boot和MyBatis-Plus的集成,或者是否需要先进行一些环境配置的说明。不过用户直接问的是分页功能,可能已经有基础了。
接下来,我应该想到MyBatis-Plus内置了分页插件,所以需要先配置这个插件。需要说明在配置类中添加@Bean来注册分页拦截器。这部分很重要,否则分页功能无法生效。
然后是实体类和Mapper接口的创建。需要提醒用户他们的实体类应该对应数据库表,并且Mapper要继承BaseMapper,这样可以直接使用MyBatis-Plus提供的方法。
接下来是Service层的实现,这里可能需要创建Page对象,设置当前页和每页大小,然后调用selectPage方法。这一步需要详细说明Page对象的参数,以及如何从Page对象中获取分页后的数据列表和总记录数。
Controller层需要处理请求参数,比如当前页码和每页数量,通常通过@RequestParam接收,并调用Service的方法返回结果。这里可能需要提到如何将结果封装成统一的响应格式,比如使用Result类。
最后,测试部分要提醒用户通过Postman或者浏览器访问对应的URL,传入正确的参数来验证分页是否生效。可能还需要提到分页查询的条件构造,比如使用QueryWrapper来添加查询条件,这样用户可以实现带条件的分页查询。
需要检查是否有遗漏的步骤,比如依赖的添加,用户是否可能忘记引入MyBatis-Plus的starter。不过可能用户已经知道,但为了保险起见,可以在步骤中提一下需要添加相关依赖,比如mybatis-plus-boot-starter。
另外,分页插件的版本问题是否需要说明?如果用户用的是较旧的版本,配置方式可能不同,但考虑到现在主流的是3.x版本,应该按照最新的方式来写,使用PaginationInnerInterceptor。
可能还需要提醒用户关于分页参数的正确处理,比如防止传入负数或者过大的页码,但也许这属于业务逻辑的增强部分,基础教程中可以先不涉及。
总结下来,回答的结构应该是:配置分页插件 → 创建实体和Mapper → 编写Service → 编写Controller → 测试。每个步骤给出代码示例,并解释关键点,比如Page对象的创建,分页方法的使用,结果的处理等。确保用户按照步骤操作后能成功实现分页功能。</think>以下为使用SpringBoot + MyBatis-Plus实现分页功能的完整步骤:
### 一、添加分页插件配置
在SpringBoot配置类中添加(通常在`MybatisPlusConfig.java`中):
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
```
### 二、创建实体类
```java
@Data
@TableName("user") // 对应数据库表名
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
```
### 三、创建Mapper接口
```java
public interface UserMapper extends BaseMapper<User> {
// 继承BaseMapper即拥有基础CRUD方法
}
```
### 四、Service层实现
```java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
public Page<User> getPage(Integer current, Integer size) {
// 创建分页对象(当前页码,每页数量)
Page<User> page = new Page<>(current, size);
// 执行分页查询(返回结果会封装到page对象中)
return baseMapper.selectPage(page, null);
}
}
```
### 五、Controller层
```java
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/page")
public Result getByPage(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
Page<User> page = userService.getPage(current, size);
return Result.success()
.data("list", page.getRecords()) // 当前页数据列表
.data("total", page.getTotal()); // 总记录数
}
}
```
### 六、测试验证
访问接口(示例):
```
GET http://localhost:8080/user/page?current=2&size=5
```
响应结果示例:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
// 第2页的5条数据...
],
"total": 35
}
}
```
### 补充说明:
1. **条件分页查询**:可以使用`QueryWrapper`添加查询条件
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "张");
baseMapper.selectPage(page, wrapper);
```
2. **自定义分页SQL**:对于复杂查询,可在Mapper.xml中自定义SQL:
```xml
<select id="selectUserPage" resultType="User">
SELECT * FROM user WHERE age > #{age}
</select>
```
接口方法:
```java
IPage<User> selectUserPage(Page<User> page, @Param("age") Integer age);
```
3. **前端分页参数**:建议对`current`和`size`进行校验(最小值限制)
阅读全文
相关推荐

















