SpringBoot - Mybatis自动分页之PageHelper
SpringBoot项目中Mybatis自动分页插件 — PageHelper的使用
一、引入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
二、使用
1.使用方式
1)ServiceImpl层代码
①必须有PageHelper.startPage(),且其必须在Mybatis的mapper查询操作之前。
②PageHelper会为PageHelper.startPage()之后的第一个Mybatis查询进行分页。
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@Override
public PageInfo<User> pageQuery(int pageNumber, int pageSize) {
PageHelper.startPage(pageNumber, pageSize);
List<User> users = userMapper.findAll(UserColumn.NAME); //startPage()后第一个Mybatis查询操作
return new PageInfo<>(users);
}
2)mapper.xml
mapper.xml中为普通的查询语句,不需要”limit”关键字和其他特殊配置。
<select id="findAll" resultType="anchor.mybatis.entity.User">
select * from users order by ${_parameter} asc
</select>
2.格式转换
有时从数据库查出的entity需要做类型转换。
@Override
public PageInfo<UserDTO> pageQuery(int pageNumber, int pageSize) {
PageHelper.startPage(pageNumber, pageSize);
List<User> users = userMapper.findAll(UserColumn.NAME);
PageInfo pageInfo = new PageInfo<>(users); //先用查出的源数据初始化pageInfo,注意不要指定PageInfo<T>中T
List<UserDTO> collect = pageInfo.getList().stream().map(UserDTO::new).collect(Collectors.toList()); //数据格式转换
pageInfo.setList(collect); //用转换后的数据覆盖原有的List
return pageInfo;
}
三、问题
1.关于多个Mybatis查询操作。
①如下代码,PageHelper只对users进行了分页操作,未对details进行分页,因此最终的pageInfo并未实现分页效果。
②PageHelper只对PageHelper.startPage()后第一个Mybatis查询操作进行分页。
PageHelper.startPage(1, 2);
List<User> users = userMapper.findAll(UserColumn.NAME);
List<UserDetail> details = detailMapper.findAll(UserDetailColumn.USER_ID);
PageInfo pageInfo = new PageInfo<>(details);
2.PageHelper最终会帮我们执行count()和limit操作。
3.PageHelper不支持嵌套结果查询。
由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
4.分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。