引入依赖
注意需要和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注意线程安全;