mybatis教程之延迟加载详解
作者:SIHAIloveYAN 发布时间:2023-02-19 12:45:18
延迟加载
1 使用延迟加载意义
在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。
如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。
mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。
2 配置mybatis支持延迟加载
在 SqlMapConfig.xml中配置全局参数:
<!-- 全局配置参数 -->
<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置按需加载 -->
<setting name="aggressiveLazyLoading" value="false" />
</settings>
3 延迟加载实现
3.1 实现思路
需求:
查询订单及用户的信息,一对一查询。
刚开始只查询订单信息
当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。
3.2 mapper.xml
<!-- 一对一查询延迟加载
开始只查询订单,对用户信息进行延迟加载
-->
<select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">
SELECT
orders.*
FROM
orders
</select>
3.3 resultMap
<!-- 一对一查询延迟加载 的配置 -->
<resultMap type="orders" id="orderCustomLazyLoading">
<!-- 完成了订单信息的映射配置 -->
<!-- id:订单关联用户查询的唯 一 标识 -->
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note" />
<!-- 配置用户信息的延迟加载 select:延迟加载执行的sql所在的statement的id,如果不在同一个namespace需要加namespace
sql:根据用户id查询用户信息 column:关联查询的列 property:将关联查询的用户信息设置到Orders的哪个属性 -->
<association property="user"
select="com.sihai.mybatis.mapper.UserMapper.findUserById" column="user_id"></association>
</resultMap>
3.4 mapper.java
//一对一查询,延迟加载
public List<Orders> findOrderUserListLazyLoading() throws Exception;
3.5 测试代码
// 一对一查询延迟加载
@Test
public void testFindOrderUserListLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建mapper代理对象
OrdersMapperCustom ordersMapperCustom = sqlSession
.getMapper(OrdersMapperCustom.class);
// 调用方法
List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading();
//这里执行延迟加载,要发出sql
User user = list.get(0).getUser();
System.out.println(user);
}
4 resultType、resultMap、延迟加载使用场景总结
4.1 延迟加载:
延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。
mybatis提供延迟加载的功能用于service层。
4.2 resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
4.3 resultMap:
使用association和collection完成一对一和一对多高级映射。
4.4 association:
作用:将关联查询信息映射到一个pojo类中。
场合:为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
4.5 collection:
作用:将关联查询信息映射到一个list集合中。
场合:为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。
来源:http://blog.csdn.net/sihai12345/article/details/70477794?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 面向对象思想之封装或许大家都听说过java是纯面向对象语言,面向对象思想也就是我们常说的OOP,我们听说最多的思想就是继承,封装,多态,今天
- /* String name = "adsbsadgsadgtewterfsdf"
- 目录1、Java 语言中创建一个对象使用的关键字是()2、创建一个标识有“关闭”标签的语句是 ( ) 。3、When is the text
- tokentoken的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳
- 介绍最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了。在写
- 先记录下jdk8之前的一些帮助方法判断time是否在now的n天之内/** * 判断time是否在now的n天之内
- 本文实例讲述了C#访问SqlServer设置链接超时的方法。分享给大家供大家参考。具体实现方法如下:下面这段代码设置超时时间为60秒,默认为
- 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有。思路其实很简单,弄个ListView,然后里面的
- 在Unity中实现简单的伪时间同步,只是读取数据库所在电脑的当前时间using UnityEngine;using System.Colle
- Android 文件操作详解Android 的文件操作说白了就是Java的文件操作的处理。所以如果对Java的io文件操作比较熟
- 什么是Etcd?etcd是一个强大的一致性的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器群访问的数据。它优雅地处理网络
- 一、简介JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCa
- 一、目的针对不同地区,设置不同的语言信息。SpringBoot国际化配置文件默认放在classpath:message.properties
- Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设
- 前言JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器
- spring in action第三版读书笔记spring3.0引入了spring expression language(spel)语言,
- 把idea中的项目导入github仓库中步骤详解做完项目进行云端保存是很必要的,我都是存放在github中。所以废活少说直接开始啦。前提是已
- 目录RemoveSubstringReplaceSpiltJoinAppendRemoveRemove(int startIndex) 删除
- 前沿知识ThreadLocal存储线程变量,使用set方法设置变量,使用get方法获取变量线程隔离的实现是每个Thread类有一个类型为Th
- 接口定义了一系列的行为规范,为类型定义一种Can-Do的功能。例如,实现IEnumerable接口定义了GetEnumerator方法,用于