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.mzph.cn/news/213250.shtml

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

相关文章

关于对向量检索研究的一些学习资料整理

官方学习资料 主要是的学习资料是&#xff0c; 官方文档 和官方博客。相关文章还是挺多 挺不错的 他们更新也比较及时。有最新的东西 都会更新出来。es scdn官方博客 这里简单列一些&#xff0c;还有一些其他的&#xff0c;大家自己感兴趣去看。 什么是向量数据库 Elasticse…

文件加密软件哪个最好用 好用的文件加密软件推荐

一说到文件加密软件&#xff0c;可能大家都会去搜一些不知名的软件来&#xff0c;但是选择这种加密软件&#xff0c;最好还是要看一些资质的。 资质不好的&#xff0c;可能加密过后你自己也打不开文件&#xff0c;&#xff08;ps&#xff1a;我自己就遇到过这种情况&#xff09…

基于Java SSM框架高校校园点餐订餐系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架高校校园点餐订餐系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

Oracle(2-14)User-Managed Incomplete Recovery

文章目录 一、基础知识1、Incomplete Recovery Overview 不完全恢复概述2、Situations Requiring IR 需要不完全恢复的情况3、Types of IR 不完全恢复的类型4、IR Guidelines 不完全恢复指南5、User-Managed Procedures 用户管理程序6、RECOVER Command Overview 恢复命令概述7…

Python数据科学视频讲解:Python注释

2.3 Python注释 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用和…

20231210原始编译NanoPC-T4(RK3399)开发板的Android10的SDK

20231210原始编译NanoPC-T4(RK3399)开发板的Android10的SDK 2023/12/10 17:27 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ mkdir nanopc-t4 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ cd nanopc-t4/ …

【AIE】AIE微信合集

AIE微信合集 AIE(1) 对于Versal&#xff0c;我们从系统角度看&#xff0c;可将其分为3个Domain&#xff1a;AIE、PS和PL&#xff0c;如下图所示。如果要运行一个AIE的应用&#xff0c;绝大多数情况下&#xff0c;这3个Domain我们都会用到&#xff0c;使其协同工作。这里我们仅…

《绝地求生》新手怎么玩 游戏基本介绍

随着电竞热潮的兴起&#xff0c;《绝地求生》已经成为了一款备受玩家热爱的游戏。这款游戏在全球范围内拥有庞大的玩家群体&#xff0c;它将你置身于一个荒无人烟的岛屿上&#xff0c;与其他99名玩家展开生死竞争。作为一个新手&#xff0c;下面闲游盒小盒子就为大家详细介绍一…

写实3D游戏模型纹理贴图设置

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xff1a; …

Mybatis源码解析5:Mapper执行流程1

Mybatis源码解析5&#xff1a;Mapper执行流程1 1.项目结构2. 源码分析2.1 Mapper代理 MapperProxy#invoke2.2 创建MapperMethod2.2.1 方法名称解析器ParamNameResolve2.2.2 MapperMethod#execute 2.3 DefaultSqlSession2.4 CachingExecutor2.5 SimpleExecutor#doQuery获取连接对…

Nacos源码解读09——配置中心配置信息创建修改怎么处理的

存储配置 从整体上Nacos服务端的配置存储分为三层&#xff1a; 内存&#xff1a;Nacos每个节点都在内存里缓存了配置&#xff0c;但是只包含配置的md5&#xff08;缓存配置文件太多了&#xff09;&#xff0c;所以内存级别的配置只能用于比较配置是否发生了变更&#xff0c;只用…

进行生成简单数字图片

1.之前只能做一些图像预测,我有个大胆的想法,如果神经网络正向就是预测图片的类别,如果我只有一个类别那就可以进行生成图片,专业术语叫做gan对抗网络 2.训练代码 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transfo…

盛域宏数合伙人张天:AI时代,数字化要以AI重构

大数据产业创新服务媒体 ——聚焦数据 改变商业 在这个飞速发展的科技时代&#xff0c;数字化已经深刻地改变了我们的生活和商业方式。信息技术的迅猛发展使得数据成为现代社会最宝贵的资源之一。数字化已经不再是可选项&#xff0c;而是企业持续发展的必由之路。背靠着数据的…

【React】路由的基础使用

react-router-dom6的基础使用 1、安装依赖 npm i react-router-dom默认安装最新版本的 2、在src/router/index.js import { createBrowserRouter } from "react-router-dom"/* createBrowserRouter&#xff1a;[/home]--h5路由createHashRouter&#xff1a;[/#/ho…

Linux访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建NFS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 1.1 访问NFS存储 前面那篇介绍了本地存储&#xff0c;本章就来介绍如何使用网络上上的存储设备。NFS即网络文件系统&#xff0c;所实现的是Linux和Linux之…

通信:mqtt学习网址

看这个网址&#xff1a;讲的很详细&#xff0c;后面补实战例子 第一章 - MQTT介绍 MQTT协议中文版 (gitbooks.io)https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

【论文极速读】LVM,视觉大模型的GPT时刻?

【论文极速读】LVM&#xff0c;视觉大模型的GPT时刻&#xff1f; FesianXu 20231210 at Baidu Search Team 前言 这一周&#xff0c;LVM在arxiv上刚挂出不久&#xff0c;就被众多自媒体宣传为『视觉大模型的GPT时刻』&#xff0c;笔者抱着强烈的好奇心&#xff0c;在繁忙工作之…

m.2固态硬盘怎么选择?

一、什么是固态硬盘 固态硬盘又称SSD&#xff0c;是Solid State Drive的简称&#xff0c;由于采用了闪存技术&#xff0c;其处理速度远远超过传统的机械硬盘&#xff0c;这主要是因为固态硬盘的数据以电子的方式存储在闪存芯片中&#xff0c;不需要像机械硬盘那样通过磁头读写磁…

【CiteSpace】引文可视化分析软件CiteSpace下载与安装

CiteSpace 译“引文空间”&#xff0c;是一款着眼于分析科学分析中蕴含的潜在知识&#xff0c;是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况&#xff0c;因此也将通过此类方法分析得到的可…

【Spring教程23】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC简介与SpringMVC概述

目录 1&#xff0c;SpringMVC简介2、SpringMVC概述 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&…