Mybatis_lazyLoadingEnabled延迟加载配置

2023-11-13

via: https://item.congci.com/-/content/mybatis-lazyloadingenabled-yanchi-jiazai-peizhi

 

一、什么是延迟加载

  resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

需求:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

 

二、使用association实现延迟加载

需要定义两个mapper的方法对应的statement。

1、只查询订单信息

  SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)

2、关联查询用户信息

  通过上边查询到的订单信息中user_id去关联查询用户信息

OrderMapper.xml的延迟加载的核心代码:

  使用association中的select指定延迟加载去执行的statement的id。

    <!-- 查询订单关联查询用户,用户信息按需延迟加载 的 resultMap定义 -->
    <resultMap type="com.mybatis.entity.Orders" id="ordersUserLazyLoading">
                <!--对订单信息进行映射配置  -->
            <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:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 
                column:订单信息中关联用户信息查询的列,是user_id
                关联查询的sql理解为:
                 SELECT orders.*,
                    (SELECT username FROM USER WHERE orders.user_id = user.id)username,
                    (SELECT sex FROM USER WHERE orders.user_id = user.id)sex
                 FROM orders
            -->
            <association property="user"  javaType="com.mybatis.entity.User" select="findUserById" column="user_id"/>
    </resultMap>
        <!-- 根据Id查询用户,用于测试延迟加载 -->
        <select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User" >
                select * from t_user where id=#{id}
        </select>
    <!-- 查询订单关联用户,用户信息延迟加载 -->
    <select id="findOrdersUserLazyLoading" resultMap="ordersUserLazyLoading">
            select * from orders
    </select>    

OrderMapper.java的代码:

public interface OrdersCustomMapper {
    /**查询订单,关联查询用户,用户按需延迟加载*/
    public List<Orders>findOrdersUserLazyLoading();
    /**根据Id查询用户(这个方法本应该放在UserMapper类的,测试方便先放在这)*/
    public User findUserById(int id);
}

测试思路及代码:

1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。

2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。

3、延迟加载,去调用findUserbyId这个方法获取用户信息。

// 查询用户关联查询用户,用户信息延迟加载
        @Test
        public void TestFindOrdersUserLazyLoading() {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
            // 调用mapper的方法
            List<Orders> list = oc.findOrdersUserLazyLoading();
            for(Orders order: list){
                //执行getUser()去查询用户信息,这里实现延迟加载
                User user = order.getUser();
                System.out.println(user);
            }
            sqlSession.close();
        }

三、延迟加载在mybatis核心配置文件sqlMapConfig.xml中的配置

mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。

在mybatis核心配置文件中配置:

    lazyLoadingEnabled、aggressiveLazyLoading

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

<!-- 全局参数的配置 -->
    <settings>
            <!--打开延迟加载的开关  -->
        <setting name="lazyLoadingEnabled" value="true"/>
            <!--将积极加载改为消极加载及按需加载  -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

小结:使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

 


 

MyBatis 延迟加载 懒加载

主要体现在关联查询上

一、开启延时加载

需要在核心配置文件中做两个必须的配置

<configuration>
    
    <settings>
        <!– 延迟加载总开关 –>
        <setting name="lazyLoadingEnabled" value="true" />
        <!– 禁止积极主动的加载 –>
        <setting name="aggressiveLazyLoading" value="false" />
    </settings>

 

二、一对多

对于Person来说

一条SQL语句查询Person的基本信息

一条SQL语句查询Person的订单(懒加载的语句)

1.在PersonMapper中

    <resultMap type="com.yutouxiuxiu.model.Person" id="selectOrderByPersonIdLazyRM" extends="personRM">
        <!– 
             column  -  主SQL语句查询的结果集的某一字段作为参数传给子SQL语句
             select  -  子SQL语句 –>
        <collection property="orderList" column="person_id" select="com.yutouxiuxiu.Orders.selectOrderByPersonId">
        </collection>
    </resultMap>
    
    <select id="selectOrderByPersonIdLazy" parameterType="int" resultMap="selectOrderByPersonIdLazyRM">
        select * from person where person_id = #{personId}
    </select>

2.在OrdersMapper中

    <!– 一对多的时候的延迟加载的子SQL语句 –>
    <select id="selectOrderByPersonId" parameterType="int" resultMap="BaseResultMap">
        select * from orders o where o.person_id = #{personId}
    </select>

 

    @Test
    public void selectOrderByPersonIdLazy() {
        // 获得session
        SqlSession session = sqlSessionFactory.openSession();
        try {
            Person person = session.selectOne("com.yutouxiuxiu.Person.selectOrderByPersonIdLazy", 1);
            // 发出查询person信息的SQL语句
            System.out.println(person);
            // 发出查询订单信息的SQL语句
            System.out.println(person.getOrderList());
        } finally {
            session.close();
        }
    }

执行结果:

2014-02-11 11:17:30,550 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ooo Using Connection [com.mysql.jdbc.Connection@4e94ac10]
2014-02-11 11:17:30,551 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ==>  Preparing: select * from person where person_id = ? 
2014-02-11 11:17:30,602 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ==> Parameters: 1(Integer)
2014-02-11 11:17:30,702 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ooo Using Connection [com.mysql.jdbc.Connection@4e94ac10]
2014-02-11 11:17:30,702 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ==>  Preparing: select * from orders o where o.person_id = ? 
2014-02-11 11:17:30,703 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ==> Parameters: 1(Integer)
Person [id=1, name=赵四, birthday=Mon Feb 10 00:00:00 CST 2014, address=象牙山, salary=1000, orderList=[Orders [orderId=1, orderSum=1000.0, orderTime=Sun Feb 09 16:28:26 CST 2014, personId=1, detialList=null, person=null], Orders [orderId=2, orderSum=200.0, orderTime=Sun Feb 09 09:09:00 CST 2014, personId=1, detialList=null, person=null]], roleList=null]
[Orders [orderId=1, orderSum=1000.0, orderTime=Sun Feb 09 16:28:26 CST 2014, personId=1, detialList=null, person=null], Orders [orderId=2, orderSum=200.0, orderTime=Sun Feb 09 09:09:00 CST 2014, personId=1, detialList=null, person=null]]

 

 

三、多对一

对于Orders来说

一条SQL语句查询Order是的基本信息

一条SQL语句查询Order的所属人(懒加载的语句)

1.Order的映射文件

    <resultMap type="com.yutouxiuxiu.model.Orders" id="selectPersonByOrderIdLazyRM" extends="BaseResultMap">
        <association property="person" column="person_id" select="com.yutouxiuxiu.Person.selectPersonByOrderId">
        </association>
    </resultMap>
    
    <select id="selectPersonByOrderIdLazy" parameterType="int" resultMap="selectPersonByOrderIdLazyRM">
        select * from orders where order_id = #{orderId}
    </select>

2.Person的映射文件

    <select id="selectPersonByOrderId">
        select * from person where person_id = #{personId}        
    </select>

 

    @Test
    public void selectPersonByOrderIdLazy() {
        // 获得session
        SqlSession session = sqlSessionFactory.openSession();
        try {
            Orders orders = session.selectOne("com.yutouxiuxiu.Orders.selectPersonByOrderIdLazy", 1);
            // 发出查询person信息的SQL语句
            System.out.println(orders);
            // 发出查询订单信息的SQL语句
            System.out.println(orders.getPerson());
        } finally {
            session.close();
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis_lazyLoadingEnabled延迟加载配置 的相关文章

随机推荐

  • 【页面编号】假设页面从1开始连续编号,一共1000页。计算所有页码中的十进制数字的总个数

    题目 假设页面从1开始连续编号 一共1000页 计算所有页码中的十进制数字的总个数 这题很简单 就是求0 9出现次数的总和 public class text3 0 9为十进制数字 本题要求为统计1 1000中出现的十进制数字总数 分析 对
  • vscode安装使用教程

    一 什么是vscode Visual Studio Code 简称 VS Code VSC 是一款免费开源的现代化轻量级代码编辑器 支持几乎所有主流的开发语言的语法高亮 智能代码补全 自定义热键 括号匹配 代码片段 代码对比 Diff GI
  • 2022多益网络春招之最后一场--软件工程师笔试

    题型 选择 填空 简答 算法 凭借自己的回忆说一下题目类型 选择题 涉及到的题型主要是Java基础的题目 例如分析代码的时间复杂度 一些排序算法的时间复杂度 二叉排序树 sql语句 很简单 散列表 链表 什么数据结构具有记忆功能 连接查询
  • C++基础学习-29类模板概念,类模板定义、使用

    目录 一 概述 二 类模板的定义 三 类模板的成员函数 四 模板类名字的使用 五 非类模板参数 一 概述 用类模板来实例化一个特定的类 编译器不能为类模板推断参数类型 所以为了使用类模板 我们必须在类模板名后边用 lt gt 来提供额外的信
  • module.alias的更新

    一般通过hotplug的设备会通过module alias 中的信息来加载device对应的driver linux 1wlr lib modules 4 4 68 2 default modinfo ipmi ssif filename
  • vue3+vite+element plus+el-table中如何放置本地图片

    遇到bug 解决方案 vue组件 js代码
  • LZ77算法压缩和解压缩

    LZ77简介 Ziv和Lempel于1977年发表题为 顺序数据压缩的一个通用算法 A Universal Algorithm for Sequential Data Compression 的论文 论文中描述的算法被后人称为LZ77算法
  • 计算机的性能指标完全由cpu决定是否正确,计算机的性能指标完全由CPU决定对吗...

    电脑性能由CPU 中央处理器 主板 显卡 网卡 声卡等共同决定 如果主板 显卡不行 CPU再好也不行 这5个中 CPU 主板 显卡在决定电脑性能中占的比重大一些 推荐学习 phpstorm 1 运算速度 计算机运算速度是指每秒钟所能执行的指
  • 记录Windows10中Docker安装Mysql5.7

    DockerHub 搜索Mysql找到官方镜像 官方镜像地址 拉取mysql5 7版本镜像 拉取 docker pull mysql 5 7 查看docker 镜像 就能看到拉取的镜像 docker images 运行一个mysql容器 创
  • 电脑开机check_码住!常见电脑蓝屏代码和解决方法

    电脑蓝屏是很多人都碰到过的突发情况 引起电脑蓝屏的原因有很多 在软件方面 可能是因为个别软件或者驱动导致的 也可能是电脑中了病毒或者操作系统损坏等原因 硬件方面 可能是因为电脑散热不良 内存损坏 内存条接触不良或者电脑超频过度 硬盘坏道等问
  • anaconda换源和恢复默认源

    1 查看当前环境下的源 conda config show sources 2 换清华源 conda config add channels https mirrors tuna tsinghua edu cn anaconda pkgs
  • Android插件化主流框架和实现原理

    写在前面 这几年移动开发业界兴起的 插件化技术 的旋风 各个大厂都推出了自己的插件化框架 各种开源框架都评价自身功能优越性 令人目不暇接 随着公司业务快速发展 项目增多 开发资源却有限 如何能在有限资源内满足需求和项目的增长 同时又能快速响
  • (CentOS 7) PostgreSQL安装与配置

    一 安装相关配置软件 root www1 yum install y gcc x86 64 glibc x86 64 glibc devel x86 64 vim enhanced x86 64 gcc java apr apr devel
  • parted扩展磁盘分区(实践篇)

    系统环境 操作系统 centos7 2 前言 突然发现根下的空间不足了 没有找到可以释放的磁盘空间 所以决定要扩展一下磁盘分区 直接上操作 环境分析 发现根下的磁盘空间已经不是很充足了 看图片 显示的sda2的空间只给了280G 已经快要占
  • cgroup----devices子系统

    devices子系统 使用devices 子系统可以允许或者拒绝cgroup中的进程访问设备 devices子系统有三个控制文件 devices allow devices deny devices list devices allow用于
  • 下级对上级回复收悉_领导发微信“辛苦啦”怎么回复?学会这几点,让你被高看一眼...

    有网友说 在职场 领导晚上发微信交代任务 完成后发结果给他 领导回了句辛苦 如何巧妙回应他 有时候 简单的问题就不要特别复杂化 就像这个话题所言 领导给你发微信交代任务 你做完了后交差 领导回复句辛苦 我想这句话并没有特别深的含义 可能是领
  • 偏微分方程基础

    第五十篇 偏微分方程 一个偏微分方程 PDE 包含两个或多个自变量的导数 这与之前描述的常微分方程 ODE 相反 后者只涉及一个自变量 工程和科学中的许多现象都是用偏微分方程描述的 例如 一个因变量 如压力或温度 可以作为时间 t 和空间
  • 页面刷新后DataGrid重新定位

    VB NET Private Sub scroll ByVal index As Integer Dim s As String s Page RegisterStartupScript s End Sub C private void S
  • Qt中查看ui_xxx.h文件方法

    前提 1 Qt当有界面 2 构造完成 满足以上两个条件qt会生成ui xxx h文件 如何查看 方法1 在cpp文件中找到UI下的一个对象 如 ui gt textEdit Ui QWDialog 按住Ctrl键 使用鼠标左键点击UI下的一
  • Mybatis_lazyLoadingEnabled延迟加载配置

    via https item congci com content mybatis lazyloadingenabled yanchi jiazai peizhi 一 什么是延迟加载 resultMap可以实现高级映射 使用associat