zoukankan      html  css  js  c++  java
  • mybatis + PageHelper 实现分页

    如果你也在使用Mybatis,建议尝试PageHelper插件,这个一定是最方便使用的分页插件。
    该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。
    PageHelper分页插件项目中的正式代码一共有个5个Java文件,这5个文件的说明如下:

           1:  Page<E>[必须]:分页参数类,该类继承ArrayList,虽然分页查询返回的结果实际类型是Page<E>,但是可以完全不出现所有的代码中,可以直接当成List使用。返回值不建议使用Page,建议仍然用List。如果需要用到分页信息,使用下面的PageInfo类对List进行包装即可。

           2:  PageHelper[必须]:分页插件拦截器类,对Mybatis的拦截在这个类中实现。

           3:  PageInfo[可选]:Page<E>的包装类,包含了全面的分页属性信息。

          4: SqlParser[可选]:提供高效的count查询sql。主要是智能替换原sql语句为count(*),去除不带参数的order by语句。需要jsqlparser-0.9.1.jar支持。

           5: SqlUtil[必须]:分页插件工具类,分页插件逻辑类,分页插件的主要实现方法都在这个类中

    使用maven

    添加如下依赖:

    <dependency>
    
        <groupId>com.github.pagehelper</groupId>
    
        <artifactId>pagehelper</artifactId>
    
        <version>3.4.2</version>
    
    </dependency>
    
    <dependency>
    
        <groupId>com.github.jsqlparser</groupId>
    
        <artifactId>jsqlparser</artifactId>
    
        <version>0.9.1</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"/>
    
        </plugin>
    
    </plugins>
    
     

    其他五个参数说明:

      1. 增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性

      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时,需要配置该参数。具体作用请看上面配置文件中的注释内容。

    MyBatis框架

               MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如驱动,创建connection,创建statement,手动设置参数,结果集检索等jdbc繁杂的过程代码

                Mybatis通过xml或注解的方式要执行statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

                这就是mybatis执行情况,那么mybatis的插件作用在哪一环节呢?它主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。

    配置插件:

    现在开始在mybatis的全局配置文件SqlMapConfig.xml中配置插件

    引用配置

    在sql查询语句之前添加一行代码:

            PageHelper.startPage(page, rows); 

                page为显示第几页,rows为一页显示多少条数据。

                                就可以查询分页信息。

    举个栗子:

    PageHelper.startPage(page, rows); 是一个静态的方法,在PageHelper源码:

    欢迎关注公众号

  • 相关阅读:
    linux 通配符
    linux 常用快捷键
    datatables-2
    datables
    datatables
    http://blog.csdn.net/heqingsong1/article/details/8540665
    软件提升知识点
    深入浅出单实例Singleton设计模式
    详解js跨域问题
    自定义控件之绘图篇(四):canvas变换与操作
  • 原文地址:https://www.cnblogs.com/zhaixingzhu/p/12569232.html
Copyright © 2011-2022 走看看