在给 Spring Cloud 项目添加分页插件的时候,出现了分页插件失效的情况。
依赖如下
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency> </dependencies> package com.course.server.service; import com.course.server.domain.Chapter; import com.course.server.domain.ChapterExample; import com.course.server.dto.ChapterDto; import com.course.server.dto.PageDto; import com.course.server.mapper.ChapterMapper; import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInterceptor; import org.apache.ibatis.plugin.Interceptor; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import com.github.pagehelper.PageHelper; @Service public class ChapterService { @Resource private ChapterMapper chapterMapper; public void list(PageDto pageDto){ PageHelper pageHelper = new PageHelper(); pageHelper.startPage(pageDto.getPage(),pageDto.getSize()); ChapterExample chapterExample = new ChapterExample(); List<Chapter> chapterList = chapterMapper.selectByExample(chapterExample); PageInfo<Chapter> pageInfo = new PageInfo<>(chapterList); pageDto.setTotal(pageInfo.getTotal()); List<ChapterDto> chapterDtosList = new ArrayList<>(); for (int i = 0; i < chapterList.size(); i++) { Chapter chapter = chapterList.get(i); ChapterDto chapterDto = new ChapterDto(); BeanUtils.copyProperties(chapter,chapterDto); chapterDtosList.add(chapterDto); } pageDto.setList(chapterDtosList); } }打印了查询语句后发现根本没有加上 limit 限定词 开始看了 pagehelper 的一些例子,查询会分成两次,第一次先查询出总和,第二次才是真正的分页。以为 pagehelper 实例化出了问题,但是,debug 时发现运行时进了 Pagehelper 的 startPage,并不是 pagehelper 没有运行的缘故。
最初查询了网上的许多博客,但是网上一般都是关于 com.github.pagehelper 中的 pagehelper 插件的。其他一些博客找到的也都没有用,后面查询了一些关于 mybatis 插件的文章,发现在后面增加一个 mybatis 的拦截器就可以了。
@Bean public Interceptor[] plugins() { return new Interceptor[]{new PageInterceptor()}; }完整代码如下:
package com.course.server.service; import com.course.server.domain.Chapter; import com.course.server.domain.ChapterExample; import com.course.server.dto.ChapterDto; import com.course.server.dto.PageDto; import com.course.server.mapper.ChapterMapper; import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInterceptor; import org.apache.ibatis.plugin.Interceptor; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import com.github.pagehelper.PageHelper; @Service public class ChapterService { @Resource private ChapterMapper chapterMapper; public void list(PageDto pageDto){ PageHelper pageHelper = new PageHelper(); pageHelper.startPage(pageDto.getPage(),pageDto.getSize()); ChapterExample chapterExample = new ChapterExample(); List<Chapter> chapterList = chapterMapper.selectByExample(chapterExample); PageInfo<Chapter> pageInfo = new PageInfo<>(chapterList); pageDto.setTotal(pageInfo.getTotal()); List<ChapterDto> chapterDtosList = new ArrayList<>(); for (int i = 0; i < chapterList.size(); i++) { Chapter chapter = chapterList.get(i); ChapterDto chapterDto = new ChapterDto(); BeanUtils.copyProperties(chapter,chapterDto); chapterDtosList.add(chapterDto); } pageDto.setList(chapterDtosList); } @Bean public Interceptor[] plugins() { return new Interceptor[]{new PageInterceptor()}; } }最后 pagehelper 成功生效。