美文网首页
pageHelper_笔记

pageHelper_笔记

作者: bboymonk | 来源:发表于2017-03-10 11:29 被阅读0次
    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(Object params)方法 -->
            <!-- 增加了一个`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使用完整的类路径。

    其他五个参数说明:

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

    如何选择配置这些参数

    单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。
    首先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
        public PageHelper 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"})
        public String getNews(Integer pageNum, Integer size, String orderBy, String title,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 extends BaseService<News,Long> {
        PageInfo<News> listAll(Map<String,Object> map);
    
    }
    

    service实现类

    @Service
    public class NewsServiceImpl extends BaseServiceImpl<News,Long> implements NewsService {
        @Autowired
        private NewsMapper newsMapper;
    
        @Override
        public BaseMapper getMapper() {
            return newsMapper;
        }
    
        @Transactional
        @Override
        public PageInfo<News> listAll(Map<String, Object> map) {
            List<News> newsList =  newsMapper.listAll(map);
            return new PageInfo<News>(newsList);
        }
    }
    

    mapper接口

    public interface NewsMapper extends BaseMapper<News,Long> {
        List<News> listAll(Map<String,Object> map);
    
    }
    

    简单的理解:

    1,先设置pageHelper
    @Bean
    public PageHelper 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;
    }
    2,
    PageHelper.startPage(pageNum == null ? 1 : pageNum,size == null ? 10 : size)
    3,
    PageInfo<T> pageInfo = new PageInfo<T>("这里的参数是从数据库查询出来的List");

    OK了

    配置说明:

    !--分页插件-->
        <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(Object params)方法 -->
                <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
                <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
                <!--<property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>-->
            </plugin>
        </plugins>
    

    相关文章

      网友评论

          本文标题:pageHelper_笔记

          本文链接:https://www.haomeiwen.com/subject/yxpngttx.html