Mybatis如何实现分页

关键字limit实现分页

Interceptor Plugin实现分页

首先定一个拦截器,拦截器会拦截所有以ByPage结尾的方法,然后拼接sql 语句的limit关键字实现分页

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class MyPageInterceptor implements Interceptor {private int page;private int size;@SuppressWarnings("unused")private String dbType;@SuppressWarnings("unchecked")@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();MetaObject metaObject = SystemMetaObject.forObject(statementHandler);while (metaObject.hasGetter("h")) {Object object = metaObject.getValue("h");metaObject = SystemMetaObject.forObject(object);}while (metaObject.hasGetter("target")) {Object object = metaObject.getValue("target");metaObject = SystemMetaObject.forObject(object);}MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");String mapId = mappedStatement.getId();if (mapId.matches(".+ByPage$")) {ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");Map<String, Object> params = (Map<String, Object>) parameterHandler.getParameterObject();page = (int) params.get("page");size = (int) params.get("size");String sql = (String) metaObject.getValue("delegate.boundSql.sql");sql += " limit " + (page - 1) * size + "," + size;metaObject.setValue("delegate.boundSql.sql", sql);}return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {String limit = properties.getProperty("limit", "10");this.page = Integer.parseInt(limit);this.dbType = properties.getProperty("dbType", "mysql");}}

修改controller的findByUserPager方法,拦截器已经自动帮我们算好了page和size的值

    public Pager<User> findByUserPager(int page, int size){Map<String, Object> params = new HashMap<String, Object>();params.put("page", page);params.put("size", size);List<User> list = userMapper.findUserByPage(params);Pager<User> pager = new Pager<User>();pager.setData(list);pager.setTotal(userMapper.findUserCount());return pager;}

PageHelper实现分页

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
// Page<User> page = PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);

在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

分页原理:PageHelper.startPage会拦截下一个sql,也就是userMapper.selectIf(1)的SQL。并且根据当前数据库的语法,把这个SQL改造成一个高性能的分页SQL,同时还会查询该表的总行数,具体可以看SQL日志。

PageHelper.startPage和userMapper.selectIf(1)最好紧跟在一起,中间不要有别的逻辑,否则可能出BUG。
Page<User> page:相当于一个list集合,selectIf(1)方法查询完成后,会给page对象的相关参数赋值。

public PageInfo<User> testPage(User user, Pageable pageable) {int page = pageable.getPageNum();int size = pageable.getPageSize();//项目里自定义的pojo类User tempuser = new User();tempuser.setName(user.getName());//重点就是这句PageHelper.startPage(page, size);//这里调用的是mybatis的mapperList<Userl> tempusers = UserDao.selectByPage(tempuser);//用PageInfo包装了一下(官方推荐)return new PageInfo<>(tempusers);
}

Mybatis如何实现分页相关推荐

  1. Mybatis自定义轻量级分页组件(易集成,易拓展)

    Mybatis自定义轻量级分页组件(易集成,易拓展) 其实github有一个叫做PageHelper的开源分页组件,我也用过,封装的还可以.只是感觉他的量级偏重,其实很多参数,都是我们开发中不需要的参 ...

  2. Mybatis最入门---分页查询(逻辑分页与SQL语句分页)

    [一步是咫尺,一步即天涯] 到目前为止,我们介绍的Mybatis种种查询都是一次性的查询出所有结果并返回给上层.但是,在实际开发过程中,在大量数据存在的情况下,是很少这么做的.本文,我们将从逻辑分页, ...

  3. 【Mybatis】mybatis如何实现分页

    [Mybatis]mybatis如何实现分页 mysql分页功能原理 实现分页必要条件 必须知道某一页从哪里开始到哪里结束 必须知道页面的大小,也就是指定每页要显示多少条数据量 mysql分页的过程 ...

  4. Mybatis使用之分页

    Mybatis使用之分页 一:简介 注:示例基于mysql数据库.Oracle可以自行测试.   使用Mybatis分页主要有两种方式.一种是将分页参数传递到配置文件中.在写sql的时候就做分页.另一 ...

  5. Mybatis如何进行分页的

    Mybatis如何进行分页的 Mybatis是Java应用开发的基础框架,而分页是我们时时都在使用的功能,一般我们可以把分页分为两种: 逻辑分页.先查询出所有的数据缓存到内存里,再根据业务相关的一些需 ...

  6. 前端Vue+ElementUI的Pagination分页组件实现分页展示 后端Spring Boot +Mybatis Plus实现分页接口

    前端Vue+ElementUI的Pagination分页组件实现分页展示 & 后端Spring Boot +Mybatis Plus实现分页接口 很久没有更新博客了,主要原因是博主一直在补充自 ...

  7. 一步步教你mybatis分页,mybatis分页拦截器 使用,mybatis拦截器分页

              mybatis 分页详解.mybatis分页查询,mybatis分页拦截器使用.struts2下mybatis分页 mybatis默认是支持分页的,内部通过创建可滚动的Result ...

  8. MyBatis插件使用--分页插件与性能拦截器

    对于PageHelper网上的资料很多,作者的文档写的很全面,我这里只是记录自己的配置和使用的方法 所需jar包:jsqlparser-0.9.5.jar和pagehelper-5.0.0.jar X ...

  9. Mybatis3.3.x技术内幕(十三):Mybatis之RowBounds分页原理

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis可以通过传递RowBounds对象,来进行数据库数据的分页操作,然而遗憾的是,该分页操作是对ResultSet结 ...

最新文章

  1. AutoMapper用法
  2. nginx 配置文件解释及优化安全
  3. docker inspect 获取 容器 镜像 元数据 简介
  4. linux 3.0.8 alsa数据流程分析
  5. 【NLP】机器如何认识文本 ?NLP中的Tokenization方法总结
  6. C/C++基础知识点(二)
  7. OpenCASCADE:Modeling Data之二维几何
  8. mysql5.7.18压缩包下载_Centos7搭建Mysql5.7数据库
  9. Mysql面试热身题集总结
  10. c 开发服务器的性能,高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了...
  11. 4 MIGO报错-更正统一日记账分类账的定制设置
  12. 【C语言】能不能更快?
  13. Linux下java web服务器搭建(JDK1.6、MySQL5.1、Apache2.2+2...
  14. debian 屌丝日记
  15. 前端基于excljs导出xlsx时图片资源的处理及踩坑实录
  16. [Setting]win7下运行exe失败:应用程序无法启动,因为应用程序的并行配置不正确
  17. E. New Game Plus!(Technocup 2021 - Elimination Round 2)
  18. 银行系统(万里长征始于足下)
  19. 【免费】无人机图像处理工具软件—批量去雾,匀光匀色,增强,对比度亮度调节
  20. php 静态配置文件问题,Nginx+PHP 配置漏洞:静态文件都可以当作 PHP 解析

热门文章

  1. 零基础新手小白学编程必会的100个代码
  2. 新手第二课:atof()函数的头文件
  3. WIN 11 无法正常运行HCL 模拟器
  4. 程序员的8个级别,你属于哪个级别?
  5. 大数据在线分析处理和常用工具
  6. Node.js + Express 接口请求(GET、POST、PUT)事例
  7. python列表list元素降序排列两种方法
  8. 华为云计算之rainbow迁移实验
  9. 学生管理系统【Python】
  10. 常见的网络状态码(HTTP状态码)