从0到1学会使用PageHelper
本文的思维导图为什么我们需要PageHelper?想象一下你经营着一家餐厅有顾客要点菜了就比如“鱼香肉丝”你要把菜端给顾客。这时候你要怎么把菜给顾客呢(如何把数据展示给前端)你有三个解决方案1.不分页你要把厨房里所有的鱼香肉丝可能是1000份全端上桌2.手动分页你每次跑去厨房数10份端出来来回跑几十趟3.PageHelper你告诉助手“给我第2桌的10份”助手自动处理好在代码中的体现就是//原始分页 String sql SELECT * FROM users LIMIT (pageNum-1)*pageSize , pageSize; //还要再写一个count查询SELECT COUNT(*) FROM users//PageHelper分页 PageHelper.startPage(pageNum, pageSize); ListUser users userMapper.selectAll();你认为你会选择什么呢肯定是PageHelper啊。那么PageHelper是什么呢是什么PageHelper是 MyBatis 的一个物理分页插件其核心是MyBatis的拦截器目前不知道也没关系核心作用是自动生成分页SQL让开发者无需手动编写复杂的分页语句其特点决定了他非常好用那么他的特点是什么呢1.物理分页性能优在数据库查询时就只查当前页数据如 MySQL 的LIMIT性能远优于内存分页一次性查全量再截取。2.无侵入不修改原有SQL、不改动 Mapper 接口只需一行代码开启分页。3.多兼容自动适配 MySQL、Oracle、SQL Server、PostgreSQL 等十几种数据库。4.功能全自动统计总条数、支持排序、分页合理化、自定义 COUNT SQL。5.对Spring Boot 友好提供starter一键集成行知道了这些那么要怎么用呢怎么做(如何使用PageHelper)一快速入门步骤1添加依赖!-- 在 pom.xml 中添加 -- dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version最新版本/version !-- 如 1.4.6 -- !--如果你用的 MyBatis版本较新推荐使用 1.5.0 -- /dependency步骤2基本配置# application.yml pagehelper: helper-dialect: mysql # 数据库方言mysql, oracle, sqlite等,dialect就是方言的意思 reasonable: true # 分页合理化超出总页数时显示最后一页 support-methods-arguments: true # 支持通过Mapper接口参数传递 params: countcountSql # 增加count查询步骤3最简单的使用Service public class UserService { Autowired private UserMapper userMapper; public PageInfoUser getUsers(int pageNum, int pageSize) { // 1. 设置分页参数就像告诉小助手我要第2页每页10条 PageHelper.startPage(pageNum, pageSize); // 2. 紧接着执行查询一定要紧跟 ListUser userList userMapper.selectAll(); // 3. 用PageInfo包装结果 return new PageInfo(userList); } }总结一下1.设置分页参数 2.执行查询3.用PageInfo包装结果// PageHelper流程化的三行代码 PageHelper.startPage(pageNum页码, pageSize每页条数); // 设置 ListT list xxxMapper.selectXxx(); // 查询 PageInfoT pageInfo new PageInfo(list); // 包装二、PageHelper的核心概念比喻你的餐厅有1000道菜数据库记录客人要看菜单但你不可能把1000道菜全打印在一张纸上。PageHelper的概念在餐厅的比喻作用pageNum第几页菜单客人说给我看第2页菜单pageSize每页几道菜每页显示10道菜PageHelper.startPage()告诉后厨按10道菜一页来准备设置分页参数PageInfo智能菜单本包含当前页、总页数、总菜数等count查询先数一下总共有多少道菜自动统计总数三、完整使用示例1.基础分页查询RestController RequestMapping(/users) public class UserController { Autowired private UserService userService; /** * 分页查询用户列表 * param pageNum 页码默认第1页 * param pageSize 每页条数默认10条 */ GetMapping(/list) public Result getUserList( RequestParam(defaultValue 1) int pageNum, RequestParam(defaultValue 10) int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行查询 ListUser users userService.getAllUsers(); // 用PageInfo包装结果 PageInfoUser pageInfo new PageInfo(users); return Result.success(pageInfo); } }2.复杂查询分页Service public class OrderService { public PageInfoOrder searchOrders(OrderQuery query, int pageNum, int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行带条件的查询 ListOrder orders orderMapper.selectByCondition(query); return new PageInfo(orders); } } // 查询条件对象 Data public class OrderQuery { private String orderNo; // 订单号 private Integer status; // 订单状态 private Date startTime; // 开始时间 private Date endTime; // 结束时间 private String customerName; // 客户名 }我们使用PageInfo来包装返回的信息那么PageInfo里面是什么样子的呢四、PageInfo 的完整信息//写下这一句的时候就封装了这些信息 PageInfoUser pageInfo new PageInfo(userList); // 前端能拿到的所有信息 { pageNum: 2, // 当前页码 pageSize: 10, // 每页数量 size: 10, // 当前页实际数量 total: 156, // 总记录数 pages: 16, // 总页数 list: [...], // 数据列表 // 导航页信息 prePage: 1, // 上一页 nextPage: 3, // 下一页 isFirstPage: false, // 是否第一页 isLastPage: false, // 是否最后一页 hasPreviousPage: true, // 是否有上一页 hasNextPage: true, // 是否有下一页 // 导航页码 navigatePages: 8, // 导航页码数 navigatepageNums: [1, 2, 3, 4, 5, 6, 7, 8], // 所有导航页码 navigateFirstPage: 1, // 导航条第一页 navigateLastPage: 8 // 导航条最后一页 }PageHelper的常用字段pageInfo.getTotal(); // 总记录数 pageInfo.getPages(); // 总页数 pageInfo.getPageNum(); // 当前页码 pageInfo.getPageSize(); // 每页条数 pageInfo.getList(); // 当前页数据列表 pageInfo.isIsFirstPage(); // 是否第一页 pageInfo.isIsLastPage(); // 是否最后一页五、高级用法1.排序功能//比如说按照创建时间倒序排列 //单个排序字段 String orderBy create_time desc; PageHelper.startPage(pageNum, pageSize, orderBy); ListUser users userMapper.selectAll(); // 多个排序字段 String orderBy age asc, create_time desc; PageHelper.startPage(pageNum, pageSize, orderBy);2.只统计总数不查数据// 有时我们只需要知道总数 PageHelper.startPage(1, 0); // pageSize0 表示只查count ListUser users userMapper.selectAll(); long total ((Page?) users).getTotal(); // users是空列表但total是总数3.Mapper接口参数分页// Service层 public PageInfoUser getUsersByParam(int pageNum, int pageSize, String name) { // 通过方法参数传递分页参数 return PageHelper.startPage(pageNum, pageSize) .doSelectPageInfo(() - userMapper.selectByName(name)); } //或者 public PageInfoUser getUsersByParam(int pageNum, int pageSize, String name) { return PageHelper.startPage(pageNum, pageSize) .setOrderBy(id desc) .doSelectPageInfo(() - { // 这里可以写复杂查询逻辑 return userMapper.selectByName(name); }); }4.多表关联查询分页// 在Mapper.xml中正常写多表查询 select idselectUserWithOrders resultMapuserWithOrdersMap SELECT u.*, o.order_no, o.amount FROM user u LEFT JOIN orders o ON u.id o.user_id WHERE u.status 1 ORDER BY u.create_time DESC /select// Service中 public PageInfoUser getUsersWithOrders(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); ListUser users userMapper.selectUserWithOrders(); return new PageInfo(users); }六、配置详解# application.yml pagehelper: # 数据库方言 helper-dialect: mysql # 分页合理化 reasonable: true # 支持通过Mapper接口参数传递分页参数 support-methods-arguments: true # 分页参数映射 params: countcountSql # 默认值为 false该参数对使用 RowBounds 作为分页参数时有效 offset-as-page-num: true # 默认值为 falseRowBounds是否进行count查询 row-bounds-with-count: true # 默认值为 false当设置为 true 时如果 pageSize0 或者 RowBounds.limit 0 就会查询出全部的结果 page-size-zero: false # 默认值为 false分页标签t参数处理 return-page-info: true # 分页插件会从查询方法的参数值中自动根据上面 params 配置的字段中取值 # 查出对应的字段进行查询 params: countcountSql # 支持通过Mapper接口参数传递分页参数默认值false support-methods-arguments: falseok啊感谢大家的阅读到这里大家应该已经会用PageHelper了。如果有问题请多多指正谢谢大家无限进步共同成长。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494073.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!