在开发个人博客的过程中,使用到了PageHelper
插件来实现查询的分页功能,遇到了不少坑,这里做一个汇总。
使用的PageHelper版本:
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
实现简单的分页查询
使用PageHelper
的好处就是实现简单的分页查询非常方便,我们无需修改底层的SQL语句(使用Mybatis需要写SQL,诸如LIMIT
, OFFSET
的语句)并且传到前端也可以直接使用,使用方法如下:
1. db
比如现在我们有一个关于博客的分类表(Type),有type_id
和type_name
两个属性。
type_id | type_name |
---|---|
1 | Java |
2 | Python |
3 | C++ |
2. TypeMapper.xml
使用Mybatis查询所有Type的list的sql如下。使用PageHelper好处就是无需在底层入侵代码,这里的代码可以不作任何修改:
<select id="queryTypeList" resultType="Type">
select * from blog.blog_type
</select>
3. TypeServiceImpl
@Override
public PageInfo<Type> queryTypeByPage(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<Type> list = typeMapper.queryTypeList();
return new PageInfo<>(list);
}
注意点:调用PageHelper.startPage(pageNum, pageSize)
后必须紧跟着调用typeMapper.queryTypeList()
,否则可能会出错(在并发的情况下),具体原因后面总结。
4. TypeController
@GetMapping
public String types(@RequestParam(value="pageNo",defaultValue="1")int pageNo,
@RequestParam(value="pageSize",defaultValue="5")int pageSize,
Model model) {
PageInfo<Type> pageInfo = typeService.queryTypeByPage(pageNo, pageSize);
model.addAttribute("pageInfo", pageInfo);
return "admin/blog_type";
}
控制层在调用业务层的分页查询后直接将返回的PageInfo<>
返回给前端,前端是可以直接使用的。
5. 前端展示
这里用的是Thymleaf作模板引擎
<table class="ui celled table