• Mybatis分页


    本文主要讲解Mybatis分页相关的技术分享,如果觉得不错的话,就点个赞吧。。。。
     

    Mybatis分页主要有2种类型:

            一、物理分页:

                    1、定义:

                            物理分页是在数据库层面进行的分页,即通过SQL语句直接从数据库中查询出需要的语句。

                    2、优点:

                            只需要加载当前页的数据,不会占用过多的内存,适合数据量大的情况。

            二、内存分页:

                    1、定义:

                            内存分页是将所有数据查询出来后,再在内存中进行分页。

                    2、优点:

                            减轻数据库的负担,适合数据量小的情况。

                            如果数据量大,会占用大量的内存,严重甚至会导致内存溢出。

    实现分页方法详解:

       一:物理分页的方法:

               1、使用LIMIT关键字:

                        这是最常见的物理分页方式,

                       原理:

                             通过在SQL语句中添加Limit子句来实现分页,

                       优缺点:

                            优点是简单直观,缺点是需要手动计算起始位置和结束位置。太低端,太Low,不推荐使用

                      实例:
    1. #查询用户表第1页,一页有3条数据。这个需要开发人员自己计算,然后给到数据库
    2. select * from user limit 1,3
              2、使用PageHelper插件:(推荐)

                       这是Mybatis提供的一个分页插件。

                   原理:

                        a、当调用PageHelper.startPage()时,PageHelper会创建一个Page对象,并将其保存到ThreadLocal中。这个Page对象包含了分页信息,如页码和每页的数量。       

                         b、当调用Mapper的查询方法时,Mybatis会生成原始的SQL语句。在这个过程中,PageHelper会通过拦截器(Interceptor)拦截SQL语句的生成过程。               

                         c、 在拦截器中,PageHelper会从ThreadLocal中获取Page对象,然后根据Page对象中的分页信息,修改原始的SQL语句,添加LIMIT子句。

                         d、最后,Mybatis执行修改后的SQL语句,从数据库中查询出分页数据。

                     优缺点:

                         通过这种方式,PageHelper可以在不修改原始SQL语句的情况下,实现物理分页。但是需要注意的是:PageHelper只对其后的第一个SQL语句生效。

                     代码:
    1. // 设置分页信息
    2. PageHelper.startPage(page, size);
    3. // 调用Mapper接口的查询方法
    4. List users = userMapper.selectAll();
    5. // 获取分页信息
    6. PageInfo pageInfo = new PageInfo<>(objects);
                    使用注意:

    PageHelper的startPage方法只对紧跟着的第一个SQL语句生效,也就是说,如果我们在调用startPage方法之后执行了多个SQL语句,那么只有第一个SQL语句会进行分页查询,其他的SQL语句还是会查询所有的数据。

       使用pageHelper需要引入依赖:

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelper-spring-boot-starterartifactId>
    4. <version>最新版本version>
    5. dependency>

    二:内存分页的方法:


          1、使用Page对象:

                 实现:

                    实现有很多种,这里只写出一种。

    1. @Service
    2. public class UserService {
    3. @Autowired
    4. private UserMapper userMapper;
    5. public List getUsers(int page, int size) {
    6. // 查询所有数据
    7. List allUsers = userMapper.selectAll();
    8. // 创建Page对象
    9. Page userPage = new Page<>(page, size);
    10. // 设置数据
    11. userPage.setRecords(allUsers);
    12. // 获取当前页的数据
    13. return userPage.getRecords();
    14. }
    15. }
           2、使用RowBounds对象:(推荐)
                原理:

                    MyBatis在执行查询操作时,会检查是否传入了RowBounds对象,如果传入了,就会使用RowBounds中的offset和limit属性来对查询结果进行分页处理。具体的实现方式是,MyBatis会在生成的SQL语句中添加LIMIT和OFFSET关键字,然后将RowBounds中的offset和limit属性的值分别设置为LIMIT和OFFSET关键字的参数,从而实现分页查询。

               实现:

                    a.  在Mapper接口的查询方法中,添加一个RowBounds类型的参数。

                    b.在调用Mapper接口的查询方法时,创建一个RowBounds对象,并设置其offset和limit属性的值。

                    c. MyBatis在执行查询操作时,会检查是否传入了RowBounds对象,如果传入了,就会使用        RowBounds中的offset和limit属性来对查询结果进行分页处理。

             代码:
    1. //我们需要在Mapper接口中定义一个使用RowBounds的查询方法:
    2. @Mapper
    3. public interface UserMapper {
    4. List selectAll(RowBounds rowBounds);
    5. }
    6. //在Service层中,我们可以调用这个方法,并传入一个RowBounds对象来进行分页查询:
    7. @Service
    8. public class UserService {
    9. @Autowired
    10. private UserMapper userMapper;
    11. public List getUsers(int page, int size) {
    12. // 创建RowBounds对象
    13. RowBounds rowBounds = new RowBounds((page - 1) * size, size);
    14. // 调用Mapper接口的查询方法
    15. return userMapper.selectAll(rowBounds);
    16. }
    17. }

  • 相关阅读:
    Kubernetes 学习总结(38)—— Kubernetes 与云原生的联系
    PHP MySQL 创建数据库
    Vue研习录(07)——组件基础知识详解及示例分析
    mac安装nvm
    记一次Mysql数据库宕机This could be because you hit a bug.
    Linux安装MySQL
    查看自己创建的用户及子用户创建的用户
    自学 TypeScript 第二天 编译选项
    C++ 基础与深度分析 Chapter10 泛型算法(泛型算法概述、类型、 迭代器元素访问、特殊迭代器、并发算法)
    Dev的splitContainerControl控件重要属性
  • 原文地址:https://blog.csdn.net/l_s_r/article/details/133960882