MyBatis进阶之分页和延迟加载

在这里插入图片描述

文章目录

  • 分页
    • 1. RowBounds 分页
    • 2. PageHelper 分页
    • 3. PageInfo 对象属性描述
  • 延迟加载
    • 立即加载
    • 激进式延迟加载
    • 真-延迟加载

分页

Mybatis 中实现分页功能有 3 种途径:

  • RowBounds 分页(不建议使用)
  • Example 分页(简单情况可用)
  • PageHelper 分页(推荐 )

1. RowBounds 分页

MyBatis 本身通过 RowBounds 对象提供了分页功能,你仅需为你的 dao 的查询方法多添加 RowBounds 类型的一个参数,并且不需要对配置文件做任何调整。

RowBounds 也称原生分页、逻辑分页。
RowBounds bounds = new RowBounds(0, 4);
List<Employee> list = dao.select(bounds);

但是这种分页是一种 逻辑分页,MyBatis 并未使用 limit 子句,查询的仍是 所有数据,只是它仅给你「看」到了所有数据中的一部分,逻辑分页虽然完成了分页功能,但是它并未通过分页功能的对性能问题有所提升。

2. PageHelper 分页

PageHelper 是一款被广泛使用的 MyBatis 插件。它通过 Mybatis 的插件机制,巧妙地通过机制,在不需要配置文件(不需要写 limit 子句)的情况下,动态去修改你所执行的 SQL,在其后动态添加 limit 子句。

为了使用 PageHelper 需要引入相应的包:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.8</version>
</dependency>

PageHelper 是一款 MyBaits 插件,使用它需要向 Mybatis 注册 PageHelper,并对它作出相关配置(mybatis-config.xml)。

<plugins><!-- com.github.pagehelper 为 PageHelper 类所在包名 --><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --><property name="helperDialect" value="mysql" /><property name="..." value="..."/></plugin>
</plugins>

警告
pagehelper 有 4.x 和 5.x 两个版本,用法有所不同,并不是向下兼容,同样的配置在使用 4.x 或 5.x 版本中可能会报错。例如,上面的 helperDialect 就是 5.x 中的配置,在 4.x 中使用的是 dialect

如果 Mybatis 整合进了 Spring,除了上述这样配置外,还可以将相应的注册-配置工作就在 Spring 的配置文件中进行:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property .../><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置参数,一行配置一个 --><value>param1=value1param2=value2...</value></property></bean></array></property>
</bean>

插件的属性配置

  • helperDialect

    用于指明底层数据库类型:oracle, mysql, mariadb, sqlite, hsqldb, postgresql, db2, sqlserver, informix, h2, sqlserver2012, derby

  • reasonable

    是否启用『合理化』功能

    启用(true)时,如果 pageNum < 1,会返回第一页内容;如果 pageNum > pages,会返回查询最后一页。

    禁用(false)时,超出合理的范围会直接返回空数据。

在使用 PageHelper 时,PageHelper 提供了 2 种风格来描述分页:

  • pageNum / pageSize 组合

插件作者建议推荐方式

PageHelper.startPage(1, 10);

这种风格实际上是在模拟「人的语气」。

  • offset / limit 组合
PageHelper.offsetPage(0, 3);

很显然,这种风格就是 SQL 语句的分页写法

在你调用查询方法之前,调用 PageHelper 的上述两个方法中的任意一个,都可激活 PageHelper 插件的分页功能,使其动态地『帮』你修改SQL语句(添加 limit 子句)。而 Mybatis 的 select 返回的结果就返回的是一页数据。

PageHelper.startPage(4, 2);
List<Employee> list = empDao.selectByExample(null);
PageInfo<Employee> info = new PageInfo<>(list, 5);System.out.println(info);

注意
由于 PageHelper 插件的实现涉及到 ThreadLocal 原理,这导致一旦 PageHelper 生产了一个分页参数(一个内部使用的 Page 对象),但是没有被消费,这个参数就会一直保留在这个线程的 ThreadLocal 中。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。所以,分页参数的创建代码,和查询方法的调用代码,必须「紧密的在一起」。

PageHelper 插件流行的原因在于,它不仅仅能实现分页功能,而且还进一步封装了页面上的『分页导航条』所需要的所有相关信息。

在使用 PageHelper 的过程中,我们已经提供了 4 个关键数据:

PageHelper.startPage(4, 2); // 当前页的页号, 每页显示的数据量
...
PageInfo<Employee> info = new PageInfo<>(list, 5); // 查询结果, 导航栏上导航数字的个数

在创建了 PageInfo 之后便可以使用它:

// << < 2 3 [4] 5 6 > >>log.info("是否有下一页:{}", pageInfo.isHasNextPage());
log.info("是否有上一页:{}", pageInfo.isHasPreviousPage());
log.info("导航栏上第一个页号:{}", pageInfo.getNavigateFirstPage());
log.info("导航栏上最后一个页号:{}", pageInfo.getNavigateLastPage());
log.info("导航栏上的五个导航数字:{}", Arrays.toString(pageInfo.getNavigatepageNums()));
log.info("共有 {} 页", pageInfo.getPages());
log.info("{} / {} ", pageInfo.getPageNum(), pageInfo.getPages());
log.info("共有 {} 条数据", info.getTotal());

3. PageInfo 对象属性描述

属性说明举例
int pageNum当前页比如,当前为第 5
int pageSize每页的数量比如,每页(计划/预期)显示 10 条数据
int size当前页的数量比如,以 98 条总数据为例,每页最多显示 10 条(最后一页显示 8 条数据)
int startRow当前页面第一个元素在数据库中的行号比如,以 98 条总数据的最后一页为例,第一条数据是第 91
int endRow当前页面最后一个元素在数据库中的行号比如,以 98 条总数据的最后一页为例,最后一条数据是第 98
int pages总页数比如,以 98 条总数据为例,每页显示 10 条(其中最后一页 8 条),因此共 10
int prePage前一页比如,当前是第 5 页,所以前一页为 4
int nextPage下一页比如,当前是第 5 页,所以下一页为 6
boolean isFirstPage是否为第一页比如,当前是第 5 页,不是第 1 页,所以为 false
boolean isLastPage是否为最后一页比如,当前是第 5 页,不是最后 1 页,所以为 false
boolean hasPreviousPage是否有前一页比如,当前是第 5 页,有前一页,所以为 true
boolean hasNextPage是否有下一页比如,当前是第 5 页,有后一页,所以为 true
int navigatePages导航页码数比如,页面导航栏显示 [3 4 5 6 7] 共 5 个数字
int[] navigatepageNums所有导航页号比如,页面导航栏显示 [3 4 5 6 7] 这 5 个数字
int navigateFirstPage导航条上的第一页比如,页面导航栏显示 [3 4 5 6 7] 时,第一页是第 3
int navigateLastPage导航条上的最后一页比如,页面导航栏显示 [3 4 5 6 7] 时,第一页是第 7

延迟加载

如果一个对象关联另一个对象,那么在查询 A 对象的时候,会去关联查询 B 对象。

何时查询(加载)B 对象分为三种时机:

  • 立即加载
  • 激进式延迟加载
  • 延迟加载

立即加载

MyBaits 默认是立即加载,即在查询 A 对象的时候,会立即查询其关联的 B 对象。如果,B 对象也有关联对象,例如 C 对象,那么还会立即查询 C 对象,… 因此类推,直到把所有有关联关系的数据全部查询出来。

激进式延迟加载

通过设置,可以启用延迟加载:

<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>

启用延迟加载之后,Mybatis 又是默认的激进地延迟加载。

Mybatis 内部会进行某种规则判断,从而使得激进式的延迟加载,有时候等同于立即加载,有时候等同于普通的延迟加载。

真-延迟加载

可以再通过配置关闭掉激进地延迟加载,从而进入普通的延迟加载:

<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>

普通的延迟加载只会在你真正用到 A 对象的 B 属性时,再去查询/加载 B 对象。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

018 OpenCV 人脸检测

目录 一、环境 二、分类器原理 2.1、概述 2.2、工作原理 三、人脸检测代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、分类器原理 CascadeClassifier是OpenCV&#xff08;开源计算机视觉库&#xff09;中的一个强大的类…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

销售技巧培训之如何提升导购员销售技巧

销售技巧培训之如何提升导购员销售技巧 导购员是门店的重要组成部分&#xff0c;他们的销售技巧直接影响到商店的业绩。因此&#xff0c;提升导购员的销售技巧是商店管理的重要任务。 一、建立良好的沟通 良好的沟通是导购员成功的关键。导购员需要与顾客建立良好的关系&…

归并排序与自然归并排序

归并排序 归并排序(merge - sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,成为二路归并. 核心步骤讲解 归并排序的…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选Compare选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

企业微信应用模板消息

是在发送应用消息接口的基础上&#xff0c;第三方应用支持一种新的消息类型&#xff1a;模板消息&#xff0c;msgtype指定为template_msg。模板消息是一种固定格式的消息。 注意 - 此消息类型目前仅第三方应用支持&#xff0c;自建应用不支持。服务商需在管理端申请模版。接口…

吉祥物IP怎么结合动捕设备应用在线下活动?

一个好的吉祥物IP&#xff0c;不仅可以为品牌带来传播效果和形象具体化的价值&#xff0c;还可以带来一系列的商业利益。 当吉祥物IP接入惯性动作捕捉系统&#xff0c;即可由真人幕后穿戴动捕设备进行实时驱动&#xff0c;可以通过虚拟数字人直播、数字人短视频、数字人线下活动…

2024 年勒索软件:预期影响、目标和格局变化

随着勒索软件持续增加&#xff0c;我们可以预期这些组织 将继续改进其攻击方式并进行更大规模的操作以获取更大的利润。 如果组织不采取更积极的安全策略&#xff0c;就会面临更高的风险。 以下是我们预计 2024 年勒索软件的情况。 2024 年&#xff0c;我们将看到更多大规模…

JavaScript <关于逆向RSA非对称加密算法的案例(附原代码)>--案例(五)

前言: 趁热打铁,标记一下RSA的算法逆向...第二篇会有详解(本篇重在过程) 正文: 废话不说,直接分析步骤图: 到了这里,可以看到在登录的时候,需要验证码(本篇不教反验证码) 下面是正题--->逆他的pwd(密码) 总结: 问题:怎么确定一个密文数据是基于什么算法做出来的呢? 答:…

Android笔记(十七):PendingIntent简介

PendingIntent翻译成中文为“待定意图”&#xff0c;这个翻译很好地表示了它的涵义。PendingIntent描述了封装Intent意图以及该意图要执行的目标操作。PendingIntent封装Intent的目标行为的执行是必须满足一定条件&#xff0c;只有条件满足&#xff0c;才会触发意图的目标操作。…

OpenAI承认ChatGPT变懒惰,正在修复该问题

OpenAI旗下的官方ChatGPT账号在社交平台表示&#xff0c;已经收到了大量用户关于GPT-4变懒惰的反馈。 这是因为自11月11日以来&#xff0c;OpenAI就没有更新过该模型。当然这不是故意的&#xff0c;大模型的行为是不可预测的&#xff0c;正在研究修复该问题。 外界猜测&#x…

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一&#xff1a;在虚拟机服务中查看验证3.1 方法二&#xff1a;在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏&#xff0c;专门更新 Azure 云实践相关的文章。 …

Spring AOP从入门到精通

目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核&#xff0c;比如1*1的卷积核&#xff0c;3*3的卷积核&#xff0c;本文将讲解1*1的卷积核的使用&#xff0c;它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口&#xff0c;那么1*1的卷积核就失去了卷积层可以识…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包&#xff0c;下载的源码&#xff0c;需要编译安装 unzip解压 cd mjpg-streamer/mjp…

【lesson3】数据库表的操作

文章目录 创建修改修改表名增加表类型修改表的某一类型的类型修改表某一类型的类型名 删除删除表的某一列删除表 查看查看表信息查看表内容 创建 建表指令&#xff1a; 查看是否建表成功&#xff1a; 查看表的具体信息&#xff1a; 修改 修改表名 法一&#xff1a;修改…

【Spring教程25】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例总结与SpringMVC工作流程分析

目录 1.入门案例总结2. 入门案例工作流程分析2.1 启动服务器初始化过程2.2 单次请求过程 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Mave…

分层网络模型(OSI、TCP/IP)及对应的网络协议

OSI七层网络模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连参考模型&#xff0c; 一般都叫OSI参考模型&#xff0c;是ISO组织于1985年研究的网络互连模型。OSI是分层的体系结构&#xff0c;每一层是一个模块&#xff0c;用于完成某种功…