0


springboot3整合pageHelper实现分页功能

1、介绍:

PageHelper是一个开源的Java分页插件,它提供了方便的分页查询功能,适用于大多数基于Java的持久层框架(如MyBatis、Hibernate等)。

官网:MyBatis 分页插件 PageHelper

在一个程序中难免会使用到查询操作,在查询操作中如果数据量太大则需要进行分页查询,分页操作的实现方法有很多,比如:在 mybatis 中 xml 文件中通过 limit 关键字进行分页查询,该插件就是为了简化在 xml 中进行分页操作的工具;好比在 Mybatis-Plus 中也对分页操作进行了封装,通过调用 selectPage() 方法就可以实现分页操作。

在 sql 中使用 limit 进行分页查询

  1. SELECT * FROM user LIMIT 10, 10
  • offset 是相对于首行的偏移量(首行是 0),rows 是返回条数
  • mapper 中可以传变量,即在实际使用的时候 offset 与 rows 可以用变量替代

我们当然可以在sql中进行分页,但是为了简化代码。我们还是会使用一些插件来帮我们更好的进行分页操作。如:在项目中我们执行一个分页查询时,很多时候还需要知道该查询的其他信息,比如:总数、每页数量、当前页数、是否有上一页或者是否有下一页等等,这些信息如果每次都自己写的话就会太繁琐冗余了,而 PageHelper 插件能够帮助我们更加方便地获取这些信息,大大方便了我们的开发效率。

我始终认为官网才是一个技术最权威、最公正的对照。如果你在使用某个相应的技术中出现了错误,那么一定要先去官网上查找原因。现在的web开发使用到的框架大多为spring boot,所以本篇文章只是教会你如何快速的在spring boot项目中使用pageHelper分页插件,并介绍一些一些常用的方法,如果你有其他的疑问,可以在官网中查找。

2、新建spring boot项目,并导入依赖

引入pageHelper的坐标(我引入的使pageHelper整合spring boot的依赖)

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>3.0.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.github.pagehelper</groupId>
  8. <artifactId>pagehelper-spring-boot-starter</artifactId>
  9. <version>1.4.7</version>
  10. </dependency>

在yml配置文件中对pageHelper进行一些配置,能更好的使用这个插件;

  1. # PageHelper 分页插件配置
  2. pagehelper:
  3. helper-dialect: mysql
  4. reasonable: true
  5. support-methods-arguments: true
  6. params: count=countsql

helper-dialect:指定数据库,不指定的话会默认自动检测数据库类型
reasonable:是否启动分页合理化。如果启用,当 pagenum < 1 时,会自动查询第一页的数据,当 pagenum > pges 时,自动查询最后一页数据;不启用的,以上两种情况都会返回空数据,如果启用则 pageHelper可以自动拦截请求参数中的 pageNum,pageSize参数,否则需要使用 PageHelper.startPage(pageNum,pageSize) 方法调用。
support-methods-arguments:默认为 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
params:用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

创建一个mapper接口:

  1. public interface UsersMapper {
  2. //查询所有
  3. List<Users> getAll();
  4. }

mybatis的配置文件:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC
  3. "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <settings>
  7. <!-- 设置驼峰标识 -->
  8. <setting name="mapUnderscoreToCamelCase" value="true"/>
  9. <!-- 打印SQL语句 -->
  10. <setting name="logImpl" value="STDOUT_LOGGING"/>
  11. </settings>
  12. <!-- <plugins>-->
  13. <!-- &lt;!&ndash; 分页插件 &ndash;&gt;-->
  14. <!-- <plugin interceptor="com.github.pagehelper.PageInterceptor"/>-->
  15. <!-- </plugins>-->
  16. <mappers>
  17. <package name="com.zq.pagehelpdemo.mapper"/>
  18. </mappers>
  19. </configuration>

我们已经引入了pagehelper-spring-boot-starter的依赖。所以pageHelper插件在项目启动时会自动注入到容器中。如果你的项目不是spring boot项目或者引入的依赖不是pageHelper整合了spring boot的依赖,那么就需要在mybatis的配置文件中引入pageHelper的插件。

在项目中使用pageHelper实现分页:

  1. @Override
  2. public List<Users> getPage(int page, int size) {
  3. //获取第page页,size条内容,默认查询总数count
  4. PageHelper.startPage(page,size);
  5. //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
  6. return getAll();
  7. }

xml中的sql语句:

  1. <select id="getAll" resultType="com.zq.pagehelpdemo.entity.Users">
  2. select * from users
  3. </select>

运行结果:
在启动项目时看到这个图标就说明pageHelper注入成功了:

sql语句:

可以看到先执行了一个查询所有记录的语句,然后执行了我们在xml中写的查询语句,在查询语句的最后加上了LIMIT字段。

其实这些sql都不是我们写的,我们只不过是写了一个

  1. PageHelper.startPage(page,size);

这一条语句就会帮助我们自动生成分页语句;

注意**

  1. PageHelper.startPage方法使用也有限制:

**

**

  1. PageHelper.startPage

方法重要提示**

**只有紧跟在

  1. PageHelper.startPage

方法后的第一个Mybatis的查询(Select)方法会被分页**。(

  1. PageHelper

启动了一个新的线程)

还有在使用pageHelper插件时的几个重要提示:

请不要配置多个分页插件

请不要在系统中配置多个分页插件(使用Spring时,

  1. mybatis-config.xml

  1. Spring<bean>

配置方式,请选择其中一种,不要同时配置多个分页插件)!

**分页插件不支持带有

  1. for update

语句的分页**

对于带有

  1. for update

的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。

分页插件不支持嵌套结果映射

由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。

pageHelper使用时,要注意线程的安全性,避免重复调用分页参数:

  1. PageHelper

方法使用了静态的

  1. ThreadLocal

参数,分页参数和线程是绑定的。

只要你可以保证

  1. PageHelper

方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为

  1. PageHelper

  1. finally

代码段中自动清除了

  1. ThreadLocal

存储的对象。

如果代码在进入

  1. Executor

前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到

  1. MappedStatement

时), 这种情况由于线程不可用,也不会导致

  1. ThreadLocal

参数被错误的使用。

下面有一段代码示例:

  1. public List<Users> getPages(int page, int size) {
  2. // 调用PageHelper的静态方法startPage
  3. PageHelper.startPage(page, size);
  4. List<Users> usersList=new ArrayList<>();
  5. if (false) {
  6. System.out.println("调用了查询方法");
  7. usersList = usersMapper.getAll();
  8. } else {
  9. System.out.println("没有调用了查询方法");
  10. }
  11. return usersList;
  12. }

在这个方法中,我调用了

  1. PageHelper.startPage方法,**这时就会导致PageHelper**

生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致可能不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

所以我们一定要保证**

  1. PageHelper.startPage方法后面跟了一个查询方法。最好的情况就是将这两条语句就放在一起,前后挨着。

**

当然,使用 PageHelper.startPage进行分页时基本的用法。如果你不仅仅想要得到分页内容,还要得到一些分页具体的值,如查询的总记录数等等。可以使用PageInfo,在这个对象中pageHelper封装了我们对于分页来说的所有参数,可以满足我们对于分页操作的所有需求。

  1. public class PageInfo<T> extends PageSerializable<T> {
  2. public static final int DEFAULT_NAVIGATE_PAGES = 8;
  3. // 当前页
  4. private int pageNum;
  5. // 每页的数量
  6. private int pageSize;
  7. // 当前页的数量
  8. private int size;
  9. // 下面两个不常用
  10. // 在页面中“显示 startRow” 到 endRow 共 size条数据
  11. // 当前页面中第一个元素的在数据库中的行号
  12. private long startRow;
  13. // 当前页面最后一个元素在数据库中的行号
  14. private long endRow;
  15. // 总页数
  16. private int pages;
  17. // 前一页
  18. private int prePage;
  19. // 下一页
  20. private int nextPage;
  21. // 是否为第一页
  22. private boolean isFirstPage;
  23. // 是否为最后一页
  24. private boolean isLastPage;
  25. // 是否有前一页
  26. private boolean hasPreviousPage;
  27. // 是否有下一页
  28. private boolean hasNextPage;
  29. // 导航页码数
  30. private int navigatePages;
  31. // 所有导航页号
  32. private int[] navigatepageNums;
  33. // 导航条上的第一页
  34. private int navigateFirstPage;
  35. // 导航条上的最后一页
  36. private int navigateLastPage;
  37. ......
  38. }

在代码中使用PageInfo:

(在创建PageInfo时,指定泛型。并将查询到的结果作为入参传递)

  1. @Override
  2. public PageInfo<Users> getPageInfo(int page, int size) {
  3. PageHelper.startPage(page,size);
  4. List<Users> usersList = getAll();
  5. // 将查询到的数据封装到PageInfo中
  6. PageInfo<Users> pageInfo=new PageInfo<>(usersList);
  7. return pageInfo;
  8. }

运行结果为:

可以很清晰的看到输出了PageInfo的所有属性,我们可以根据我们的需求动态的获取用到的参数。

标签: tomcat java

本文转载自: https://blog.csdn.net/2301_78646673/article/details/138947043
版权归原作者 张乔24 所有, 如有侵权,请联系我们删除。

“springboot3整合pageHelper实现分页功能”的评论:

还没有评论