Mybatis(十)级联映射与懒加载

news2024/7/6 18:25:54

一、Mybatis的级联映射

使用Mybatis的级联映射,我们可以轻松的实现一对一、一对多或者多对多关联查询,甚至可以利用级联映射实现懒加载。

所谓的懒加载,就是我们在一个实体对象中关联了其他对象,如果不需要获取被关联的对象,则不会对被关联的实体执行额外的查询操作,仅在使用get方法获取被关联对象时才会执行该对象的查询操作。通过这种方式可以一定程度上减轻数据库的压力。

下面我们先讲讲级联映射的应用:

1、准备工作

 

 

 2、一对多关联映射

  

3、一对一关联映射

 

4、Discriminator

 

 二、懒加载机制

 

 分步查询的类型才能使用懒加载,而join方式则用不了。assication、collection具备延迟加载功能

 三、Mybatis级联映射实现原理

1、ResultMap详解

ResultMap是实现级联映射和懒加载的基础,所以在介绍源码前,先对ResultMap进行了解。

 

ResultMap的解析流程:

mybatis启动时,会将所有配置信息转化为java对象,通过<resultMap>标签配置的信息也一样,Mybatis通过ResultMap类描述<resultMap>标签的配置信息,ResultMap类的所有属性如下:

 

知道ResultMap类各属性的作用后,我们来了解一下<resultMap>标签解析生成ResultMap对象的过程:

前面我们说过,Mybatis配置信息的解析是通过XMLMapperBuilder类完成的, 该类提供了一个parse方法,该方法会解析Mapper中的所有配置信息,代码如下:

 进行configurationElement方法:

进入ResultMapElements方法:

 如上面所示,首先会先获取<resultMap>标签的所有属性信息,然后对<constructor>、<discriminator>子标签进行解析,然后创建一个ResultMapResolver对象,调用该对象的resolve方法放回一个ResultMap对象,resolve方法的代码如下:

该代码中就是调用了MapperBuilderAssistant对象的addResultMap方法进行创建了ResultMap对象,并把ResultMap对象添加到Configuration对象中,addResultMap方法的代码如下:

该方法中先判断ResultMap是否继承了其他ResultMap对象,如果是,则将父RessultMap的构造映射信息去掉并将父ResultMap中配置的映射信息添加到子ResultMap对象中,最后通过建造者模式创建ResultMap对象。在ResultMap.Builder类中创建一个ResultMap对象,然后为ResultMap对象得的所以属性赋值。

2、级联映射实现原理

之前介绍Mybatis的核心组件的时候提过,StatementHandler组件与数据库完成交互后,会使用ResultHandler组件对结果集进行处理,我们以PreparedStatementHandler类的query方法来看看这个过程:

 ResultSetHandler接口只有一个默认的实现,即DefaultResultSetHandler类,该类中handleResultSets方法实现如下:

 

 

 

 

 

 

 

四、懒加载实现原理

 

 

 

 

 

 

 

 

 

aaaaa

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

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

相关文章

什么样的测试才是优秀的测试

什么样的测试才是优秀的测试 优秀的测试应该包括以下要素&#xff1a; 测试代码的可读性和可维护性 代码在项目中及特定源代码中的组织方式 测试所检查的内容 测试的可靠性及可重复性 测试对测试替身的使用 可读的代码才是可维护的代码 代码较差的可读性与缺陷密度密切相…

GB 35114-2017 学习笔记

GB 35114-2017 学习笔记 第四章 公共安全视频监控联网信息安全系统互联结构 公共安全视频监控信息安全系统 公共安全视频监控信息安全系统由四部分组成&#xff1a; 具有安全功能的前端设备 FDWSF(安全前端设备:Front-end Device With Safety Function)具有安全功能的用户终…

Ubuntu18.04环境下安装igH EtherCAT Master

一、安装步骤 下载安装包 EtherCAT安装包&#xff1a;igH EtherCAT安装包&#xff08;目前最新的稳定版&#xff09; 安装依赖包 sudo apt install autoconf automake libtool net-tools解压EtherCAT安装包&#xff0c;进入解压出的文件夹&#xff0c;右键打开终端输入 ./b…

Spring IoC容器、IoC与DI

目录 Spring是什么&#xff1f; 理解容器 什么是IoC(Inversion of Control) 传统的new创建对象的方式中类与类的耦合程度很大。 IoC的优势&#xff1a; Spring IoC容器最核心的功能 什么是DI (Dependency Injection) IoC和DI的区别 Spring是什么&#xff1f; Spr…

145. 二叉树的后序遍历【34】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 102. 二叉树的层序遍历【206】 力扣此题地址&#xff1a; 145. 二叉树的后序遍历 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;145. 二叉树的后序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 后…

Django DRF - JWT Token认证使用

JWT Token认证使用 jwt官网&#xff1a;https://jwt.io/ 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。我们不再使用Session认证机制&#xff0c;而使用Json Web Token认证机制。 一. JWT概念 Json web token (JWT),…

JavaScript—javaEE

文章目录 1.关于JavaScript2.引入的方式3.输入输出4.语法4.1变量4.2基本数据类型4.3运算符4.4数组4.5函数4.6对象 5.dom5.1获取元素5.2操作元素5.3表单控件5.4样式&#xff1a;style属性5.5模仿和服务端交互 6.ajax6.1概念6.2作用6.3Ajax代码6.4Ajax发get请求6.5Ajax发post请求…

【文件系统和系统日志分析】

目录 一、inode和block概述block&#xff08;块&#xff09;inode&#xff08;索引节点&#xff09; 二、inode内容三、inode的号码3.1、查看inode号码的方法 四、inode的大小磁盘分区后的结构访问文件的简单流程 五、删除乱码文件六、inode节点耗尽故障处理6.1、模拟inode节点…

【Tomcat】Tomcat的安装配置和在Idea中使用Tomcat:

文章目录 一、获取安装包二、配置环境三、验证是否配置成功【法一】通过运行tomcat文件夹下的bin文件夹中的 startup.bat【法二】快捷键【winr】&#xff0c;输入【cmd】&#xff0c;点击【确定】&#xff0c;输入 startup.bat 四、出现乱码和端口号被占用的解决方案【1】出现乱…

Spring概述,IOC,AOP使用

Spring简介 Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台&#xff0c;它最…

OpenStack 面板更替换代:Skyline Dashboard <-- Horizon 面板

~、OpenStack 面板更替换代&#xff1a;Skyline Dashboard <-- Horizon 面板 先决条件 一个至少运行核心组件的 OpenStack 环境, 并能通过 Keystone endpoint 访问 OpenStack 组件 一个安装有容器引擎的 (docker 或 podman) 的 Linux 服务器 一、 &#xff08;一&…

用starter实现api接口的加密与日志功能

一、概述 运用AOP技术实现对api接口的加密及日志功能。 加密&#xff1a; 需要加密的api接口上加注解&#xff1a;Encrypt&#xff08;自定义注解&#xff09;接口返回类型为String时才加密采用对称加密&#xff1a;加密和解密使用相同的密钥 日志&#xff1a; 对所有的api接…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频&#xff0c;如下图所…

实现服务器版本的表白墙

目录 初始前端代码 网页初始效果 一、确定接口 二、编写代码 2.1 创建项目七步走 1、创建Maven项目 2、引入依赖 3、构建目录 4、编写代码 5、打包、部署 ​编辑 7、验证代码 三、具体的代码逻辑 3.1 服务器——两个服务接口 3.2 前端页面的代码 3.2.1 前端存档…

Springcloud快速复习

按照个人的习性,分布式我学习完以后一定会忘为此写次笔记自己快速复习 目录 Springcloud介绍注册中心 Springcloud介绍及微服务介绍 为什么学? 也不是以前的单体架构被淘汰而是,当业务足够大型,进行优化 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff…

SystemUI流程

目录 SystemUI类图 SystemUI流程一&#xff1a;SystemUI启动流程 SystemUI流程二&#xff1a;StatusBar创建流程 SystemUI流程三&#xff1a;系统Notification实现流程 源码基于 Android 12。 SystemUI 是 Android 的系统界面&#xff0c;在 Andorid 系统源码中&#xff0c;…

MySQL安装文档

一、下载 点开下面的链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0gE9C3W-1682005377951)(assets/image-20221020012428839.png)]…

5. VBA消息框(MsgBox)

MsgBox函数显示一个消息框&#xff0c;并等待用户点击一个按钮&#xff0c;然后根据用户点击的按钮执行相关的操作。 5.1 语法 MsgBox(prompt[,buttons][,title][,helpfile,context]) 5.2 参数说明 prompt - 必需的参数。在对话框中显示为消息的字符串。提示的最大长度大约为…

腾讯云4核8G服务器CVM S5和轻量应用服务器性能PK来了

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

ERROR [io.undertow.request] UT005023: Exception handling request 报错处理

1.背景 找了好久&#xff0c;突然灵光乍现是不是因为容器错误问题&#xff0c;本来就是刚从github上下载下来的项目&#xff0c;怎么别人不报错就我报错嘞&#xff0c;我还什么都没改怎么能这样&#xff01;&#xff01;&#xff01;&#xff01; 这就是我的报错&#xff0c;乍…