引入依赖
注意需要和SpringBoot的版本对应,否则分页可能不生效
 
使用的分页依赖:
        <!-- pagehelper 插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.5</version>
        </dependency>
分页代码
import com.github.pagehelper.PageHelper;
import com.zhondu.wiki.bean.Ebook;
import com.zhondu.wiki.bean.EbookExample;
import com.zhondu.wiki.mapper.EbookMapper;
import com.zhondu.wiki.req.EbookReq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Author: zhondu
 * @Date: 2022/12/10 16:28
 * @Desc:
 */
@Service
public class EbookService {
    public static final Logger logger = LoggerFactory.getLogger(EbookService.class);
    @Resource
    private EbookMapper ebookMapper;
    /**
     * 查询数据,分页处理,
     * @param ebookReq
     * @return
     */
    public List<Ebook> list(EbookReq ebookReq) {
        EbookExample ebookExample = new EbookExample();
        EbookExample.Criteria criteria = ebookExample.createCriteria();
        if(!ObjectUtils.isEmpty(ebookReq.getName())) {
            criteria.andNameLike("%"+ebookReq.getName()+"%");
        }
        // 分页
        PageHelper.startPage(1,3);
        List<Ebook> list = ebookMapper.selectByExample(ebookExample);
        return list;
    }
}
执行结果,
 
要想打印出SQL,配置文件(例如application.properties)在对应的路径上加配置就好了:
# 打印所有的SQL日志(就是把这个路径下的日志修改为最低级别),SQL 参数 结果
logging.level.com.zhondu.wiki.mapper=trace
分析
PageHelper是MyBatis的一个插件,内部实现了一个PageInterceptor拦截器。Mybatis会加载这个拦截器到拦截器链中。在我们使用过程中先使用PageHelper.startPage这样的语句在当前线程上下文中设置一个ThreadLocal变量,再利用PageInterceptor这个分页拦截器拦截,从ThreadLocal中拿到分页的信息,如果有分页信息拼装分页SQL(limit语句等)进行分页查询,最后再把ThreadLocal中的东西清除掉;
分页插件会先查一次总数,然后,根据传入的分页信息,从线程中取数据拼接到SQL语句后面,有两次SQL查询;
更近一步
前面说过,PageHelper有两次SQL的执行,第一次是查总数的,第二次是查询当前的信息的,那可以拿出其查的总数信息来看看;
添加如下代码:
 
其执行结果如下:
 
注意事项
- 分页查询语句放在你要查询的方法前一行,PageHelper.startPage(1,3);之后紧跟查询;
- ThreadLocal注意线程安全;



















