mybatis的延迟加载
1. 什么是延迟加载
举个例子:
如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 所以延迟加载即先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
我们来对比一下:
关联查询:
SELECT orders.*, user.username FROM orders, USER WHERE orders.user_id = user.id
延迟加载相当于:
SELECT orders.*,
(SELECT username FROM USER WHERE orders.user_id = user.id)username FROM orders
所以这就比较直观了,也就是说,我把关联查询分两次来做,而不是一次性查出所有的。第一步只查询单表orders,必然会查出orders中的一个user_id字段,然后我再根据这个user_id查user表,也是单表查询。下面来总结一下如何使用这个延迟加载
2. 使用association实现延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),其实association和collection还具备延迟加载的功能,这里我就拿association来说明,collection和association使用的方法都是一样的。需求就是上面提到的,查询订单并且关联查询用户,查询用户使用延迟加载。
由上面的分析可知,延迟加载要查询两次,第二次是按需查询,之前一对一关联查询的时候只需要查一次,把订单和用户信息都查出来了,所以只要写一个mapper即可,但是延迟加载查两次,所以理所当然要有两个mapper。
2.1 两个mapper.xml
需要定义两个mapper的方法对应的statement。先来分析一下思路:
只查询订单信息的statement,使用resultMap通过查询到的订单信息中的user_id去查询用户信息的statement,得到用户定义的resultMap将两者关联起来,即用订单信息user_id去查用户
下面来实现这个思路:
1. 在OrdersMapper.xml文件中配置只查询订单信息的statement:
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap"> SELECT * FROM orders </select>
2. 在UserMapper.xml文件中配置只查询用户信息的statement:
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
3. 定义上面那个resultMap:
2.2 延迟加载的配置
mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。在SqlMapConfig.xml中的一些配置,有一个<settings>,当时没说,这里就派上用场了,可以通过这个标签来配置一下延迟加载。
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载,即延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.3 mapper.java
OrdersMapper中添加mapper接口:
public interface UserMapperOrders {
//查询订单,关联用户查询,用户查询用的是延迟加载
public List<Orders> findOrdersUserByLazy() throws Exception;
}
2.4 代码测试
@Test
public void testFindOrdersUserByLazy() {
SqlSession session = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = session.getMapper(OrdersMapper.class);
List<Orders> list = ordersMapper.findOrdersUserByLazy();
for (Orders orders : list) {
System.out.println(orders);
User user = orders.getUser();
System.out.println(user);
}
}
看一下执行结果:
执行结果很明显,使用了延迟加载,将关联查询分成了两次单表查询,但是有个奇怪的地方,就是第二次查用户的时候,并没有发sql,而是直接就拿到了,其实这就是mybatis中的一级缓存
mybatis的延迟加载的更多相关文章
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Mybatis之延迟加载机制
1. 延迟加载的含义: 用到的时候才会去进行相关操作 2. 延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...
- Mybatis的延迟加载和缓存
1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 注意:MyBatis的延迟加 ...
- Mybatis 测试延迟加载
在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...
- Mybatis的延迟加载和立即加载
Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...
- MyBatis学习--延迟加载
简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...
- 8.Mybatis的延迟加载
在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...
- 七 mybatis的延迟加载
1 延迟加载 1.1 什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...
- mybatis实现延迟加载多对一
1.数据库表 CREATE TABLE `country` ( `cid` ) NOT NULL AUTO_INCREMENT COMMENT '国家id', `cname` ) COLLATE ut ...
随机推荐
- DL4NLP —— seq2seq+attention机制的应用:文档自动摘要(Automatic Text Summarization)
两周以前读了些文档自动摘要的论文,并针对其中两篇( [2] 和 [3] )做了presentation.下面把相关内容简单整理一下. 文本自动摘要(Automatic Text Summarizati ...
- (转)java之runnable jar与普通jar
背景:项目中有时候需要导出相关的jar包,可是总是不能分清楚. 1 导出包 导出普通jar包(可作为第三方库,类似dll,so等) 在eclipse中右键选择except->java->j ...
- AJAX 中JSON 和JSONP 的区别 以及请求原理
AJAX 跨域请求 - JSONP获取JSON数据 博客分类: Javascript /Jquery / Bootstrap / Web Asynchronous JavaScript and X ...
- GateSvr的设计2
我们的目标是:1.业务Server集群部署,从网关发来的请求处理,程序自动找一台空闲的业务Server来处理这个请求,并将结果异步分发到服务网关,从而Push给客户端:2.一套业务Server挂了不会 ...
- spring boot 整合mybatis + swagger2
之前使用springMVC+spring+mybatis,总是被一些繁琐的xml配置,有时候如果配置出错,还要检查各种xml配置,偶然接触到了spring boot 后发现搭建一个web项目真的是1分 ...
- Java 简单的 socket 编程入门实战
这个是给女朋友写的:) 首先需要知道我们每个电脑都可以成为server(服务器) 和 client(客户端) 我们需要使用java来实现客户端与服务器的数据传输 先帖上代码 注意这里两张代码处于两个j ...
- [补档]Password
Password 题目 Rivest是密码学专家.近日他正在研究一种数列E = {E[1],E[2],--,E[n]},且E[1] = E[2] = p(p为一个质数),E[i] = E[i-2]×E ...
- 在 overlay 中运行容器 - 每天5分钟玩转 Docker 容器技术(51)
上一节我们创建了 overlay 网络 ov_net1,今天将运行一个 busybox 容器并连接到 ov_net1: 查看容器的网络配置: bbox1 有两个网络接口 eth0 和 eth1.eth ...
- 【.net 深呼吸】在配置节中使用元素集合
前一篇博文中,老周介绍了自定义配置节的方法,本文咱们再往深一层,再看看如何在自定义的配置节中使用配置元素集合. 前面咱们说过,Configuration Section是特殊的配置元素,它可以包装一类 ...
- 解决lxml不含etree模块导致scrapy startproject ***出错
本文环境:win10(64) python3.6(64) 背景:之前已成功安装scrapy(1.4.0),但在命令行敲 scrapy startproject ***出错,错误提示:from ... ...