mybatis分页插件PageHelper的使用

时间:2021-12-11 05:10:55

三碗才能饱

pageHelper的用法(基于mybatis,maven)

pom.xml里先添加依赖

<dependency>

       <groupId>com.github.pagehelper</groupId>

       <artifactId>pagehelper</artifactId>

       <version>4.1.6</version>

</dependency>

在Mybatis配置xml中配置拦截器插件:

<!--

   plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:

   properties?, settings?,

   typeAliases?, typeHandlers?,

   objectFactory?,objectWrapperFactory?,

   plugins?,

   environments?, databaseIdProvider?, mappers?

-->

<plugins>

   <!-- com.github.pagehelper为PageHelper类所在包名 -->

   <plugin interceptor="com.github.pagehelper.PageHelper">

       <property name="dialect" value="mysql"/>

       <!-- 该参数默认为false -->

       <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->

       <!-- 和startPage中的pageNum效果一样-->

       <property name="offsetAsPageNum"value="true"/>

       <!-- 该参数默认为false -->

       <!-- 设置为true时,使用RowBounds分页会进行count查询 -->

       <property name="rowBoundsWithCount"value="true"/>

       <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->

       <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->

       <property name="pageSizeZero" value="true"/>

       <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->

       <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->

       <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->

       <property name="reasonable" value="true"/>

       <!-- 3.5.0版本可用 - 为了支持startPage(Objectparams)方法 -->

       <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->

       <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->

       <property name="params"value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>

   </plugin>

</plugins>

这里的com.github.pagehelper.PageHelper使用完整的类路径。

其他五个参数说明:

  1. 增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,sqlserver,没有默认值,必须指定该属性
  2. 增加offsetAsPageNum属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页时,会将offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。
  3. 增加rowBoundsWithCount属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页会进行count查询。
  4. 增加pageSizeZero属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。
  5. 增加reasonable属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。具体作用请看上面配置文件中的注释内容。
  6. 为了支持startPage(Object params)方法,增加了一个params参数来配置参数映射,用于从Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值。

3. 如何选择配置这些参数

单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。

首先dialect属性是必须的,不需要解释。其他的参数一般情况下我们都不必去管,如果想了解何时使用合适,你可以参考以下场景:

场景一

如果你仍然在用类似ibatis式的命名空间调用方式,你也许会用到rowBoundsWithCount,分页插件对RowBounds支持和Mybatis默认的方式是一致,默认情况下不会进行count查询,如果你想在分页查询时进行count查询,以及使用更强大的PageInfo类,你需要设置该参数为true。

场景二

如果你仍然在用类似ibatis式的命名空间调用方式,你觉得RowBounds中的两个参数offset,limit不如pageNum,pageSize容易理解,你可以使用offsetAsPageNum参数,将该参数设置为true后,offset会当成pageNum使用,limit和pageSize含义相同。

场景三

如果觉得某个地方使用分页后,你仍然想通过控制参数查询全部的结果,你可以配置pageSizeZero为true,配置后,如可以通过设置pageSize=0或者RowBounds.limit = 0就会查询出全部的结果。

场景四

如果你分页插件使用于类似分页查看列表式的数据,如新闻列表,软件列表,你希望用户输入的页数不在合法范围(第一页到最后一页之外)时能够正确的响应到正确的结果页面,那么你可以配置reasonable为true,这时如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页。

 

使用spring的属性配置方式

注意:请不用同时使用spring配置方式和mybatis-config.xml配置方式,只需要选择其中一个就行。配置多个分页插件时,会抛出异常提示。

分页插件配置错误:请不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!

使用spring的属性配置方式,可以使用plugins属性像下面这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

 <property name="dataSource" ref="dataSource"/>

 <property name="mapperLocations">

   <array>

     <value>classpath:mapper/*.xml</value>

   </array>

 </property>

 <property name="typeAliasesPackage"value="com.isea533.ssm.model"/>

 <property name="plugins">

   <array>

     <bean class="com.github.pagehelper.PageHelper">

       <property name="properties">

         <value>

           dialect=hsqldb

           reasonable=true

         </value>

       </property>

     </bean>

   </array>

 </property>

</bean>

如何在代码中使用:

//第一种,RowBounds方式的调用

List<Country> list = sqlSession.selectList("x.y.selectIf",null, new RowBounds(1, 10));

 

//第二种,Mapper接口方式的调用,推荐这种使用方式。

PageHelper.startPage(1, 10);

List<Country> list = countryMapper.selectIf(1);

=============================本人现在所在项目的示例代码============================
这个项目是springBoot,mybatis,shiro搭建的,所以mybatis-config.xml配置文件改成这样了。

@Bean

    publicPageHelper pageHelper(){

       logger.info("------pageHelper");

       PageHelper pageHelper = new PageHelper();

       Properties p = new Properties();

       p.setProperty("offsetAsPageNum", "true");

       p.setProperty("rowBoundsWithCount", "true");

       p.setProperty("reasonable", "true");

       pageHelper.setProperties(p);

       return pageHelper;

    }

这个是controller里的代码

@ResponseBody

   @RequestMapping(value = "list.json",method = RequestMethod.GET,produces= {"application/json;charset=UTF-8"})

    publicString getNews(Integer pageNum, Integer size, String orderBy, Stringtitle,String state){

       try {

           PageHelper.startPage(pageNum == null ? 1 : pageNum, size == null ? 5 :size);

           Map<String, Object> map = null;

           PageInfo<News> newsPageInfo = null;

                map = new HashMap<String,Object>();

                map.put("orderBy",orderBy);

                map.put("title",title);

                map.put("state",state);

                newsPageInfo =newsService.listAll(map);

           return SUCCESS_FAIL_N(newsPageInfo.getSize() > 0, newsPageInfo,"30035");

       } catch (Exception e) {

           logger.error("查询失败", e);

           return SUCCESS_FAIL_N(false, null, "30036");

       }

 

service接口

public interface NewsService extendsBaseService<News,Long> {

   PageInfo<News> listAll(Map<String,Object> map);

 

}

service实现类

@Service

public class NewsServiceImpl extendsBaseServiceImpl<News,Long> implements NewsService {

   @Autowired

    privateNewsMapper newsMapper;

 

   @Override

    publicBaseMapper getMapper() {

       return newsMapper;

    }

 

   @Transactional

   @Override

    publicPageInfo<News> listAll(Map<String, Object> map) {

       List<News> newsList = newsMapper.listAll(map);

       return new PageInfo<News>(newsList);

    }

}

mapper接口

public interface NewsMapper extendsBaseMapper<News,Long> {

   List<News> listAll(Map<String,Object> map);

 

}

 

简单的理解:
1,先设置pageHelper

@Bean
public PageHelper pageHelper(){
   logger.info("------pageHelper");
    PageHelper pageHelper = newPageHelper();
    Properties p = new Properties();
   p.setProperty("offsetAsPageNum", "true");
   p.setProperty("rowBoundsWithCount", "true");
    p.setProperty("reasonable","true");
   pageHelper.setProperties(p);
    return pageHelper;
}
2,

PageHelper.startPage(pageNum == null ? 1 :pageNum,size == null ? 10 : size)


3,

PageInfo<T> pageInfo = newPageInfo<T>("这里的参数是从数据库查询出来的List");

OK了