SpringBoot整合Mybatis-Plus实现高效分页查询完整指南
- 发布时间:2025-02-19 19:47:47
- 本文热度:浏览 43 赞 0 评论 0
- 文章标签: SpringBoot Mybatis-Plus 分页查询
- 全文共1字,阅读约需1分钟
我们先从技术选型开始。在SpringBoot项目中整合Mybatis-Plus进行分页查询,需要准备以下环境:
- JDK 1.8+
- SpringBoot 2.3+
- Mybatis-Plus 3.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);
}
}
六、常见问题排查
-
分页失效问题
- 检查是否配置分页插件
- 确认Mapper方法的参数中包含Page对象
- 查看生成的SQL是否包含LIMIT
-
总条数不准确
- 检查是否使用正确的selectPage方法
- 确认没有自定义count语句导致冲突
-
性能优化建议
// 关闭count查询(当确定不需要总条数时) Page<User> page = new Page<>(pageNum, pageSize).setSearchCount(false);
正文到此结束
相关文章
热门推荐
评论插件初始化中...