Mybatis如何实现分页

2023-05-16

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")
    @Override
    public 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();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public 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的mapper
    List<Userl> tempusers = UserDao.selectByPage(tempuser);
    //用PageInfo包装了一下(官方推荐)
    return new PageInfo<>(tempusers);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis如何实现分页 的相关文章

  • 【AtCoder】 AtCoder Beginner Contest 103 (ABC103)

    先上一张最终结果的图吧 xff1a 感觉AtCoder的ABC还是比较练手的 xff0c 考验代码速度 xff0c 网速 xff0c D题还会有一些思维难度 这次ABC由于网络原因 xff0c 很迟才看到题 xff0c 但完成得还是不错的
  • java将16进制与10进制互相转换

    今天遇到了进制转换的有趣问题 xff0c 记录下来 1 xff0c 首先 xff0c 10进制转16进制 xff0c 大家应该都比较熟 xff1a Integer span class hljs built in x span 61 spa
  • JavaScript 阿贾克斯

    Ajax技术的核心是XMLHttpRequest对象 用于在后台与服务器交换数据 ajax 异步请求 主要用来请求数据 远程地址或者本地地址 传统的web交互是用户触发一个http请求服务器 然后服务器收到之后 做出响应到用户 哪怕是一个很
  • uni-app基本(样式和sass语法、基本语法、组件传参、全局共享数据、组件插槽、生命周期)

    查看vue cli安装目录where vue指令 vue cli就是vue2 64 vue就是vue3 如果cnpm uninstall 或者 npm uninstall 无效的话直接在文件夹里删除不需要的 vue版本然后执行安装命令 vu
  • vue项目编译内存溢出 项目过大编译太慢的问题

    cnpm install increase memory limit save 项目目录中运行 操作完成后编译速度会快一些 也不会在编译中报错了
  • 提交项目到Git

    gitee git 此操作会生成 git文件 git add git commit m 34 first commit 34 git remote add origin https gitee com git push u origin 3
  • 奇怪的一些

    1 请求200 但是请求回来的是html 网络里会写 200OK from disk cache 这个时候需要清除浏览器缓存 2 base64 引入失败 找一个js文件直接引入 require is not defined import B
  • 【u103】绘制二叉树

    Time Limit 1 second Memory Limit 128 MB 问题描述 二叉树是一种基本的数据结构 xff0c 它要么为空 xff0c 要么由根节点 xff0c 左子树和右子树组成 xff0c 同时左子树和右子树也分别是二
  • react子父组件传值&生命周期

    react子父组件 父子组件传值 create react app 新建react文件 文件夹assets components css main props 父组件通过refs获取子组件 新建components firstpage js
  • nodejs连接MongoDB(增删改查)/MySQL

    启动mongodb 启动服务器 运行mongo 两个cmd命令框 vscode新建项目mongodb 新建mongo js 安装mongodb cnpm install mongodb save 进入momgo js 引入mongodb 远
  • QWaitCondition 的正确使用方法(qt线程同步)

    简单用法 QWaitCondition 用于多线程的同步 xff0c 一个线程调用QWaitCondition wait 阻塞等待 xff0c 直到另一个线程调用QWaitCondition wake 唤醒才继续往下执行 为了描述方便 xf
  • boost入门指南(windows)

    什么是boost boost库是一个开源免费的第三方库 xff0c 它是一个非常优秀的库 xff0c 是C 43 43 标准的最好实践之一 xff0c 因此也经常被用于商业的开发 boost致力于建立 C 43 43 标准的 现有实践 和参
  • GET . POST . PUT . DELETE 请求方式

    请求类型一共8种 常用的4种 GET POST PUT DELETE 1 GET get请求是用来获取数据的 相当于数据库中的select操作一样 不对服务器的数据做任何的修改 新增 删除 只是用来查询数据 get请求参数会加在URL后面
  • Springboot整合mybatis+mybatis-plus+PageHelper

    Mybatis是在国内使用是最广泛的 xff0c 以前都是使用xml进行映射 xff0c 说实话真心不太好用 xff0c 维护起来也不太方便 从mybatis3 0后开始支持 64 Mapper注解 xff0c 极大方便了开发 xff0c
  • PHP操作mysql

    一 mysqli基础操作 xff1a 1 连接数据库 xff1a mysqli connect 函数 填写你连接数据库的账号密码 conn 61 mysqli connect 39 127 0 0 1 39 39 root 39 39 ro
  • Linux安装pytorch1.1.0+CUDA10.0

    1 创建虚拟环境 conda create span class token operator span n pytorch1 span class token punctuation span span class token numbe
  • 使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

    我的折磨历程 开始的时候用乌班图的时候 xff0c 不懂事 xff0c 根目录太小了 xff0c 后来就满了 xff0c 就就感觉完全没法用 xff0c 看着现在硬盘贼便宜 xff0c 去狗东买了个新的硬盘 感觉挂载硬盘并不能解决我的问题
  • vue指令

    目录 一 vue 的指令 1 v text 2 v html 3 v show 4 v if v esle if v else xff08 1 xff09 v if xff08 2 xff09 v if 与 v show 5 v for x
  • C# switch语句

    一 C switch语句 if语句每次判断只能实现两种选择 xff0c 而switch语句每次判断可以实现多种选择 基本语法格式如下 xff1a switch controlling expression case constant exp
  • python pyinstaller打包教程(pycharm)

    PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具 xff0c 支持 Windows Linux MacOS三大主流平台 xff0c 能够把 Python 脚本及其所在的 Python 解释器打包成可执

随机推荐

  • Windows11更新后打不开Edge浏览器解决办法

    前几天吐槽win11更新版本后打不开Microsoft Edge浏览器了 xff0c 特别影响我使用 xff0c 然后找网上方法 xff0c 大多让去设置里 修复 xff0c 就这样 xff0c 然而没什么卵用 xff0c 这应该是win1
  • Ubuntu16.04下联想R720的无线网卡开启问题及信号不稳定

    问题一 1 1 问题描述 笔记本型号 xff1a Lenovo r720笔记本 xff08 i5 7300hq xff0c gtx1060 maxq 6g xff09 xff0c 默认装入Win10系统 xff0c 然而当装入Ubuntu1
  • 【Anaconda 故障排除】之 EnvironmentNotWritableError

    目录 前言1 Anaconda Prompt 报错2 IPython 报错3 管理员身份运行 Anaconda Powershell Prompt4 其他方法总结 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 刚刚卸
  • 与WPF相关的几本不错的书籍

    其实现在说这个话题有点过时 xff0c 因为WPF问世也已经有很长一段时间了 但是最近自己在读 WPF揭秘 xff0c 因此就对 现在 可以找到的资料做了些查询 之所以说是 现在 xff0c 是因为半年多前 xff0c 我就得到了一些有关W
  • docker入门之一centos7系统+docker安装

    一 安装centos 7 1 下载rufus 3 3制作U盘系统启动盘 2 加载U盘启动后 xff0c 默认选择的是第二项 xff0c 这里我们需要按 键 xff0c 将选项调到第一项Install CentOS7 再按enter键 3 语
  • Docker入门之二Docker原理、常用命令

    一 底层原理 Docker是什么工作的 xff1f Docker是一个 Client Server 结构的系统 xff0c Docker的守护进程运行在主机上 通过 Socket 从客户端访问 xff01 Dockerserver接收到 D
  • Docker入门之三容器命令

    一 容器命令 说明 xff1a 有了镜像才能创建容器 xff0c 首先下载一个centos镜像测试 1 下载镜像 docker pull centos 2 新建容器并启动 docker run docker run span class t
  • 【stm32f103】认识GPIO

    认识GPIO 什么是GPIOGPIO基本结构保护二极管输出模式推挽输出开漏输出 输出数据寄存器 xff08 参考手册8 2 xff09 GPIOx ODRGPIOx BSRR 输入模式 GPIO工作模式输入模式 xff08 模拟 浮空 上拉
  • 【ubuntu】Windows10远程桌面连接ubuntu20.04【未完待续】【由于特别卡顿,不好用,不续了】

    先上结果 环境 硬件 xff1a Jetson Xavier NX 套件 系统 xff1a Ubuntu 20 04 43 Windows10 软件 xff1a Xorg xrdp xubuntu desktop 解决 0 问题 使用Jet
  • 5G的介绍与个人理解

    1 5G概念 移动通讯自20世纪80年代诞生以来 xff0c 经过了三十多年的爆发式增长 xff0c 已经成为连接人类社会的基础信息网络 随着4G进入规模商用阶段 xff0c 面向2020年及未来的第五代移动通讯 xff0c 已成为全球研发
  • Linux系统安装详解

    前言 xff1a 随着开源软件在世界范围内影响力日益增强 xff0c Linux服务操作系统在整个服务器操作系统市场格局中占据很大的市场份额 xff0c 已经形成大规模市场应用局面 xff0c 尤其在政府 金融 农业 交通 电信等国家关键领
  • Tomcat 服务器的部署

    前言 目录 前言 一 Tomcat介绍 二 Tomcat组件 三 Tomcat部署步骤 Tomcat各目录 四 Tomcat 优化 Tomcat服务器是一个免费的开放源代码的Web应用服务器 xff0c 属于轻量级应用服务器 xff0c 在
  • mysql数据库管理

    目录 一 数据库结构 二 常用的数据类型 三 查看数据库结构 1 查看当前服务器中的数据库 2 查看数据库中包含的表 3 查看表的结构 xff08 字段 xff09 四 SQL语句 xff08 一 xff09 DDL xff08 数据定义语
  • redis实战主从复制和搭建哨兵

    目录 前言 1 搭建主从复制 1 主msater配置 2 从slave配置 3 验证结果 二 搭建哨兵 1 在所有节点修改配置文件 2 启动哨兵 3 模拟故障 三 总结 前言 接着上回这次带来的实战主从复制和搭建哨兵 1 搭建主从复制 环境
  • ELK日志分析系统

    目录 一 ELK日志分析系统简介 1 日志服务器的优缺点 2 ELK是什么 xff1f 2 1 Logstash管理包含四种工具 2 2 日志处理步骤 二 Elasticsearch的基础核心概念 三 Logstash介绍 四 Kibana
  • Docker网络和数据卷

    目录 一 Docker 网络模式 1 docker容器的虚拟网关 2 Docker的网络模式 3 Docker自定义网络 二 Docker数据卷 1 数据卷 2 数据卷容器 3 容器互联 使用centos镜像 一 Docker 网络模式 1
  • C++ string的格式化

    lt sstream gt 库定义了三种类 xff1a istringstream ostringstream和stringstream xff0c 分别用来进行流的输入 输出和输入输出操作 可以利用它实现输入输出的格式化 xff0c 下面
  • nginx日志格式分析

    先随便截取一个nginx标准日志 xff1a 62 173 145 171 12 Jan 2020 17 23 54 43 0800 34 GET vvx 000000000000 cfg HTTP 1 1 34 404 169 34 34
  • Mybatis如何实现分页

    Mybatis如何实现分页 关键字limit实现分页 Interceptor Plugin实现分页 首先定一个拦截器 拦截器会拦截所有以ByPage结尾的方法 xff0c 然后拼接sql 语句的limit关键字实现分页 span class
  • 万用表蜂鸣档使用

    学习笔记 电路调试 万用表的使用 今天焊接 调试学校的51开发学习板 xff0c 真是个血汗的泪程 xff0c 不过知道一些东西 xff0c 现在分享出来 蜂鸣档 大宝贝 此位 xff0c 表示此时红黑表笔所接电路断路 xff08 个人理解