目录
- 介绍
- 引入分页插件
- 配置拦截器插件
- 如何在代码中使用
介绍
pafeHelper
是一款与MyBatis一起使用的分页插件
,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表
、多表
分页。
插件的具体使用:如何使用分页插件
引入分页插件
- 如果你是maven(springBoot)项目直接在maven中引入依赖即可
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置拦截器插件
- 这部分另见如何使用分页插件中的内容
- 一般情况下,你不需要做任何配置,直接使用默认配置即可完成分页查询
在Spring Boot中,PageHelper的配置通常是通过application.properties或application.yml文件进行的。以下是一个简单的配置示例:
在application.yml文件中:
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
这里的配置参数含义如下:
- helperDialect:设置数据库方言,这里是MySQL。
- reasonable:是否支持接口参数中的pageNum和pageSize为0,为true时表示支持。
- supportMethodsArguments:是否支持通过Mapper接口参数来传递分页参数,默认值false。
- params:用于从对象中根据属性名取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable等。
如何在代码中使用
- 在pageHelper中能够完成分页查询的调用有很多,这里讲述一种最简单,实用且方便的方式 Mapper接口方式的调用,
推荐这种使用方式
。 - 具体操作是使用
pageHelper.startPage
静态方法调用- 在导入依赖以及完成配置之后
- 首先,在相应的功能模块内(比如server层)调用
pageHelper.startPage(pageNum,pageSize)
pageNum当前页码,pageSize每页查询条目数 - 然后,在pageHelper.startPage()之后调用查询语句,
一定要在其后调用查询语句,只有这样才能保证分页查询的
安全性 - 最后,可以使用PageInfo来处理分页查询的内容,这一步可以简化
- PageHelper会自动拦截并处理查询语句,在查询语句拼接limit生成相应的分页查询语句
- 还有一点,PageHelper在调用分页查询时,因默认的配置,会自动生成一条查询所有的sql语句,如:
select count(*) from ···
- 代码示例
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
page.getResult(); //获取查询的数据
assertEquals(183, page.getTotal()); //获取所有数据数,该表中所有数据的数量
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());
- 对PageInfo的简化
//开始分页查询,使用mybatis提供的PageHelper插件,向pageQuery调用的sql方法后拼接limit(分页查询)
PageHelper.startPage(pageNum,pageSize);
//调用mapper层方法,向数据库查询
Page<Employee> page = Mapper.pageQuery(Object);
//获取查询的总条目数,调用该方法后,mybatis会自动执行一条查询所有的sql
long total = page.getTotal();
//获取分页查询的结果
List<Employee> records = page.getResult();
-
PageHelper 安全调用
什么时候会导致不安全的分页?
PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的
。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。