Mybatis的四种分页方式详解

LIMIT关键字

  1. mapper代码

    select * from tb_user limit #{pageNo}, #{pageSize}
  2. 业务层直接调用

    public List findByPageInfo(PageInfo info) {
    return userMapper.selectByPageInfo(info);
    }

3,优点

灵活性高,可优化空间大
mysql分页语句优化

4,缺点

实现复杂。

RowBounds实现分页

Mybatis提供RowBounds类来实现逻辑分页。RowBounds中有2个字段offset和limit。这种方式获取所有的ResultSet,从ResultSet中的offset位置开始获取limit个记录。但这并不意味着JDBC驱动器会将所有的ResultSet存放在内存,实际上只加载小部分数据到内存,如果需要,再加载部分数据到内存。

  1. mapper代码

    select * from user
  2. dao代码

    List<User> selectPage(RowBounds rowBounds);
    
  3. 分页查询

       List<User> users = userMapper.selectPage(new RowBounds(5, 10));log.info("users:{}",users);
    

查询结果:

users:[User(id=6, username=柳云璇, grade=小三(5)班, age=25, phone=17358053274, sex=女), User(id=7, username=酆雨寒, grade=高一(5)班, age=19, phone=15394214112, sex=女), User(id=8, username=郑春阳, grade=小三(7)班, age=24, phone=15004202411, sex=男)]
  1. 优点

使用起来比直接limit简单。

5,缺点
DB压力比较大,因为将结果暂存在db了。

Interceptor实现

  1. 自定义Interceptor

    @Intercepts({@Signature(type = StatementHandler.class, method = “prepare”, args = {Connection.class, Integer.class})})
    public class DefinedPageInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {//获取StatementHandler,默认的是RoutingStatementHandlerStatementHandler statementHandler = (StatementHandler) invocation.getTarget();//获取StatementHandler的包装类MetaObject metaObject = SystemMetaObject.forObject(statementHandler);//分隔代理对象while (metaObject.hasGetter("h")) {Object obj = metaObject.getValue("h");metaObject = SystemMetaObject.forObject(obj);}while (metaObject.hasGetter("target")) {Object obj = metaObject.getValue("target");metaObject = SystemMetaObject.forObject(obj);}//获取查看接口映射的相关信息MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");String mapId = mappedStatement.getId();//拦截以ByInterceptor结尾的请求,统一实现分页if (mapId.matches(".+ByInterceptor$")) {System.out.println("LOG:已触发分页拦截器");//获取进行数据库操作时管理参数的HandlerParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");// 分页对象需要自己构建,到时候分页方法中要传入 //获取请求时的参数PageInfo info = (PageInfo) parameterHandler.getParameterObject();//获取原始SQL语句String originalSql = (String) metaObject.getValue("delegate.boundSql.sql");//构建分页功能的SQL语句String sql = originalSql.trim() + " limit " + info.getPageNum() + ", " + info.getPageSize();metaObject.setValue("delegate.boundSql.sql", sql);}//调用原对象方法,进入责任链下一级return invocation.proceed();
    }@Override
    public Object plugin(Object target) {//生成Object对象的动态代理对象return Plugin.wrap(target, this);
    }@Override
    public void setProperties(Properties properties) {//如果分页每页数量是统一的,可以在这里进行统一配置,也就无需再传入PageInfo信息了
    }
    

    }

  2. 添加到mybatis中

    @Bean(“oneSqlSessionFactory”)
    public SqlSessionFactory sqlSessionFactory() {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    try {
    sqlSessionFactoryBean.setMapperLocations(
    // 设置mybatis的xml所在位置
    new PathMatchingResourcePatternResolver().getResources(“classpath*:mapping/one/*Mapper.xml”));
    //设置自定义的插件
    sqlSessionFactoryBean.setPlugins(new DefinedPageInterceptor());
    return sqlSessionFactoryBean.getObject();
    } catch (Exception e) {
    return null;
    }
    }

  3. mapper方法

    /**
    * Interceptor 实现分页,必须以ByInterceptor结构,自定义的Interceptor才能
    * 识别出来,并且必须传入PageInfo
    * @param pageInfo 自定义的分页
    * @return
    */
    List selectPageByInterceptor(PageInfo pageInfo);

xml

  <select id="selectPageByInterceptor" resultType="com.example.demo.mapper.one.User">select * from user</select>
  1. 运行

    /**
    * 自定义PageInterceptor分页
    */
    @Test
    public void test04() {
    PageInfo pageInfo=new PageInfo();
    pageInfo.setPageNum(5);
    pageInfo.setPageSize(5);
    List users = userMapper.selectPageByInterceptor(pageInfo);
    log.info(“users:{}”,users);
    }

拦截更改后的sql。

  1. 运行结果

    users:[User(id=6, username=柳云璇, grade=小三(5)班, age=25, phone=17358053274, sex=女), User(id=7, username=酆雨寒, grade=高一(5)班, age=19, phone=15394214112, sex=女), User(id=8, username=郑春阳, grade=小三(7)班, age=24, phone=15004202411, sex=男)]

PageHelper

PageHelper是一个第三方实现的分页拦截器插件,使用起来灵活且方便。

  1. 添加pom

    com.github.pagehelper pagehelper 最新版本

2,使用方式

//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {List<User> selectByPageNumSize(@Param("user") User user,@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {//其他fields//下面两个参数名和 params 配置的名字一致private Integer pageNum;private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {@Overridepublic void doSelect() {userMapper.selectLike(user);}
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));
  1. 官网

官网:https://pagehelper.github.io/

使用方式:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256288.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis实现分页的几种方式

本文目录 借助数组进行分页借助Sql语句进行分页拦截器分页RowBounds实现分页 借助数组进行分页 原理&#xff1a;进行数据库查询操作时&#xff0c;获取到数据库中所有满足条件的记录&#xff0c;保存在应用的临时数组中&#xff0c;再通过List的subList方法&#xff0c;获取到…

【分布式应用】ELK企业级日志分析系统

一、ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1.1 ELK各组件介绍 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个…

Rust每日一练(Leetday0016) 全排列I\II、旋转图像

目录 46. 全排列 Permutations &#x1f31f;&#x1f31f; 47. 全排列 II Permutations II &#x1f31f;&#x1f31f; 48. 旋转图像 Rotate Image &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专…

win10操作系统官网如何下载ios境像文件安装操作系统

1.打开官网 2.立即下载工具 3.正在准备进行工作 4.接收条款 5.根据需求选择安装合适的位置 6.等待创建成功 7.右键选择装载 8.双击安装setup.exe文件 8 使用微Pe安装过程中发现需要联网更新解决 winR 然后cmd 输入 OOBE\BYPASSNRO 9 或者关闭此进程 电脑不要插网线&#xff…

虚拟机系统iso镜像下载_如何下载正版系统镜像

许多网友想装系统&#xff0c;可是不会装(后期会推装系统的文章)&#xff0c;而且网上的系统有的装有全家桶&#xff0c;有的又有捆绑软件&#xff0c;严重的还有病毒。那么&#xff0c;在哪里去下载正版&#xff0c;安全的系统镜像呢 "MSDN&#xff0c;我告诉你"这个…

自定义IOS系统弹框

写在之前 系统的弹框虽然很好看&#xff0c;但是有时候无法完全满足UI设计的需求&#xff0c;比如说中间要显示一个输入框&#xff0c;或者要放置一张图片&#xff0c;这里介绍一个很早之前的自定义弹框库&#xff0c;这个自定义弹框sdk写的很细致&#xff0c;定制性很强&…

华为vivo小米魅族oppo荣耀安卓手机刷IOS苹果系统

现在的刷机教程层出不穷&#xff0c;但是没有哪个大神可以开发出一款安卓刷IOS的工具&#xff0c;使得安卓手机或者安卓平板变成IOS苹果系统&#xff0c;这个工具除了可以刷安卓手机也可以刷安卓平板&#xff0c;网友实测&#xff0c;如果设备不支持的话软件会提醒不支持&#…

android高仿ios11系统,安卓仿ios11桌面全套文件

安卓手机想要苹果11的桌面的话&#xff0c;安卓仿ios11桌面全套文件app就可以帮您实现哦。安卓仿ios11桌面全套文件app是一款超级优质的手机桌面工具软件&#xff0c;平台上面拥有海量的壁纸资源&#xff0c;大家可以任意选取哦。 应用说明 修改负一屏效果 修改dock栏模糊度 修…

软件配置 | ios系统Clion下载、安装、配置环境

软件配置 软件配置 | ios系统Clion下载、安装、配置环境 软件配置下载、安装gClion 调试参考链接下载、安装调试 本文总结ios系统下Clion下载、安装、配置环境过程和可能碰到的问题。 因为是在私人电脑&#xff08;ios&#xff09;上配置的Clion&#xff0c;我还不太熟悉自己的…

iOS 13.0 至 13.7 平刷系统教程

来自 : 某QQ群分享文件&#xff0c;整理后发布 如侵权告知删除 关于 Succession 平刷插件信息&#xff1a; 插件&#xff1a;Succession 版本&#xff1a;1.4.15 开发者&#xff1a;Samg_is_a_Ninja 系统支持&#xff1a;iOS 10 至 13.7 用途&#xff1a;平刷当前系统 补充&am…

ios添加邮件收件服务器,iOS 系统邮件的基础使用

尽管有好多人的主力邮件是 Gmail,客户端的首选也是 Gmail,但是在国内的互联网环境中不可避免的要使用到本土的一些邮件服务。对于这些轻量级的服务我选择用系统自带的邮件应用进行统一的管理。本文主要讲解在系统自带邮件中,如何使用国内常用的邮件服务:如网易邮箱、QQ 邮箱…

关闭app服务器系统,ios12系统服务哪些关掉

类型&#xff1a;ios系统工具大小&#xff1a;38.7M语言&#xff1a;中文 评分&#xff1a;10.0 标签&#xff1a; 立即下载 ios12更新后&#xff0c;很多服务功能都开启了&#xff0c;是比较费电的&#xff0c;用户可以前往设置进行关闭来省电等&#xff0c;那ios12系统服务哪…

ios android 系统占用空间,iOS 系统占用了 20G 储存空间?别担心,教你快速解决!...

如果你曾经查看过自己 iOS 设备的储存空间使用情况&#xff0c;那么你可能见到过下面这种情形&#xff1a; 你可能发现了&#xff0c;系统所占据的空间太大了&#xff0c;远超过了正常的范围&#xff0c;这是怎么回事呢&#xff1f;下面就为大家解释一下出现这类情形的几种解决…

如何关闭iOS系统自动更新?最新屏蔽升级描述文件下载

新老司机朋友们晚上好&#xff0c;隔壁老王又来和大家见面了&#xff0c;鸽了有一段时间了&#xff0c;非常抱歉~ 众所周知&#xff0c;iOS 系统一直保持着较高的更新频率&#xff0c;但并不是所有用户都喜欢将自己的设备升级到最新版本&#xff0c;尤其是一些旧型号的 iPhone…

如何下载和安装 iOS开发教程

步骤 1: 在App Uploader网站&#xff0c;点击“Windows版本”下载 。 步骤 2: 在弹出框中&#xff0c;点击“下载”。 步骤 3&#xff1a;在弹出框中&#xff0c;点击“文件夹”打开。 步骤:4&#xff1a;右键选择“解压全部文件”。 步骤5&#xff1a;在弹出框中&#xff0c…

ios系统安装包下载_iOS在后台自动升级?一招教你屏蔽iOS更新

苹果产品一直被用户喜爱的最大的特点就是因为iOS系统&#xff0c;iOS系统有着流畅的体验以及完善的生态环境&#xff0c;因此历年新款iPhone都处于畅销状态。但是随着苹果旗下产品发布的越来越多&#xff0c;比如到目前为止苹果已经发布了15款iPhone产品&#xff0c;从最早的第…

ios系统安装包下载_iOS 屏蔽系统升级,描述文件版本已复活,无需越狱,请速度下载!...

沉寂已久的老方法,利用描述文件屏蔽 iOS 系统更新,目前已经正式恢复,再也不担心会自动下载更新包啦。 以往都是安装 tvOS 系列的描述文件,绕过苹果验证更新,从而达到阻止系统升级的目的,但是自 iOS 13 开始,安装 tvOS 12 会提示已过期或者失效。 而在当时,安装 tvOS 13…

如何下载和安装iOS 15公测版【附更新建议】

苹果在WWDC2021开发者大会上正式发布了iOS 15和iPadOS 15系统&#xff0c;推出了许多新功能&#xff0c;例如FaceTime共享、专注模式、实时文本、离线Siri、全新设计的通知等等。iOS 15和iPadOS 15的第一个公开测试版已于6月30日发布。 相信不少果粉已经迫不及待想要升级体验。…

氟化物超标怎么处理

项目基本信息 工艺及产品信息 甲方 / 采用工艺 过滤系统螯合树脂除氟系统 工程公司 / 工艺原理 废水除氟&#xff0c;耐受氯离子、硫酸根等阴离子的干扰 开始时间 2020/11/12 工艺特点 再生周期长 结束时间 2020/11/30 型号 CH-87 项目周期及项目地 15天 江…

lecory 波形二进制文件头(.trc)定义

1.文件头&#xff0c;从0字节开始 byte[] lecroy_trc_header new byte[]{0x23,0x39,0x30,0x30,0x32,0x30,0x30,0x30,0x31,0x34,0x34,0x57,0x41,0x56,0x45,0x44,0x45,0x53,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x45,0x43,0x52,0x4F,0x59,0x5F,0x32,0x5F,0x33,0x…