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…

【华为OD机试python】分苹果【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果, 他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101 = 9), B的计算规则是十进制加法,包括正常进位,…

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

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

(一)Java 基础语法

目录 一. 前言 二. Hello World 三. Java 语法 3.1. 基本语法 3.2. Java 标识符 3.3. Java 修饰符 3.4. Java 变量 3.5. Java 数组 3.6. Java 枚举 3.7. Java 关键字 3.8. Java 注释 3.9. Java 空行 3.10. Java 继承 3.11. Java 接口&#xff08;interface&#…

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…

算法训练营Day8(字符串)

344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public void reverseString(char[] s) {for(int i 0,j s.length-1;i< s.length/2 ; i,j--){swap(s,i,j);}}public void swap(char[] s,int i,int j ){char temp s[i];s[i] s[j]…

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/ …

python4E 之 Dict 找到两个不同索引但都需要对应的值。

找到两个不同索引但都需要&#xff0c;对应的值。 df pd.DataFrame(np.random.randint(1, 10, [3,3]), columns list(ABC)) 通过 dict 制造key index_htable{} for _,row in idc.iterrows(): #按行循环 key str(row[u股票代码]) | str(row[u日期]) #根据不同 的索引…

45.0/HTML 简介(详细版)

目录 45.1 互联网简介 45.2 网页技术与分类 45.3 HTML 简介 45.3.1 什么是 HTML?(面试题) 45.3.2 HTML 文件结构 45.3.3 HTML 语法 45.3.4 实例演练步骤(面试题) 45.4 head 中的常用标签 45.4.1 title 标记 45.4.2 meta 标记 45.4.3 45.4.4 45.4.4(面试题)总结: 45…

【AIE】AIE微信合集

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

linux less命令(less指令)(查看开头、从开头查看、从起始查看、反向导航、反向查找)

文章目录 Linux Less 命令1. Less 命令简介2. 基础用法less filename<command> | less 3. 常用命令行选项4. 高级技巧和用法4.1 搜索内容4.2 标记和跳转4.3 查看多个文件 5. less命令使用文档6. 总结 Linux Less 命令 less 是一种在Linux环境中查看文件内容的工具&#…

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

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

Ubuntu20.04创建并挂在zfs池

Ubuntu 下使用 ZFS [适用于中高级用户] 主磁盘上清洁安装带有ZFS的Ubuntu后&#xff0c;可以开始体验其特性。 所有ZFS配置过程都需要命令行。 我不知道有GUI工具。 创建一个 ZFS 池 本节仅适用于具有多个磁盘的系统。 如果只有一个磁盘&#xff0c;Ubuntu会在安装时自动创建…

写实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…

飞天使-rsync大文件断点续传与vim批量删除

文章目录 rsync 断点续传&#xff0c;亲测有效vim 批量删除消息 rsync 断点续传&#xff0c;亲测有效 rsync -vzrtp -P --append -e "/usr/bin/ssh -p 22 -o StrictHostKeyCheckingno" m.tar.gz root10.0.0.1:/tmp后台运行 screem 既可 或者 nohup rsync -vzrt…