springboot使用pagehelper进行分页
分页在日常工作中超级常用,使用limit n,i 分页较为麻烦,使用现成的框架pagehelper就很方便了.
首页:https://pagehelper.github.io/
pom依赖
一些mybatis和mysql的就不写了
<!--pagehelp分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.7</version>
</dependency>
主要的controller
注释写的比较详细,请看代码
@RestController
@Slf4j
public class UserController {
@Autowired
private UserDao userDao;
@GetMapping("/get/{n}/{i}")
public PageInfo<User> get(@PathVariable("n")Integer pageNo, @PathVariable("i")Integer pageSize) {
//使用restful风格的方式接受参数.
log.info("当前页码pageNo==="+pageNo+"````显示条数pageSize===="+pageSize);
//将参数封装到Pagehelper,注意:当前设置只对下一个SQL语句生效,并且在mapper.xml中的SQL语句不要写分号.
PageHelper.startPage(pageNo, pageSize);
List<User> userList = userDao.getAllUser();
//将返回的list封装成一个PageInfo<T>
PageInfo<User> pageInfo = new PageInfo<>(userList);
return pageInfo;
}
}
dao层
和正常使用mybatis没有任何区别
public interface UserDao {
List<User> getAllUser();
}
这里注意SQL语句不要写分号,会添加limit.
<mapper namespace="com.jd.dao.UserDao">
<select id="getAllUser" resultType="com.jd.domain.User">
select * from t_user
</select>
</mapper>
配置信息
##数据库url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dev?serverTimezone=GMT%2B8
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=112233
##数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
## 日志级别
logging.level.com.jd.dao.UserDao=debug
## 分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
还有一种使用方法比较简洁
请看注释
这是controller层.
@RestController
public class UserController {
@Resource
private UserDao userDao;
@GetMapping("/get/{n}/{i}")
public PageInfo<User> get(@PathVariable("n")Integer pageNo, @PathVariable("i")Integer pageSize) {
//将参数封装到Pagehelper,注意:当前设置只对下一个SQL语句生效,并且在mapper.xml中的SQL语句不要写分号.
//Page<Object> objects = PageHelper.startPage(pageNo, pageSize);
//也可以显示的传递分页信息,但是在dao层中就只能使用pageNum和pageSize这两个固定的参数名
Page<User> userList = userDao.getAllUser(pageNo,pageSize);
System.out.println("1111"+userList.toString());
//将返回的list封装成一个PageInfo<T>
PageInfo<User> pageInfo = new PageInfo<>(userList);
//这个SQL就不会分页.
//Page<User> userList2 = userDao.getAllUser();
//System.out.println("22222"+userList2);
return pageInfo;
}
}
这是dao层
public interface UserDao {
//只能使用固定的参数名,才能识别
Page<User> getAllUser(int pageNum,int pageSize);
}
测试
返回的信息中包含信息:
在pageInfo中的信息:
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;