ef关联多实体查询_Mybatis基本知识十二:关联关系查询之延迟加载:侵入式延迟加载...
上一篇文章:《Mybatis基本知识十一:关联关系查询之延迟加载策略:直接加载》
若文中有纰漏,请多多指正!!!
1.前言
延续上一章节,本章节主要讲解和演示在关联关系查询中侵入式延迟加载是怎么回事。
与直接加载(执行主查询后马上执行关联查询)不同,侵入式延迟加载将关联对象作为了主查询对象中的一部分,也就是将关联对象信息作为了主加载对象的基本信息,侵入式延迟加载在执行对主加载对象的select查询时,不会执行对关联对象的查询,但是当要访问主加载的详情(也就是查看主加载对象的任意属性值)时,就会马上执行关联对象的select查询,这是因为关联对象是作为主加载对象的基本信息出现的。如果还不理解,那就看示例演示。
Mybatis根据对关联对象查询的执行时机,可分为三种类型:
- 直接加载:在执行完对主加载对象select查询时,马上执行对关联对象的select查询。
- 侵入式延迟加载:在执行对主加载对象的select查询时,不会执行对关联对象的查询。但在访问主加载对象详情时,才会加载查询关联对象信息。
- 深度延迟加载
特别注意:
a.Mybatis的延迟加载只是对关联对象的查询有延迟设置,对主查询都是直接加载。
b.要想使用延迟加载,关联对象的查询和主加载对象的查询必须是分别进行select查询(也就是多表单独查询),不能使用多表连接的方式进行select查询(即多表连接查询)。这是因为,多表连接查询本质上是一张表(多张表连接形成的一张表),会将多张表的数据信息立即查询出来。
2.侵入式延迟加载
使用表Country(国家)和表Provice(区域)举例说明侵入式延迟加载在关联查询中的应用:一个国家可以有多个区域划分。查询一个国家下辖的区域。
- 1) 数据定义(MySql)
/**国家*/create table Country( id int primary key auto_increment comment '主键', cname varchar(50) comment '名称');INSERT INTO `country` VALUES (1, '北京');INSERT INTO `country` VALUES (2, '天津');/**地区*/create table Provice( id int primary key auto_increment comment "主键", pname varchar(50) comment "名称", cid int comment "Country主键Id");INSERT INTO `provice` VALUES (1, '红桥区', 2);INSERT INTO `provice` VALUES (2, '北辰区', 2);INSERT INTO `provice` VALUES (3, '海淀区', 1);INSERT INTO `provice` VALUES (4, '朝阳区', 1);
- 2) 实体类定义
需要注意如果实体类定义的是双向关联时,即在实体类中都将对方作为域属性出现,那么toStirng()方法定义时要引起高度注意,不要让toString()方法都可以输出对方的信息,避免出现循环递归调用,程序异常。为避免这种情况,我们只让主查询的一方输出关联的信息即可。
/** * 国家 * @author Administrator * @description 一的一方 */public class Country { private Integer id;//主键 private String cname;//名称 private List provices;//省份 //setter and getter and toString}/** * 区域 * @author Administrator * @description 多的一方 */public class Provice { private Integer id; private String pname;//名称 private Integer cid;//Country主键Id //setter and getter and toString}
- 3)接口定义
/** * 一对多查询 */public interface CountryDao { /** * 根据Country主键查询该国家下的所有区域 * 多表单独查询 */ Country findCountryByIdSingle(Integer id);}
- 4)测试定义(部分)
/** * 一对多查询: * 在查询一方对象数据的时候,同时将其关联的多方对象的数据也都关联查询出来。 */@Testpublic void findCountry(){ //1.多表单独查询 Country single = dao.findCountryByIdSingle(1); System.out.println(); System.out.println(single.getCname());//查看主加载属性详情 System.out.println(); System.out.println(single.getProvices().size());//查看关联对象属性详情 System.out.println();}
- 5)mapper配置
要想使用延迟加载,关联对象的查询和主加载对象的查询必须是分别进行select查询(也就是多表单独查询),不能使用多表连接的方式进行select查询(即多表连接查询)。这是因为,多表连接查询本质上是一张表(多张表连接形成的一张表),会将多张表的数据信息立即查询出来。
select * from country where id = #{id} select * from provice where cid = #{id}
- 6)主配置变更
(1).直接加载配置方式:
a.主配置文件不配置lazyLoadingEnabled和aggressiveLazyLoading属性值。
b.主配置文件只配置lazyLoadingEnabled属性值为false。
c.主配置文件配置lazyLoadingEnabled=false及aggressiveLazyLoading=false。
(2.)侵入式延迟加载配置方式:
在配置lazyLoadingEnabled(延迟加载的总开关)=true的同时,配置aggressiveLazyLoading(侵入式延迟加载开关)=true,那么对于关联对象查询就会使用侵入式延迟加载.
- 7)断点调试(直接加载、侵入式延迟加载对比图)
直接加载 :

直接加载测试
侵入式延迟加载:

侵入式延迟加载-执行步骤-1

侵入式延迟加载-执行步骤-2
- 8)关于配置

- 9)代码下载处
链接:https://pan.baidu.com/s/1gZWEk8Zo2CJ2CtgZIrsHjA 提取码:62v3
3.后记
下节讲解:深度延迟加载的配置和示例。
相关文章:

Java高危漏洞被再度利用 可攻击最新版本服务器
2019独角兽企业重金招聘Python工程师标准>>> 安全研究人员警告称,甲骨文在2013年发布的一个关键 Java 漏洞更新是无效的,黑客可以轻松绕过。这使得此Java高危漏洞可以被再度利用,击运行最新版本 Java 的个人计算机及服务器。甲骨文…

不断演进的 Chrome 安全标识
文 / Chrome Security 产品经理 Emily Schechter 此前,我们曾发布一项提议,建议将所有 HTTP 网页标记为确定 “不安全” 并移除 HTTPS 网页的安全标识。自从我们在 Chrome 中引入安全标识以来,网络上的 HTTPS 使用量迅速增加。今年晚些时候&a…

gcc -E 选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码 -E选项,表示让gcc只进行“预处理”就行了。 所谓的预处理,就是…

剑指offer青蛙跳台阶问题
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。//递归方式 public static int f(int n) { //参数合法性验证 if (n < 1) { System.out.println("参数必须大于1!&quo…

mysql 亿级表count_码云社 | 砺锋科技-MySQL的count(*)的优化,获取千万级数据表的总行数 - 用代码改变世界...
专注于Java领域优质技术号,欢迎关注作者:李长念一、前言这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去。找了很多优化方案,最后另辟蹊径,选择了用explain来…

使用mysql内连接查询年龄_Mysql的连表查询
若一个查询同时涉及到两个以上的表,称为连表查询准备表create table department(id int auto_increment PRIMARY KEY,name varchar(20));departmentcreate table employee(id int primary key auto_increment,name varchar(20),sex enum(male,female) not null defa…

FastDFS安装与使用
安装注意要修改:/etc/fdfs/client.confvim /etc/fdfs/client.confbase_path/home/yuqing/fastdfs 修改为: base_path/home/fastdfstracker_server192.168.209.121:22122 修改为: tracker_server10.201.20.237:22122##include http.conf 修改…

angular组合preact
preact 大小3kb,可以当做angular的一个dom库,而且可以对接使用preact生态系统,react组件修改成preact还是蛮简单的,这样就可以解决angular中用render2操作dom的繁琐问题了!O(∩_∩)O哈哈~,异想天开,动工! t…
大型网站系统架构系列:分布式消息队列(二)
四、JMS消息服务 讲消息队列就不得不提JMS 。JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及…
Linux环境编译安装Mysql以及PHP中文乱码解决
mysql安装 5.6以后可能会收费,所以选择5.1以下从台湾中山大学镜像下载1.首先要安装C编译环境 # yum install gcc-c2.下载解压# wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz # tar zxvf mysql-5.1.73.tar.gz # cd mysql-5.1.7…

mysql noinstall_windows mysql noinstall
最近在想做mysql 主,从备份.在一台windows下安装多个mysql server , 发现用安装版的会覆盖前一安装程序,所以就用noinstall版本的mysql server,在此记录下安装过程的步骤.可主,从备份最终没能跑起来........这只是其中方法之一而已windows 下安装mysql-noinstall so easy!!!步骤…

[十九]JavaIO之PipedReader 和 PipedWriter
功能简介还记得PipedInputStream 和 PipedOutputStream么 我们之前是这么说的: 使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用 大致流程: 我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedO…
Linux环境HBase安装与使用
原文出自本人另一个Linux博客 http://blog.csdn.net/unix21/article/details/18776073 Linux环境:CentOS6.5 HBase版本:hbase-0.94.16 HBase官网:http://hbase.apache.org 1.下载解压安装文件 # wget http://mirror.bit.edu.cn/apache/hbase/…

Oracle定时执行存储过程
首先查看SQL> show parameter job NAME TYPE VALUE------------------------------------ ----------- ------------------------------job_queue_processes integer 10如果值是 0 需要修改(如果为…

mysql8.0取消授权_mysql8创建用户、删除用户、授权、取消授权
注意,以下命令均在数据库mysql中操作use mysql;mysql有密码设置规范,这里修改仅密码长度为4位,仅本次登录有效set global validate_password.policy0;set global validate_password.length4;创建用户格式CREATE USER usernamehost IDENTIFIED WITH mysql_native_pas…

Azure编配器简化有状态无服务器工作流的创建
Azure Durable Functions旨在通过引入编排器function概念来定义更复杂的工作流,以此来扩展无服务器计算范式。如果你曾经想过要使用它们,微软刚刚发布了一个示例,帮助开发人员开始他们的无服务器计算和编排器function之旅。\\Azure Functions…
ZooKeeper集群环境安装与配置
原文:出自本人的Linux博客http://blog.csdn.net/unix21/ ZooKeeper版本:3.4.5 约定:3台虚拟机 前提:需要安装JDK,关于Linux环境JDK安装配置参考我的另一帖Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序ZooKe…

thinkphp5 mysql长连接_tp5(thinkPHP5)框架连接数据库的方法示例
本文实例讲述了thinkPHP5框架连接数据库的方法。分享给大家供大家参考,具体如下:1、配置文件目录 tp5applicationdatabase.php通过配置文件来连接。。也可以通过方法链接在控制器里方法链接数据库 ;查询时写法 和使用系统的DB类方法略有差异/…

学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/转载于:https://www.cnblogs.com/pegasus923/p/5304025.html

tomcat的startup.bat闪退问题解决
从官网下载一个免安装的tomcat,我把它解压在E盘,配置了环境变量:CATALINA_HOME、CATALINA_BASE、TOMCAT_HOME 为 tomcat的解压路径 进入解压tomcat的bin目录,执行startup.bat,出现闪退。 然后winR 输入cmd 进入解压tom…
使用Netbeans创建java Web项目
使用Netbeans创建java Web项目需要先搭建JDK参考: Java开发环境的搭建以及使用eclipse创建项目 Linux环境安装卸载JDK1.安装Tomcat 去官网下载最新的Tomcat:http://tomcat.apache.org/ 目前最新的windows环境的Tomcat是 http://mirrors.hus…

Linux内核设计第五周学习总结 分析system_call中断处理过程
陈巧然原创作品 转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000使用gdb跟踪分析一个系统调用中断处理过程,分析系统调用从system_call开始到iret结束之间的整个过程。 实验过程: 登陆实验楼虚拟机http://w…

mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件
database - 如何在MySQL中收缩/清除ibdata1文件我在localhost中使用MySQL作为在R中执行统计的“查询工具”,也就是说,每次运行R脚本时,我创建一个新数据库(A),创建一个新表(B),将数据导入B ,提交查询以获得…

MySQL学习----各种字符的长度总结
数字型 类型大小范围(有符号)范围(无符号)用途TINYINT1 字节(-128,127)(0,255)小整数值SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 字节(-8 388 608,8…
分布式消息队列Kafka集群安装
kafka是LinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目。在它的主页描述kafka为一个高吞吐量的分布式(能将消息分散到不同的节点上)MQ。在这片博文中,作者简单提到了开发kafka而不选择已有MQ系统的原因。两个原…

[na]pc加入域认证细节
这也是以前好奇,因为学生时候,经常机房上网, 对一些譬如.. 现在看来很low了. 是小作坊式的技术, 真正上不了台面的.扛不住生产的压力. ftp共享计算机统一管理等无盘/网克等特别好奇 计算机组织的两种形式 加入办公网络里有200多台pc,如果各个独立的上网互不干扰. 这种也挺方便,…

react 树形菜单_关于React 使用antd组件递归实现左侧菜单导航树(MenusTree)的示例...
一、菜单组件Demo这里本人采用的是蚂蚁金服(antd)组件库里的{Menu}组件写的一个左侧菜单树的小Demo(整套开发环境是ReactReduxwebpack)import React from react;import { Menu, Icon } from antd;import {WeaScroll} from ecCom;import {bindActionCreators} from redux;import…

SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需。SQL数据库有很多,MySQL是一种,…
MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet
1.安装准备 1).下载安装MyEclipse2014,这已经是最新版本。2).下载Tomcat 官网:http://tomcat.apache.org/ 我们选择8.0: http://tomcat.apache.org/download-80.cgi 在windows下选择64位解压版:http://mirror.bit.edu.cn/apache/t…

[转]Linux 的多线程编程的高效开发经验
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别。不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断。本文中我们从 5 个方面总结出 Linux 多线程编程上的问题…