码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)


    MyBatis多对一映射延迟加载

    • 一、延迟加载
      • 1、延迟加载的核心原理
      • 2、开启延迟加载的两种方式
        • (1)局部延迟加载
        • (2)全局延迟加载
    • 二、局部延迟加载 fetchType="lazy"
    • 三、全局延迟加载 lazyLoadingEnabled=true
    • 四、关于lazyLoadingEnabled的补充说明

    往期文章:
    一文彻底搞懂Mybatis系列(一)之mybatis入门
    一文彻底搞懂Mybatis系列(二)之mybatis事务管理机制深度剖析
    一文彻底搞懂Mybatis系列(三)之mybatis完成增删改查CURD功能超级详细
    一文彻底搞懂Mybatis系列(四)之mybatis核心配置文件详解
    一文彻底搞懂Mybatis系列(五)之手写Mybatis框架简单探索版
    一文彻底搞懂Mybatis系列(六)之在WEB应用中使用Mybatis
    一文彻底搞懂Mybatis系列(七)之使用Mybatis的小技巧
    一文彻底搞懂Mybatis系列(八)之Mybatis参数处理
    一文彻底搞懂Mybatis系列(九)之Mybatis动态SQL标签总结
    一文彻底搞懂Mybatis系列(十)之SqlSession、SqlSessionFactory和SqlSessionFactoryBuilder详解
    一文彻底搞懂Mybatis系列(十一)之MyBatis多对一映射查询
    一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
    一文彻底搞懂Mybatis系列(十三)之MyBatis一对多映射查询
    一文彻底搞懂Mybatis系列(十四)之MyBatis一级缓存
    一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
    一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
    一文彻底搞懂Mybatis系列(十七)之MyBatis使用分页插件PageHelper

    一、延迟加载

    1、延迟加载的核心原理

    通俗点讲就是:用的时候再执行查询语句。不用的时候不查询。

    作用:提高性能。尽可能的不查,或者说尽可能的少查。来提高效率。

    2、开启延迟加载的两种方式

    (1)局部延迟加载

    在mybatis的association标签中添加 fetchType=“lazy”
    注意:
    默认情况下是没有开启延迟加载的。需要设置:fetchType=“lazy”
    这种在association标签中配置fetchType=“lazy”,是局部的设置,只对当前的association关联的sal语句起作用。

    (2)全局延迟加载

    在实际的开发中,大部分都是需要使用延迟加载的,所以建议开启全部的延迟加载机制:
    在mybatis核心配置文件中添加全局配置:lazyLoadingEnabled=true

    实际开发中的模式:
    把全局的延迟加载打开。
    如果某一步不需要使用延迟加载,请设置:fetchType=“eager”

    二、局部延迟加载 fetchType=“lazy”

    在association标签中配置fetchType="lazy",是局部的设置,
    只对当前的association关联的sal语句起作用。
    
    • 1
    • 2

    代码如下:

    StuMapper接口
    
    • 1
    public interface StuMapper {
    	public Stu selectBySidStep1(Integer sid);
    }
    
    • 1
    • 2
    • 3
    ClazzMapper接口
    
    • 1
    public interface ClazzMapper {
        public Clazz selectByCidStep2(Integer cid);
    }
    
    • 1
    • 2
    • 3

    StuMapper.xml文件

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.powernode.mybatis.mapper.StuMapper">
        
        <resultMap id="selectBySidStepMap" type="Stu">
            <id property="sid" column="sid"/>
            <result property="name" column="name"/>
            <association property="clazz"
                         select="com.powernode.mybatis.mapper.ClazzMapper.selectByCidStep2"
                         column="cid"
                         fetchType="lazy"
            />
        resultMap>
        <select id="selectBySidStep1" resultMap="selectBySidStepMap">
            select s.sid,s.name,s.cid from t_stu s
            where s.sid = #{sid}
        select>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    测试类 情况一:调用学生类对象的toString()方法
    
    • 1
    @Test
        public void testAdvanceMappingStep(){
            SqlSession sqlSession = SqlSessionUtil.openSqlSession();
            StuMapper mapper = sqlSession.getMapper(StuMapper.class);
            Stu stu = mapper.selectBySidStep1(1);
            System.out.println(stu.toString());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    运行结果,我们发现,两个接口对应的sql都被执行了
    
    • 1
    StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
    StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
    StuMapper.selectBySidStep1 - <==      Total: 1
    ClazzMapper.selectByCidStep2 - ==>  Preparing: select * from t_clazz where cid = ?
    ClazzMapper.selectByCidStep2 - ==> Parameters: 1000(Integer)
    ClazzMapper.selectByCidStep2 - <==      Total: 1
    Stu{sid=1, name='张三', clazz=Clazz{cid=1000, name='高三一班'}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    测试类 情况二:调用学生类对象的getName()方法
    
    • 1
    @Test
        public void testAdvanceMappingStep(){
            SqlSession sqlSession = SqlSessionUtil.openSqlSession();
            StuMapper mapper = sqlSession.getMapper(StuMapper.class);
            Stu stu = mapper.selectBySidStep1(1);
            System.out.println(stu.getName());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    运行结果,我们发现,只执行了一条sql,说明延迟加载生效了
    
    • 1
    StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
    StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
    StuMapper.selectBySidStep1 - <==      Total: 1
    张三
    
    • 1
    • 2
    • 3
    • 4
    测试类 情况三:先调用学生类对象的getName()方法,再调用班级属性方法getClazz()
    
    • 1
    @Test
        public void testAdvanceMappingStep(){
            SqlSession sqlSession = SqlSessionUtil.openSqlSession();
            StuMapper mapper = sqlSession.getMapper(StuMapper.class);
            Stu stu = mapper.selectBySidStep1(1);
            System.out.println(stu.getName());
            System.out.println(stu.getClazz());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    运行结果,我们发现,只有在调用的时候,sql语句才会被执行,再次验证了延迟加载的配置效果
    
    • 1
    StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
    StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
    StuMapper.selectBySidStep1 - <==      Total: 1
    张三
    ClazzMapper.selectByCidStep2 - ==>  Preparing: select * from t_clazz where cid = ?
    ClazzMapper.selectByCidStep2 - ==> Parameters: 1000(Integer)
    ClazzMapper.selectByCidStep2 - <==      Total: 1
    Clazz{cid=1000, name='高三一班'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、全局延迟加载 lazyLoadingEnabled=true

    如果想要实现全局延迟加载,则只需要在mybatis核心配置文件中
    添加全局配置:
    lazyLoadingEnabled=true

    具体配置如下:
    
    • 1
    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <properties resource="jdbc.properties"/>
        <settings>
            <setting name="lazyLoadingEnabled" value="true"/>
        settings>
        <typeAliases>
            <package name="com.powernode.mybatis.pojo" />
        typeAliases>
        <environments default="dev">
            <environment id="dev">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <package name="com.powernode.mybatis.mapper"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    四、关于lazyLoadingEnabled的补充说明

    mybatis3.4.1以及之前版本,开启懒加载lazyLoadingEnabled为true时,得记得把aggressiveLazyLoading设置为false,因为aggressiveLazyLoading它的默认值为true,会强行给你全部加载,因此不显示设置aggressiveLazyLoading为false,那么懒加载lazyLoadingEnabled就起不到作用了,

    而mybatis3.4.1之后的版本,aggressiveLazyLoading的默认值为false了,所以开启懒加载lazyLoadingEnabled时候只需要设置lazyLoadingEnabled为true就行,再也不用显示设置aggressiveLazyLoading为false了。

  • 相关阅读:
    Python Flask Web开发二:数据库创建和使用
    idea导入eclipse项目的时候,Java图标变成黄色小J了,怎么解决?
    小车-16线 Lidar启动命令&编译指令_20220805
    【前端设计模式】之访问者模式
    Nie et al. 2010 提出的不等式定理
    Java抽象类知识
    51单片机LED8*8点阵显示坤坤跳舞打篮球画面
    [HDLBits] Count clock
    java计算机毕业设计物流信息管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    python基于PHP+MySQL的健身俱乐部网站的设计与实现
  • 原文地址:https://blog.csdn.net/weixin_43860634/article/details/127585161
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号