• MyBatis(7)MyBatis 是如何进行分页


    MyBatis 本身没有内置的分页处理,但它提供了使用分页插件或通过手动编写分页SQL语句的机制来实现分页功能。分页插件如 PageHelper 是常用来与 MyBatis 配合进行分页的工具。

    手动分页

    在不使用分页插件的情况下,可以通过编写特定的分页SQL语句来手动实现分页。以MySQL数据库为例,通常会使用 LIMIT 子句来实现分页。

    SELECT * FROM some_table
    LIMIT #{offset}, #{pageSize}
    

    在 MyBatis 的映射文件中或使用注解方式,你可以这样写:

    <select id="selectPaged" resultType="com.example.MyObject">
      SELECT * FROM some_table
      LIMIT #{offset}, #{pageSize}
    select>
    

    或者使用注解:

    @Select("SELECT * FROM some_table LIMIT #{offset}, #{pageSize}")
    List<MyObject> selectPaged(@Param("offset") int offset, @Param("pageSize") int pageSize);
    

    在执行查询时,你需要计算 offset(偏移量)和 pageSize(每页数量)的值。

    int pageSize = 10;
    int pageNumber = 1;
    int offset = (pageNumber - 1) * pageSize;
    List<MyObject> pagedList = mapper.selectPaged(offset, pageSize);
    
    使用 PageHelper 分页

    PageHelper 是一个第三方的 MyBatis 分页插件。它通过拦截 MyBatis 的查询操作来自动添加分页语句。使用 PageHelper 的基本步骤如下:

    1. 在项目中包含 PageHelper 依赖。

    2. 配置 MyBatis 插件来使用 PageHelper。

    3. 在代码中使用 PageHelper 的静态方法来设置分页参数。

    4. 执行查询。

    在 MyBatis 配置文件中配置 PageHelper:

    <plugins>
      <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        
      plugin>
    plugins>
    

    使用 PageHelper 进行分页:

    // 设置分页参数
    PageHelper.startPage(pageNumber, pageSize);
    // 执行查询
    List<MyObject> pagedList = mapper.selectSome();
    // 获取分页信息
    PageInfo<MyObject> pageInfo = new PageInfo<>(pagedList);
    
    PageHelper 源码分析

    PageHelper 使用了 MyBatis 提供的插件接口(Interceptor)来实现其功能。通过拦截 Executor.query() 方法,PageHelper 在执行查询之前修改 SQL 语句,添加上分页的相关信息。

    public Object intercept(Invocation invocation) throws Throwable {
      // 中间省略部分代码
      MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
      Object parameter = invocation.getArgs()[1];
      RowBounds rowBounds = (RowBounds) invocation.getArgs()[2];
      // 省略部分判断逻辑
      // 获取分页参数
      Page page = PageHelper.getLocalPage();
      // ... 对 SQL 进行处理,添加分页参数
      // 省略具体实现
      // 执行原查询
      Object result = invocation.proceed();
      // 设置分页信息
      page.addAll((List) result);
      // ...
      return result;
    }
    

    PageHelper 会根据方言(如 MySQL、Oracle 等)来生成相应的分页 SQL。在执行查询方法前,PageHelper.startPage() 方法会设置本地线程变量,其中包含分页参数。当查询方法执行时,插件拦截并识别这些参数,然后改写 SQL 语句,最终执行的是已经添加了分页子句的 SQL 语句。

    细节和最佳实践
    1. 在手动编写分页SQL时,应优先选择使用数据库的分页特性,如 MySQL 的 LIMIT

    2. PageHelper 是一个非侵入式的分页插件,可以很容易地集成到现有的 MyBatis 应用中。

    3. 使用 PageHelper 可以避免写大量的分页代码,提高开发效率。

    4. 应优先使用 startPage 方法进行分页,它比使用 RowBounds 更高效,因为 RowBounds 是通过在内存中进行分页处理,而 startPage 生成的 SQL 会直接在数据库层面上限制结果集大小。

    5. 在分布式环境下,考虑分页查询的性能和数据一致性问题。如果数据量大,考虑使用更高效的数据分页策略。

    总之,MyBatis 分页可以通过手动编写SQL或使用分页插件来实现。在实际应用中,选用 PageHelper 这种分页插件通常能够提供更简单、更高效的分页实现。

  • 相关阅读:
    新能源汽车行业资讯-2022-9-11
    Redux模式(reduck)
    【AD-NeRF】音频驱动人脸NeRF
    Go语言用Resty库编写的音频爬虫代码
    Recommender Systems in the Era of Large Language Models (LLMs)
    FAlphaBlend——Unreal中的插值助手
    Cholesterol艾美捷胆固醇基参方案
    智安新闻|智安网络亮相2023网安周!
    Spark系列之Spark的数据倾斜
    Golang 面向对象深入理解
  • 原文地址:https://blog.csdn.net/qq_43012298/article/details/136850761