mybatis_延迟加载

一头牛这么多人放      2022-05-03     125

关键词:

延迟加载

所谓的 mybatis 延迟加载,指的是当进行多个表之间的关联查询时,先从单表中进行查询,按照一定的设计规则,需要时再对该表所关联的表单继续进行查询

好比如在某个购物网站上填写收货地址时,先加载省份,等用户选择了所在省份后,系统在关联加载处该省份下的城市

延迟加载最主要的一个作用就是减小了数据库的压力

三种不同的加载类型:

1:直接加载:当对一个表执行 select 语句时,马上对该表所关联的表执行 select 语句(将该表与该表所关联的表的数据直接查询出来)

2:侵入式延迟:当对一个表执行 select 语句时,不会对该表的关联表执行 select 查询,但当访问主加载对象的详情属性时,就会马上执行关联的select查询

3:深度延迟:当对一个表执行 select 语句时,不会对该表的关联表执行 select 查询,访问主加载对象的详情也不会对该表的关联对象执行 select 查询,只有当真正访问关联对象详情时,才会执行对关联对象的 select 查询

## 未设置延迟加载时的情况

1:创建mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doaoao.dao.TeamDao">

    <!-- 根据teamid 查询team下的篮球队员 -->
    <select id="selectPlayerByTeamId" resultType="Player">
        select id,name from t_player where tid=#{id}
    </select>

    <!-- 关系属性映射关系 -->
    <!-- 集合的数据来自 select 查询,该查询的条件是 selectTeamByIdAlone 查出的id -->
    <resultMap id="teamMapAlone" type="Team">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>

        <collection property="playerList" ofType="Player" select="selectPlayerByTeamId" column="id"></collection>
    </resultMap>

    <select id="selectTeamByIdAlone" resultMap="teamMapAlone">
        SELECT id,name FROM t_team where id=#{id}
    </select>
</mapper>

2:创建接口

package com.doaoao.dao;
import com.doaoao.bean.Team;
public interface TeamDao {
    Team selectTeamByIdAlone(int id);
}

3:创建测试类

    @Test
    public void selectTeamByIdAlone() {
        Team team = teamDao.selectTeamByIdAlone(2);
        System.out.println(team);
    }

4:执行后的数据分析

// 当未设置延迟加载时,查询主表后会查询该表所关联的表

// 第一条SQL 语句,查询表 t_team
[DEBUG][2019-04-16 15:19:25]==>  Preparing: SELECT id,name FROM t_team where id=? 
[DEBUG][2019-04-16 15:19:25]==> Parameters: 2(Integer)
[TRACE][2019-04-16 15:19:25]<==    Columns: id, name
[TRACE][2019-04-16 15:19:25]<==        Row: 2, huren

// 第二条 SQL 语句,查询表 t_player
[DEBUG][2019-04-16 15:19:25]====>  Preparing: select id,name from t_player where tid=? 
[DEBUG][2019-04-16 15:19:25]====> Parameters: 2(Integer)
[TRACE][2019-04-16 15:19:25]<====    Columns: id, name
[TRACE][2019-04-16 15:19:25]<====        Row: 2, kobe
[DEBUG][2019-04-16 15:19:25]<====      Total: 1
[DEBUG][2019-04-16 15:19:25]<==      Total: 1
Team{id=2, name=‘huren‘}

## 设置延迟加载模式

在配置文件 mybatis.xml中(将下方的内容放在 properties和typeAliases之间)

    <!-- 设置延迟加载 -->
    <settings>
        <!-- 设置延迟加载的总开关 -->
        <setting name="lazyLoadingEnabled" value="true" />

        <!-- 侵入式延迟加载开关 -->
        <!-- 注意:3.4.1把那本之前value默认未true,之后版本默认未false -->
        <setting name="aggressiveLazyLoading" value="true" />
    </settings>

执行后的结果分析

// 只执行了一条 SQL 语句
[DEBUG][2019-04-16 15:47:33]==>  Preparing: SELECT id,name FROM t_team where id=? 
[DEBUG][2019-04-16 15:47:33]==> Parameters: 2(Integer)
[TRACE][2019-04-16 15:47:33]<==    Columns: id, name
[TRACE][2019-04-16 15:47:33]<==        Row: 2, huren
[DEBUG][2019-04-16 15:47:33]<==      Total: 1

 # 当将测试方法修改未如下配置时,会分别执行两条 SQL 语句

@Test
public void selectTeamByIdAlone() {
    Team team = teamDao.selectTeamByIdAlone(1);
    System.out.println(team.getName());
}

 ## 深度延迟加载

将 lazyLoadingEnabled 打开,将 aggressiveLazyLoading 关闭即可。

    <!-- 设置延迟加载 -->
    <settings>
        <!-- 设置延迟加载的总开关 -->
        <setting name="lazyLoadingEnabled" value="true" />

        <!-- 侵入式延迟加载开关 -->
        <!-- 注意:3.4.1把那本之前value默认未true,之后版本默认未false -->
        <setting name="aggressiveLazyLoading" value="true" />
    </settings>

 当执行下方测试方法时,只执行一条SQL语句,因为没有使用到player相关数据

@Test
public void selectTeamByIdAlone() {
    Team team = teamDao.selectTeamByIdAlone(1);
    System.out.println(team.getName());
}

 当执行下方测试方法时,执行两条SQL语句,因为使用到player相关数据

 @Test
public void selectTeamByIdAlone() {
    Team team = teamDao.selectTeamByIdAlone(1);

    // 使用到 player 的数据
    System.out.println(team.getPlayerList().size());
}

... 未完待续

本笔记参考自:小猴子老师教程 http://www.monkey1024.com

mybatis05_表结构关系一对一一对多多对多延迟加载(代码片段)

文章目录①.使用association一对一②.使用collection一对多③.使用collection多对对④.延迟加载使用①.使用association一对一①.需求:一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户//1.实体类publicclassUserprivateintid;private... 查看详情

[mybatis]映射文件_select_resultmap_关联查询_association分步查询&延迟加载(代码片段)

association分步查询场景一查询Employee的同时查询员工对应的部门Employee===Department一个员工有与之对应的部门信息Employee表:Department表:publicinterfaceDepartmentMapperpublicDepartmentgetDeptById(Integerid);publicinterfac 查看详情

mybatis入门基础----延迟加载

...延迟加载二、使用association实现延迟加载三、延迟加载在mybatis核心配置文件sqlMapConfig.xml中的配置回到顶部一、什么是延迟加载  resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collectio... 查看详情

mybatis查询延迟加载

Mybatis查询延迟加载 1.1     启用延迟加载      Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来。Mybatis的延迟加载默认是关闭的ÿ... 查看详情

mybatis探究之延迟加载和缓存

mybatis探究之延迟加载和缓存一、什么是延迟加载1.延迟加载的概念在mybatis进行多表查询时,并非所有的查询都需要立即进行。例如在查询带有账户信息的用户信息时,我们们并不需要总是在加载用户信息时就一定要加载他的账... 查看详情

mybatis延迟加载

...要设置两个选项<!--配置参数--><settings><!--开启mybatis支持延迟加载--><settingname="lazyLoadingEnabled"value="true"/><!--关闭调用任意方法立即加载,每 查看详情

mybatis延迟加载和缓存

一、延迟加载1.主对象的加载:根本没有延迟的概念,都是直接加载。2.关联对象的加载时机:01.直接加载:访问主对象,关联对象也要加载02.侵入式延迟:访问主对象,并不加载关联对象访问主对象属性的属性的时候,关联对... 查看详情

mybatis延迟加载缓存逆向工程

一、Mybatis中的延迟加载   1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association、collection实现一对一及一对多(多对多)映射),同样的association、collection具备延迟加载功能。所谓延迟加载,... 查看详情

mybatis-延迟加载

   立即加载:只要一调用就立即发起加载。举例:一个用户有100个账户,查询账户时有必要把用户信息也显示出来。  延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时... 查看详情

mybatis应用开发(17)延迟加载之应用

...有使用延迟加载的情况在没有进行任何特定配置的情况下MyBatis默认是关闭了延迟加载功能,即使用立即加载。 在SqlMapConfig.xml中确认关闭了延迟加载功能。<!--延迟加载:true,立即加载:false,默认false--><settingname="lazyLoa... 查看详情

mybatis学习11mybatis中的延迟加载

1.什么是延迟加载  举个例子:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。所以延迟加载即先从单表查询... 查看详情

mybatis延迟加载和查询缓存

...库性能,因为查询单表要比关联查询多张表速度要快。在mybatis核心配置文件中配置:lazyLoadingEnabled、aggressiveL 查看详情

mybatis专题-延迟加载(代码片段)

....搭建一对多测试环境3.使用collection实现的延迟加载4.开启Mybatis的延迟加载策略1.什么是延迟加载?前面我们讲解Mybatis中的一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。在实际使用中的大... 查看详情

mybatis应用开发(16)延迟加载之概念

...加载子表到关联的从属JavaBean中。 使用嵌套查询时,MyBatis支持延迟加载功能。 MyBatis提供了2种方式控制延迟 查看详情

mybatis框架-第三篇

目录第一章:Mybatis延迟加载策略1.1-什么是延迟加载?1.2-需求1.3-解决方案1.4-代码实现第二章:Mybatis缓存2.1-Mybatis一级缓存2.2-Mybatis二级缓存第一章:Mybatis延迟加载策略1.1-什么是延迟加载?就是在需要用到数据时才进行加载,不... 查看详情

mybatis是否支持延迟加载?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。它的原理是,... 查看详情

mybatis延迟加载,一级缓存,二级缓存设置

什么是延迟加载         resultMap中的association和collection标签具有延迟加载的功能。        延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关... 查看详情

延迟加载

   MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。 注意:MyBatis的延迟加载只是对关联对象的查询有延迟设... 查看详情