文章目录

  • MyBatis使用PageHelper排序分页
    • 前言
    • 排序分页
    • 使用PageHelper排序分页
      • 添加PageHelper Spring Boot依赖
      • 新增一个列表查询的方法
      • 使用PageHelper来设置排序分页查询条件
      • 测试和查看日志
    • 参考文档

MyBatis使用PageHelper排序分页

前言

前面说明了:

  • Spring Boot使用MyBatis访问MySQL
  • Spring Boot统一REST API接口响应格式和异常处理

本文说明如何使用PageHelper对查询结果进行排序分页。

排序分页

排序分页常用于列表展示,打开列表时会先根据默认排序进行排序,然后再对记录进行分页展示,包括显示页数、每页显示的记录数和总记录数。用户可以选择排序方式,查看第几页的内容,修改每页可展示的记录数。

根据排序分页的实现,可以分为客户端排序分页和服务端排序分页。

  • 客户端排序分页:也就是前端排序分页,后端直接返回默认排序的全部数据,再由前端组件来进行排序分页。客户端排序分页比较灵活,但是一般只用于数据量较少的情况。
  • 服务端排序分页:也就是后端排序分页,后端在数据库中执行select count来获取总记录数,并利用数据库的特性进行分页(比如MySQL的limitoffset)。服务端排序分页性能较好,但是实现比较复杂。

PageHelper是MyBatis的服务端排序方式。

使用PageHelper排序分页

添加PageHelper Spring Boot依赖

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.13</version>
</dependency>

新增一个列表查询的方法

在UserMapper中新增一个列表查询的方法:

List<User> listUsers(User user);

其对应的Mapper XML为:

<select id="listUsers" parameterType="me.cookcode.springboot.mybatisdemo.model.User" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from t_userwhere 1=1<if test="name != null">and `name` like concat('%', #{name,jdbcType=VARCHAR}, '%')</if><if test="email != null">and email like concat('%', #{email,jdbcType=VARCHAR}, '%')</if>
</select>
  • 该列表查询支持根据name和email做模糊查询,并返回全部符合条件的user

使用PageHelper来设置排序分页查询条件

从上面的Mapper XML中可以看到,SQL语句中并没有select countlimitorder by语句。这些排序分页查询条件都是通过PageHelper“动态注入”的。

PageHelper排序分页示例:

@PostMapping("/users")
public ApiResponse getUsers(@RequestParam(value = "pageNum", defaultValue = "0") int pageNum,@RequestParam(value = "pageSize", defaultValue = "10") int pageSize,@RequestParam(value = "orderBy", defaultValue = "name") String orderBy,@RequestParam(value = "order", defaultValue = "asc") String order,@RequestBody User user) {// 设置pageSize最大值if (pageSize > 50) {pageSize = 50;}// 只允许指定的排序字段和排序方式,防止SQL注入String[] orderByArr = {"name", "email"};String orderByStr = "";if (StringUtils.isNotEmpty(orderBy) && Arrays.asList(orderByArr).contains(orderBy.toLowerCase())) {orderByStr = String.format("%s %s", orderBy.toLowerCase(), "asc".equalsIgnoreCase(order) ? "asc" : "desc");} else {// 默认排序orderByStr = "name asc";}PageHelper.startPage(pageNum, pageSize, orderByStr);List<User> users = userMapper.listUsers(user);PageInfo<User> userPageInfo = new PageInfo<>(users);return ApiResponse.success(userPageInfo);
}

为了简化自定义排序,也可以限制排序的种类,比如只支持“默认排序”、“播放多”、“新发布”和“弹幕多”,然后在Mapper XML中针对不同的排序种类来设定不同的order by来简化排序,并防止SQL注入。

测试和查看日志

假设已经安装好IDEA的Restful Toolkit和MyBatis Log Plugin。

打开Tools / MyBatis Log Plugin可以查看到真正执行的排序分页SQL日志。

打开 View / Tools Windows / RestServices,就可以方便地对上面的REST API进行测试。

SQL日志示例:

-- 查询记录总数
SELECT count(0)FROM t_userWHERE 1 = 1 AND `name` LIKE concat('%', '张', '%');-- 查询排序分页记录结果
SELECT id, `name`, emailFROM t_userWHERE 1 = 1 AND `name` LIKE concat('%', '张', '%') order by name descLIMIT 2;

REST API返回的接口响应示例:

{"code": 0,"message": "OK","data": {"total": 3,"list": [{"id": 11,"name": "张翠山","email": "cuishan@example.com"},{"id": 10,"name": "张无忌","email": "wuji@example.com"}],"pageNum": 1,"pageSize": 2,"size": 2,"startRow": 1,"endRow": 2,"pages": 2,"prePage": 0,"nextPage": 2,"isFirstPage": true,"isLastPage": false,"hasPreviousPage": false,"hasNextPage": true,"navigatePages": 8,"navigatepageNums": [1,2],"navigateFirstPage": 1,"navigateLastPage": 2}
}

参考文档

  • PageHelper Spring Boot
  • MyBatis Spring Boot
  • MyBatis中文文档
  • MySQL中使用LIMIT进行分页的方法
  • MySQL LIMIT以及LIMIT OFFSET 使用方法介绍

MyBatis使用PageHelper排序分页相关推荐

  1. Springboot Mybatis使用PageHelper实现分页查询

    以下介绍实战中数据库框架使用的是mybatis,对整合mybatis此处不做介绍. 使用pageHelper实现分页查询其实非常简单,共两步: 一.导入依赖: pom.xml添加依赖: <!-- ...

  2. Springboot Mybatis使用pageHelper实现分页查询

    以下介绍实战中数据库框架使用的是mybatis,对整合mybatis此处不做介绍. 使用pageHelper实现分页查询其实非常简单,共两步: 一.导入依赖: 二.添加配置: 那么开始, 第一步: p ...

  3. springboot+mybatis 利用PageHelper插件分页,结果第二页的返回分页信息还是和第一页一样。

    正常使用PageHelper来分页时可以的,但是如果在查询list后做了非常多的处理,即解包在装包操作.可能最后返回时分页的数据查询的对,但是分页信息就有问题了.有的甚至分页功能都不行.这里为避免几个 ...

  4. Spring + Mybatis 使用 PageHelper 插件分页

    转载:http://blog.csdn.net/joker_zhou/article/details/50418005 先增加maven依赖: [html] view plaincopy print? ...

  5. springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zab635590867/article ...

  6. Springboot集成mybatis通用Mapper与分页插件PageHelper

    Springboot集成mybatis通用Mapper与分页插件PageHelper 插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 ...

  7. mybatis动态查询(分页排序搜索)+分解关联查询+Logback 日志配置(打印sql到控制台)+mybatis新增记录后返回自增的id。批量=11/2~11/20

    一.mybatis动态查询(分页排序搜索) mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和lim ...

  8. mybatis pagehelper实现分页

    jar包的版本一定要对应,不然会出现一系列的问题 下载jar包 <properties>           <!-- spring版本号 -->           < ...

  9. SpingBoot中使用MyBatis和pagehelper实现数据的增删改查和分页

    文章目录 一.认识MyBatis CRUD注解 映射注解 高级注解 二.用MyBatis实现数据的增加.删除.修改.查询和分页 1.创建springboot项目并引入依赖 2.实现数据表的自动初始化 ...

最新文章

  1. schedule和scheduleUpdate
  2. 【mybatis】 “if“ 相关联的 “test“ 属性值不能包含 ‘<‘ 字符
  3. Berkeley DB基础教程
  4. 如何在 SAP BTP 平台上重用另一个已经开发好的 service
  5. Angular应用内路由(In App Route)的最佳实践
  6. winform 与WPF
  7. gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化
  8. tomcat日志详情
  9. vncviewer远程连linux白屏,vncviewer远程链接桌面linux
  10. oracle数据库sga用途_oracle数据库的SGA和PGA,及分配指导
  11. 基于各系统平台(RedHat Linux、SUSE Linux、CentOS、SUN Solaris10) FTP服务的配
  12. pandas库的使用
  13. 平面变压器的设计(翻译)(5)
  14. SAP BASIS ADM100 中文版 Unit 9(5)
  15. 努比亚android最高版本,努比亚Z11安卓7.1固件开发版下载地址:新增压力按键等功能...
  16. labview虚拟心电监测系统_基于LabVIEW实现的心电监护系统
  17. 数据链路层的重点协议
  18. Linux 安装MySql 步骤
  19. oracle group by 行转列 分析执行计划
  20. Django连接mysql数据库步骤非常详细

热门文章

  1. 多线程复习总结之解析Synchronized与重入锁
  2. 计算机英语高级速录师,常用英语
  3. FTP工作原理及内网用端口映射方式建FTP的注意事项
  4. AIGC大一统模型来了!CV界泰斗黄煦涛创立团队提出「全能Diffusion」
  5. 已解决:MySQL Workbench 8.0 CE进行汉化。
  6. idea2018.3 无需注册码破解,完美使用100年
  7. Libfilth(一个滤波器C库)使用
  8. 中小企业面临“招聘难”
  9. 操作系统的发展与兴衰史
  10. 《低代码指南 》——低代码跟其他 SAAS 软件的区别?