zoukankan      html  css  js  c++  java
  • MyBatis-Plus分页插件——PageHelper和IPage原理介绍



    两个都用于分页,常用的应该是PageHelper了,理解了一下源码后发现IPage比PageHelper好用。
    使用方法是 PageHelper.startPage()然后后边写sql就可以。 紧接着的一个sql起作用。
    IPage则需要在dao层传入IPage的实现类Page对象,该对象实现了IPage。
    区别:
    PageHelper内部原理是将传入的页码和条数赋值给了Page对象,保存到了一个本地线程ThreadLoacl中,
    然后会进入Mybatis的拦截器中。
    然后再拦截器中获取本地线程中保存的分页的参数。最后再将这些分页
    参数和原本的sql以及内部定义好的sql进行拼接完成sql的分页处理。
    中间会进行判断该sql 的类型是查询
    还是修改操作。如果是查询才会进入分页的逻辑并判断封装好的Page对象是否是null
    null则不分页,否则分页。


    IPage内部原理也是基于拦截器,但是这个拦截的是方法以及方法中的参数,这个也会判断是否是查询操作。
    如果是查询操作,才会进入分页的处理逻辑。
    进入分页逻辑处理后,拦截器会通过反射获取该方法的参数
    进行判断是否存在IPage对象的实现类。如果不存在则不进行分页,存在则将该参数赋值给IPage对象。

    然后进行拼接sql的处理完成分页操作。
    但是使用IPage需要注入一个bean拦截器交给spring进行管理。如下。否则不会进行拦截。
    @Bean
    public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
    }
    pom: springboot使用的是2.1.0
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.version}</version><!-- 3.2.0 -->
    <exclusions>
    <exclusion>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    </exclusion>
    </exclusions>
    </dependency>

    IPage的好处:
    适用于多方言的数据库类型;例如 MySQL、Oracle、SqlServer等。

    注意:如果两个一起用,内部会先执行IPage的拦截器并进行分页 然后会进入的PageHelper的分页处理。
    优先使用的是IPage并且PageHelper会出现问题(不论谁前谁后)。返回Page是没问题的,
    但是如果返回集合的结果集使用PageInfo进行分页就会出现问题。PageHelper只会有指定条数的数据。
    所以只能使用一个,如果两个一起使用,则使用IPage返回Page接收。不可已使用PageInfo进行接收数据。
    (当然这个的前提也是对同一个sql进行分页操作并返回的集合结果集)
  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/rrong/p/13629550.html
Copyright © 2011-2022 走看看