【快速实现分页】MyBatis-Plus 整合 PageHelper

MyBatis-Plus自带分页PaginationInterceptor对象,但想要用MyBatis-Plus自带的分页功能的话需要在mapper对象中传入一个Page对象才可以实现分页,这样耦合度是不是太高了一点,从web到service到mapper,这个Page对象一直都在传入,这样的使用让人感觉有点麻烦,但是Mapper Plus不得不说真的是很好用的。

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。只要一行代码就能实现分页

现在将这两个好用的框架整合在一起

1. pom引入

<!--pagehelper分页插件 -->
<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>1.2.5</version>
</dependency>
<!-- Mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>			

我用的是Spring Boot框架,在pom中直接引入MyBatis PlusPageHelper就可以了;

2. 配置文件

MyBatis-Plus的配置我就不贴出来了,主要贴出PageHelper的配置

application.properties

#分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect 属性来指定分页插件使用哪种方言。
pagehelper.helper-dialect=mysql
#分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages (超过总数时),会查询最后一页。
pagehelper.reasonable=true
#支持通过Mapper接口参数传递page参数,默认值为falset
pagehelper.support-methods-arguments=true
#默认值为 false ,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit =0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
pagehelper.pageSizeZero=true
#为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值
pagehelper.params=count=countSql

application.yml

pagehelper:
  auto-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  page-size-zero: true
  params: count=countSql

3. 使用

使用起来很方便,我用一个controller的list接口作为示范

@RequestMapping("/page/{pn}")
public ResultData<PageInfo> cityPage(@PathVariable  Integer pn){
    try {
		//1.引入分页插件,pageNum是第几页,pageSize是每页显示多少条,默认查询总数count
	    Page<City> page = PageHelper.startPage(pn,3);
	    //2.紧跟的查询就是一个分页查询-必须紧跟.后面的其他查询不会被分页
	    List<City> cityList = cityService.list();
	    //3.使用PageInfo包装查询后的结果,3是连续显示的条数
	    PageInfo pageInfo = new PageInfo(cityList, 3);
	}finally {
		//清理 ThreadLocal 存储的分页参数,保证线程安全
        PageHelper.clearPage(); 
    }	    
			    
    return new ResultData<PageInfo>().setData(pageInfo);
}

PageHelper.startPage(pageNum, pageSize);这一行代码就实现了分页,
通过PageInfo对象将数据包装返回即可。
PageHelper中文文档

重要提示:

  1. 只有紧跟在PageHelper.startPage()方法后的第一个Mybatis的查询(Select)方法会被分页。
  2. 请不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!
  3. 对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。
  4. 由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。

4. 效果

未分页
在这里插入图片描述
PageInfo类所有属性
在这里插入图片描述

pageNum:当前为第几页
pageSize:每页的数据行数
startRow:当前页数据从第几条开始
endRow:当前页数据从第几条结束
pages:总页数
prePage:上一页页数
nextPage:下一页页数
hasPreviousPage:是否有上一页
hasNextPage:是否有下一页
navigatepageNums:所有页码的数组

我们可以根据这几个属性控制页面切换的操作,比如hasPreviousPage为false表示没有上一页,
当前为首页,我们可以控制页面不显示或者不能使用首页和上一页功能。非常的简单。
下面是我做的一个小项目示例图:

在这里插入图片描述

有人说PageHelper 是不安全的分页?
实际上PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。
只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。
参考博客

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Mybatis-plus 可以很方便地与 PageHelper 整合实现分页查询功能。 具体步骤如下: 1. 引入 PageHelperMybatis-plus 的依赖。 2. 在 Mybatis-plus 的配置文件中,配置分页插件: ``` <!-- 分页插件 --> <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"> <property name="dialectType" value="mysql"/> </bean> ``` 3. 在需要分页的方法中,使用 PageHelper.startPage 方法设置分页参数: ``` PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.selectList(null); ``` 其中,pageNum 表示当前页码,pageSize 表示每页显示的记录数。 4. 将查询结果封装成 PageInfo 对象,返回给前端: ``` PageInfo<User> pageInfo = new PageInfo<>(userList); return Result.success(pageInfo); ``` 这样,就可以实现基于 Mybatis-plusPageHelper分页查询功能了。 ### 回答2: Mybatis-plus 是一款优秀的 Mybatis 增强工具,在它的基础上整合 PageHelper 可以方便进行分页查询操作,下面介绍具体的整合步骤。 1. 添加依赖 首先,在 Maven 中添加 Mybatis-plusPageHelper 的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>{latest-version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>{latest-version}</version> </dependency> ``` 其中的最新版本可以在 Maven 中央库中查找。 2. 配置 PageHelperSpring Boot 的配置文件 application.yml 中进行配置: ``` pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql ``` 这里设置了数据库方言为 MySQL,reasonable 属性设置为 true 表示启用合理化分页,supportMethodsArguments 属性为 true 表示支持通过方法参数传入分页信息,params 属性为 count=countSql 表示分页插件会自动统计总数。 3. 使用 PageHelper 进行分页查询 在需要分页查询的接口方法中,使用 PageHelper.startPage 方法进行分页操作: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public PageInfo<User> getUsers(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.selectList(null); return new PageInfo<>(userList); } } ``` 这里的 pageNum 和 pageSize 分别表示当前页数和每页记录数,PageHelper 会自动根据这两个参数进行分页查询操作,返回的 PageInfo 对象包含分页信息以及查询结果。注意,需要将 Mybatis-plus 的查询结果转换为 List 类型,才能进行分页操作。 通过以上操作,就可以很方便地整合 Mybatis-plusPageHelper 进行分页查询了。 ### 回答3: MyBatis-Plus 是在 MyBatis 基础上的增强工具,提供了很多方便开发的功能,例如快速开发 CRUD,自动分页,租户隔离等。而显示分页数据是 Web 应用程序中经常使用的功能。为了在 MyBatis-Plus实现分页功能,我们可以使用 PageHelper 插件。 PageHelper 是一个 MyBatis 物理分页插件,它生成适合多种数据库的分页查询 SQL 语句,使用 PageHelper 对 SQL 语句增加了分页语句,用于显示分页查询结果。 在使用 MyBatis-Plus 整合 PageHelper 时,我们需要进行以下几个步骤: 1. 引入依赖 在 pom.xml 文件中引入 MyBatis-PlusPageHelper 的依赖: ``` <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.x.x</version> </dependency> <!-- PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.x</version> </dependency> ``` 2. 配置分页插件 在 MyBatis 配置文件中增加如下分页插件的配置: ``` <plugins> <!-- 分页插件 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="dialect" value="mysql"/> <property name="reasonable" value="true"/> </plugin> </plugins> ``` 此处使用的是 PageInterceptor,是 PageHelper 的核心插件。 其中,dialect 属性决定了使用哪种数据库语言;reasonable 属性决定是否开启分页合理化。 3. 代码实现分页查询 在使用 MyBatis-Plus 进行查询时,结合 PageHelper 插件实现分页查询: ``` Page<User> page = new Page<>(1, 10); // 查询第 1 页,每页 10 条记录 IPage<User> userIPage = userService.page(page, new QueryWrapper<User>().lambda().eq(User::getGender, 1)); List<User> userList = userIPage.getRecords(); ``` 其中,page 对象作为分页查询的参数,包含了当前页码以及每页的记录数;userService.page() 方法是 MyBatis-Plus 提供的分页查询方法,第一个参数是 page 对象,第二个参数是查询条件。 4. 前端展示分页数据 在前端页面中使用分页插件进行数据的展示,PageHelper 提供了 Page 对象中 pageList 属性,可以直接获取分页后的数据集合: ``` <% List<User> userList = (List<User>) request.getAttribute("userList"); %> <table class="table table-bordered"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Gender</th> <th>Age</th> </tr> </thead> <tbody> <% for (User user : userList) { %> <tr> <td><%= user.getId() %></td> <td><%= user.getName() %></td> <td><%= user.getGender() %></td> <td><%= user.getAge() %></td> </tr> <% } %> </tbody> </table> <div class="text-center"> <% out.print(new Paging(request.getRequestURI()).getHtml(); %> </div> ``` 其中,Paging 是一个辅助类,用于展示分页条。 通过使用 MyBatis-Plus 整合 PageHelper 插件,我们可以轻松地实现分页查询功能,并且在前端页面中展示分页数据。这样,我们就可以提高数据查询的效率,同时也让用户对数据更加清晰明了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值