Mybatis 延迟加载使用

2023-11-17

在一对一映射中使用:

首先配置延迟加载,需要在mybatis.xml中配置

    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 配置是否为深度加载,默认就是false,所以也可以不写,使用侵入式加载就用true-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

mapper文件:

<!--    一对一关系  延迟加载-->
	<!-- 查询所用订单的sql-->
    <select id="findOrderUserList" resultMap="resultMap_order_user">
        select o.id,o.uid,o.number,o.createtime,o.des from t_orders o
    </select>
	<!-- 查询用户的sql,需要时才会使用此sql-->
    <select id="findUserListToOrder" parameterType="int" resultType="user">
        select u.id as id,u.username as username from t_user u where id=#{uid}
    </select>
    <resultMap id="resultMap_order_user" type="ordervo">
        <id column="id" property="id"/>
        <result column="uid" property="uid"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
<!--        延迟加载,配置后只有需要user的数据时,才会加载select中的语句-->
        <association property="user" javaType="User" column="uid" select="findUserListToOrder">
            <id column="id" property="id"/>
            <result column="username" property="username"/>
        </association>
    </resultMap>

 

只有在使用到User的数据时才会加载查询Order的sql:

    @Test
    public void test2(){
        IOrderMapper iOrderMapper = sqlSession.getMapper(IOrderMapper.class);
        List<OrderVo> list = iOrderMapper.findOrderUserList();
        for (OrderVo orderVo: list){
            System.out.println(orderVo);
            System.out.println(orderVo.getUser());
        }
    }

在这里插入图片描述

 

一对一延迟加载:

 <resultMap id="resultMapfindPersonId" type="mybatis.pojo.Person">

         <id property="id" column="id" />
         <result property="name" column="name" />
         <result property="age" column="age" />
         <result property="sex" column="sex" />
         <association property="card"  column="card_Id" javaType="mybatis.pojo.IdCard"
                      select="mybatis.mapper.IdCardMapper.findCodeById">
         </association>
     </resultMap>
    <!--嵌套查询延迟结果 -->
    <select id="findPersonID" resultMap="resultMapfindPersonId">
        select * from t_person;
    </select>

测试:

 @org.junit.Test
    public  void testFindAll() throws Exception{
        SqlSession sqlSession = MyBatisUtils.getSession();
        System.out.println(sqlSession);
        List<Person> accounts = sqlSession.selectList("mybatis.mapper.PersonMapper.findPersonID");
        for (Person a:accounts){
            System.out.println("-----------------------");
            System.out.println(a );
            System.out.println(a.getCard());
        }
    }

 

2021-02-04 10:50:32 [ main:788 ] - [ DEBUG ] org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:406) Created connection 1073533248.
2021-02-04 10:50:32 [ main:789 ] - [ DEBUG ] org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:101) Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3ffcd140]
2021-02-04 10:50:32 [ main:793 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==>  Preparing: select * from t_person; 
2021-02-04 10:50:32 [ main:869 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Parameters: 
2021-02-04 10:50:32 [ main:950 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) <==      Total: 4
-----------------------
2021-02-04 10:50:32 [ main:951 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==>  Preparing: SELECT * from t_idcard where id=? 
2021-02-04 10:50:32 [ main:952 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Parameters: 1(Integer)
2021-02-04 10:50:32 [ main:956 ] - [ DEBUG ] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) <==      Total: 1
Person(id=1, name=小米, age=12, sex=男, card=IdCard(id=1, code=2222222))
IdCard(id=1, code=2222222)

在调用到card信息时会自动调用sql查询,延迟加载产生的N+1问题从sql查询可以看出,person表查询一次 而card表要查询4次

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

Mybatis 延迟加载使用 的相关文章

  • 关于多线程与CPU时间片

    几个知识点 进程是操作系统分配资源的基本单位 很明显在 proc pid目录下你可以看到每一个进程的详细信息 资源情况 但是你却找不到线程的资源信息 那是因为线程是共享了进程的资源 线程是操作系统调度的基本单位 我们打开top命令看到的 t

随机推荐

  • 创建Vue脚手架&分析脚手架结构

    一 初始化脚手架 1 1 说明 1 Vue 脚手架是 Vue 官方提供的标准化开发工具 开发平台 2 最新的版本是 4 x 3 文档 Vue CLI 1 2 具体步骤 第一步 仅第一次执行 全局安装 vue cli npm install
  • iostat 命令

    iostat 命令主要通过观察物理磁盘的活动时间以及他们的平均传输速度 监控系统输入 输出设备负载 根据 iostat 命令产生的报告 用户可确定一个系统配置是否平衡 并据此在物理磁盘与适配器之间更好地平衡输入 输出负载 iostat 工具
  • CocosCreator TypeScript使用protobuf

    开发环境 Mac环境 CocosCreator TypeScript 使用protobuf 准备工作 1 CocosCreator 2 WebStorm VSCode 3 安装node js 4 下载protobufjs6 8 6 命令行安
  • CRC-模2除法

    在循环冗余校验码 CRC 的计算中有应用到模2除法 模2除法的特点就是 每一位除的结果不影响其它位 即不向上一位借位 模2除法原则 1 被除数的首位为1 商为1 2 被除数的首位为0 商为0 3 模2除法等同于按位异或 要保证每次除完首位都
  • 快排代码实现

    快排代码实现如下 快排练习 author Eleven version v1 0 date 2021 2021 10 6 19 52 public class FastSortExer public static void main Str
  • Unity动画系统详解3:如何播放、切换动画?

    摘要 长文预警 建议先收藏 有了模型和多个动画以后 在Unity中如何控制它们的播放和切换呢 本文带你一站式解析Unity的Animator模块 洪流学堂 让你快人几步 你好 我是跟着大智学Unity的萌新 我叫小新 这几周一起来复 yu
  • 基于Pytorch的神经网络部分自定义设计

    一 基础概念 学习笔记 1 训练误差和泛化误差 1 本质上 优化和深度学习的目标是根本不同的 前者主要关注的是最小化目标 后者则关注在给定有限数据量的情况下寻找合适的模型 训练误差和泛化误差通常不同 由于优化算法的目标函数通常是基于训练数据
  • 世界上最难的视觉图_世界上最长的蛇有多长?四川惊现55米洪荒巨蟒(图)

    蛇 一直是站在食物链顶端的致命生物 蟒蛇更是能够吞食人类的恐怖巨兽 网传世界上最长的蛇有500米之长 名为 红海巨蛇 已被证实为虚假传言 以地球现在的环境是不可能出现如此之大的蛇的 据说四川发现了罕见的55米长的巨蟒 堪称世界上最长的蛇 是
  • QT QWebView/QWebEngineView使用

    一 简介 使用QT程序可以访问web页面 但在不同QT版本中使用的类和方法不同 1 Qt4中使用webkit模块 2 Qt5 Qt5 5使用webkitwidgets模块 3 Qt5 6以上版本使用webenginewidgets模块 所以
  • 【Jmeter】生成html格式接口自动化测试报告

    jmeter自带执行结果查看的插件 但是需要在jmeter工具中才能查看 如果要向领导提交测试结果 不够方便直观 笔者刚做了这方面的尝试 总结出来分享给大家 这里需要用到ant来执行测试用例并生成HTML格式测试报告 一 ant下载安装 1
  • Error failed to bundle project: error running light.exe报错解决方法

    Error failed to bundle project error running light exe error running light exe failed to run C Users admin AppData Local
  • 利用VNC远程连接Ubuntu server(图形界面)

    有时会需要远程连上ubuntu server图形界面控制调试 这时VNC就是一个挺好的工具 windows 上安装 vnc viewer ubuntu server 上安装vnc server 进行连接即可 一 ubuntu 安装vnc s
  • 如何在CMD下运用管理员权限

    方法一 鼠标右键 这个方法比较比较普通 点开开始找到cmd 右击鼠标 以管理员身份运行 A 这样调用就是管理员的权限 方法二 快捷模式 在点开win R后 选择 以管理员身份运行 然后确定 可以这还是会调出UAC的提示界面 选择 是 即可
  • 【动态系统的建模与分析】二阶系统的单位阶跃响应-笔记

    1 数学推导 上节说到 定义系统输入输出 方程变为 考虑 从传递函数入手分析 求解它的传递函数 即laplace两边 即 得 传递函数为 框图为 极点 所以 则 因为B和C共轭 因此 Laplace逆变换 得 其中 则 其他情况可以自行分析
  • Ubuntu16.04主机安装基于ZYNQ的QT交叉编译库

    Ubuntu16 04主机尝试安装基于ZYNQ的QT交叉编译库 前言 基于vivado2016 4 SDK的交叉编译环境 主机Linux上安装vivado2016 4版本 qtcreator上添加基于ZYNQ的交叉编译工具 基本环境 参考资
  • 网络IO并发的底层分析

    一 IO 1 IO 类型 大部分的socket接口都是阻塞型的 所谓阻塞型接口是指系统调用 一般是IO接口 不返回调用结果并让当前线程一直阻塞 只有当该系统调用获得结果或者超时出错时才返回 select系统调用是用来让我们的程序监视多个文件
  • java集合框架中contains(),containsKey()和containsValue()的用法:

    java集合框架中contains containsKey 和containsValue 的用法 List集合的contains 方法用于判断集合中包不包含某个元素 返回值是boolean Map集合的containsKey 和contai
  • python如何输出两行_python pandas dataframe拆分行(某些行一行拆成多行)

    简单循环 最简单的方式就是循环拆分一下呗 先上最简单方法 import pandas as pd df pd DataFrame A 1 2 3 B 1 2 3 4 5 6 C 3 3 3 result pd DataFrame colum
  • 使用Matlab生成随机数数组的方法

    使用Matlab生成随机数数组的方法 在Matlab中 我们可以使用rand randn和randi函数来生成随机数数组 下面 我们将分别介绍这些函数的使用方法 rand函数 rand函数用于生成一个由0到1之间的随机数构成的矩阵 可以指定
  • Mybatis 延迟加载使用

    在一对一映射中使用 首先配置延迟加载 需要在mybatis xml中配置