spring集成pagehelper
2017-12-19 11:08
127 查看
一基本使用方式:
1.将pagehelper相关jar包加载到项目,或者使用maven:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
2.在mybatis-config.xml文件或spring mybatis配置中进行插件配置,如下:
<!--分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!--指定数据库 -->
<property name="dialect" value="mysql" />
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样 -->
<property name="offsetAsPageNum" value="true" />
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true" />
<!--启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页;禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true" />
</plugin>
</plugins>
3.在代码中使用:
Page<User> page = PageHelper.startPage(3, 3);//传入参数分别为:pageNumber, pageSize
page.setOrderBy("user.PHONE_NUMBER DESC");//可设置排序方式,更多设置详见api
page.doSelectPage(() -> userService.getUsers());//JDK8的写法,其实就是做查询操作
PageInfo<User> p = new PageInfo<>(page);//根据page对象创建一个PageInfo,此时查询的分页结果已经在 PageInfo
List<User> userInfos = p.getList();//获取分页数据
二常见问题:
1.分页不生效:检查配置,如:数据库方言是否设置正确,是否将配置文件集成到spring配置中
2.分页生效:有时候在其它没有使用分页查询的方法中使用了分页查询
问题2原因剖析:
PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。 只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。 如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。 但是如果你写出下面这样的代码,就是不安全的用法: PageHelper.startPage(1, 10); List<Country> list; if(param1 != null){ list = countryMapper.selectIf(param1); } else { list = new ArrayList<Country>(); } 这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。 上面这个代码,应该写成下面这个样子: List<Country> list; if(param1 != null){ PageHelper.startPage(1, 10); list = countryMapper.selectIf(param1); } else { list = new ArrayList<Country>(); } 这种写法就能保证安全。 如果你对此不放心,你可以手动清理 ThreadLocal 存储的分页参数,可以像下面这样使用: List<Country> list; if(param1 != null){ PageHelper.startPage(1, 10); try{ list = countryMapper.selectAll(); } finally { PageHelper.clearPage(); } } else { list = new ArrayList<Country>(); } 这么写很不好看,而且没有必要。
PageHelper.clearPage();
注:PageHelper.clearPage();方法不是所有版本都有,当pagehelper没有该方法时,可直接使用SqlUtil.clearLocalPage();
相关文章推荐
- spring boot集成开源分页插件pagehelper
- spring boot集成pagehelper,两种方式
- springboot如何集成mybatis的pagehelper分页插件
- spring-boot 集成mybatis的分页插件PageHelper和Generator (番外)
- Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper
- PageHelper集成SpringBoot
- Spring集成PageHelper的简单用法
- Spring Boot : 集成mybatis、pagehelper插件、开启事务、druid数据源配置、mybatis-generator(十一)
- spring-boot 集成mybatis的分页插件PageHelper和Generator
- SpringBoot集成MyBatis、PageHelper和通用Mapper
- spring-boot 集成mybatis的分页插件PageHelper和Generator (番外)
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- SpringBoot中集成mybatis和PageHelper
- Spring集成PageHelper的简单用法
- spring boot集成pagehelper的坑
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- SpringBoot集成Mybatis并具有分页功能PageHelper
- Spring集成PageHelper的简单用法示例
- [置顶] MyBatis基于Spring-boot集成通用Mapper以及pagehelper分页插件(含源码下载)
- SpringBoot集成分页插件PageHelper