广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis延迟加载策略深入探究
  • 641
分享到

MyBatis延迟加载策略深入探究

2024-04-02 19:04:59 641人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录分步查询的优点在主配置文件当中设置延迟加载在studentDao.xml当中设置分步查询测试结果如何使用延迟加载的好处有两种写法来表示查询信息,分别是链表查询和分步查询的方法。那

有两种写法来表示查询信息,分别是链表查询和分步查询的方法。那么既然我么能用一个sql语句能够执行完,那为什么还要分开来写呢?

原因很简单:可以发现如果我们把他们连在一起那么他们就是一个多表查询语句,如果不放在一起执行,那那就是单独一个表的查询语句。但是这需要我们设置mybatis的延迟加载(懒加载)

分步查询的优点

**可以实现延迟加载,**但是必须在核心配置文件中设置全局配置信息

lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载

aggressiveLazyLoding:当开启时,任何方式的调用都会加载该对象的所有属性。否则,该属性会按需加载 ,此时就可以实现按需加载,需要获取的数据是什么,就只会执行相应的sql.此时会通过association和collection中的fetchType属性设置当前的分步查询是否使用懒加载

fetchType=“lazy(延迟加载) | eager(立即加载)”

在主配置文件当中设置延迟加载

延迟加载:在SqlMapConfig.xml中配置延迟加载文件

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING" />  <!-- 打印日志到控制台上 -->
    <setting name="lazyLoadingEnabled" value="true"/>   
    <setting name="aggressiveLazyLoading" value="false"/>   <!-- false才会按需加载,不开启调用所有的对象 -->
</settings>

在studentDao.xml当中设置分步查询

测试结果

此时开启了懒加载,实现了分布查询

如何使用

public class UserDO {
  private Integer userId;
  private String username;
  private String passWord;
  private String nickname;
  private List<PermitDO> permitDOList;
  public UserDO() {}
}
<resultMap id="BaseMap" type="org.apache.ibatis.study.entity.UserDO">
    <id column="user_id" jdbcType="INTEGER" property="userId" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname"/>
    <collection property="permitDOList" column="user_id" select="getPermitsByUserId"
     fetchType="lazy">
    </collection>
</resultMap>
  <resultMap id="PermitBaseMap" type="org.apache.ibatis.study.entity.PermitDO">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="code" jdbcType="VARCHAR" property="code"/>
    <result column="name" jdbcType="VARCHAR" property="name"/>
    <result column="type" jdbcType="TINYINT" property="type"/>
    <result column="pid" jdbcType="INTEGER" property="pid"/>
  </resultMap>
   <select id="getByUserId2" resultMap="BaseMap">
    select * from user
    where user_id = #{userId}
  </select>
  <select id="getPermitsByUserId" resultMap="PermitBaseMap">
    select p.*
    from user_permit up
    inner join permit p on up.permit_id = p.id
    where up.user_id = #{userId}
  </select>

通过fetchType=lazy指定子查询getPermitsByUserId使用懒加载,这样的话就不用管全局配置lazyLoadingEnabled是true还是false了。当然这里可以直接用多表关联查询不使用子查询,使用方法在这篇文章

测试代码

public class Test {
  public static void main(String[] args) throws IOException {
    try (InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml")) {
      // 构建session工厂 DefaultSqlSessionFactory
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession sqlSession = sqlSessionFactory.openSession();
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      UserDO userDO = userMapper.getByUserId2(1);
      System.out.println(userDO);
    }
  }
}

结果如下,打了断点可以看到原userDO对象已被代理并且permitDOList是null需要调用get方法才会去查询拿到值,咳咳这边之前直接运行显示是已经把permitDOList查询出来了,想了半天啥原因后来才发现println会调用userDO对象的toString方法,而toString方法也会走代理方法直接去调用子查询的

延迟加载的好处

延迟加载主要能解决mybatis的N+1问题,什么是N+1问题其实叫1+N更为合理,以上面的业务例子来说就是假设一次查询出来10000个用户,那么还需要针对这10000个用户使用子查询getPermitsByUserId获取每个用户的权限列表,需要10000次查询,总共10001次,真实情况下你可能并不需要每个子查询的结果,这样就浪费数据库连接资源了。如果使用延迟加载的话就相当于不用进行这10000次查询,因为它是等到你真正使用的时候才会调用子查询获取结果。

到此这篇关于MyBatis延迟加载策略深入探究的文章就介绍到这了,更多相关MyBatis延迟加载内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MyBatis延迟加载策略深入探究

本文链接: https://www.lsjlt.com/news/165640.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MyBatis延迟加载策略深入探究
    目录分步查询的优点在主配置文件当中设置延迟加载在studentDao.xml当中设置分步查询测试结果如何使用延迟加载的好处有两种写法来表示查询信息,分别是链表查询和分步查询的方法。那...
    99+
    2022-11-13
  • 深入探究Java中的类加载机制
    目录前言步入正题类的加载过程:1.加载2.验证3.准备4.解析5.初始化类加载器源码总结前言 学生时代应抱着问题去学习一门语言,例如:在学习java语言的过程中,我遇到过java主方...
    99+
    2022-11-12
  • Java内存溢出问题深入探究及其解决策略
    文章目录 引言一、Java内存模型与溢出的根源1.1 Java内存模型1.2 内存溢出的根源 二、诊断内存溢出三、解决策略3.1 优化代码3.2 调整堆大小3.3 使用内存友好的数据结构...
    99+
    2023-09-20
    java jvm 开发语言
  • Flutter图片加载与缓存机制的深入探究
    目录前言图片控件 图片解析 缓存管理 ​新增缓存 缓存清理 图片加载 滑动中处理 总结 前言 今天来学习一下 Flutter 自身是如何加载图片和管理图片的。 Flutt...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作