pageHelper配置:
SpringBoot 通常是支持 PageHelper 分页插件的。但是,在 SpringBoot 3.* 系列的版本中,引入第三方 jar 包后,要想使用功能还必须加配置才行(开启分页插件生效的配置),分页插件不会自动生效。而在 SpringBoot 2.* 系列版本中,引入 PageHelper 插件后可以自动生效
首先在pom中添加pageHelper依赖:
<!-- pageHelper插件依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.3</version>
</dependency>
这里使用的是Springboot3.2.4,只能配置pageHelper依赖。
spring2.x可以配置 pagehelper-spring-boot-starter 依赖,如果仍然无法正常运行的话,可以切换版本号尝试一下。
或者可能需要在 application.properties 或 application.yml 文件中添加一些配置,例如:
#pagehelper分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
这些配置需要根据实际情况进行调整。
springboot 3.2.4除了需要在pom文件中创建pagehelper依赖之外,还需要手动配置一个拦截器:
放在java目录下:
package edu.wust.pageHelperUtil;
import com.github.pagehelper.PageInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class PageHelperConfig {
@Bean
public PageInterceptor pageHelper() {
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum","true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
properties.setProperty("helperDialect", "mysql");
properties.setProperty("supportMethodsArguments","true");
properties.setProperty("params","count=countSql");
pageInterceptor.setProperties(properties);
return pageInterceptor;
}
}
此外还需要注意代码中正确使用了
PageHelper.startPage(page,pageSize);
这一句代码,必须放在需要分页的查询语句之前,否则会分页不生效。
错误情况:
正常情况:
相关链接:
https://github.com/pagehelper/Mybatis-PageHelper/issues/748
https://zhuanlan.zhihu.com/p/453238791
Maven Repository: com.github.pagehelper » pagehelper (mvnrepository.com)
分页查询:
1.常规分页:
分页查询封装类:
package edu.wust.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
//分页查询封装类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageBean {
private Long total;
private List rows; //结果列表
}
cotroller类:
package edu.wust.controller;
import edu.wust.pojo.PageBean;
import edu.wust.pojo.Result;
import edu.wust.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
/*
员工管理Controller
*/
@RestController
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize){
// if(page==null) page=1;
// if(pageSize==null) pageSize=10;
log.info("分页查询,参数:{},{}",page,pageSize);
//调用service进行分页查询
PageBean pageBean=empService.page(page,pageSize);
return Result.success(pageBean);
}
}
这里的@RequestParam注解替代了后面的默认值
service接口:
package edu.wust.service;
import edu.wust.pojo.PageBean;
import org.springframework.stereotype.Service;
/**
* 员工管理
*/
@Service
public interface EmpService {
PageBean page(Integer page, Integer pageSize);
}
service实现类:
package edu.wust.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import edu.wust.mapper.EmpMapper;
import edu.wust.pojo.Emp;
import edu.wust.pojo.PageBean;
import edu.wust.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
//获取总记录数
Long count = empMapper.count();
//获取分页查询的结果列表
Integer start=(page-1)*pageSize;
List<Emp> empList = empMapper.page(start, pageSize);
//封装pageBean对象
PageBean pageBean=new PageBean(count,empList);
return pageBean;
}
}
Mapper数据操作接口:
package edu.wust.mapper;
import edu.wust.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 员工管理
*/
@Mapper
public interface EmpMapper {
//查询总记录数
@Select("select count(*) from emp")
public Long count();
//分页
@Select("select * from emp limit #{start},#{pageSize}")
public List<Emp> page(Integer start,Integer pageSize);
}
为提高代码复用性,使用pageHelper插件进行分页:
2.插件分页:
配置完成之后,只需要修改service层的page方法:
@Override
public PageBean page(Integer page, Integer pageSize) {
PageHelper.startPage(page,pageSize);
List<Emp> empList = empMapper.list();
Page<Emp> p=(Page<Emp>)empList;
//封装pageBean对象
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
}
以及Mapper接口的数据层方法:
@Select("select * from emp")
public List<Emp> list();