MyBatis中延迟加载,全局和局部的开启使用与关闭

文章目录

  • MyBatis中延迟加载,全局和局部的开启使用与关闭
    • 1、问题提出
    • 2、延迟加载和立即加载
      • 延迟加载
      • 立即加载
    • 3、三种对应的表关系中的加载
    • 4、打开全局延迟加载(实现一对一的延迟加载)
    • 5、实现一对多的延迟加载(将上面设置的全局延迟加载给注释掉)
      • 编写UserMapper.xml
      • 在UserMapper.xml中添加select查询语句
      • 在UserMapper.java中添加属性
      • 编写测试类
      • 延迟加载运行结果如下:
    • 6、测试一对多的延迟加载,对比观察输出结果
      • 将测试类中的另一个想要获得的信息给注释掉,如下:
      • 运行结果如下:
  • 结论:对比两种运行结果可以得到,延迟加载的使用意义:需要获得什么信息再去执行相应的sql语句,如果不需要获得的信息则不会进行加载!

MyBatis中延迟加载,全局和局部的开启使用与关闭

1、问题提出

在之前的文章一对多中,当我们有一个用户,他又一百个账户。
(1)在查询用户时,要不要把关联的账户信息查询出来?
(2)在查询账户时,要不要把关联的用户信息查询出来?

对于第一个问题,我们应该是什么时候需要查询账户信息,才查询。没必要每次查询用户信息都把账户信息也查询出来。因为如果每次都查询出账户信息,对我们的内存开销是很大的,而且每次查询也都不一定用到账户信息。
对于第二个问题,我们就可以在查询账户信息的时候查询出关联的用户信息,因为我们如果只是单纯的账户信息没有说明用户是谁,这对于我们来说是不友好的。也没什么意义,所以在每次查询账户信息的时候都要显示出关联的用户信息。

2、延迟加载和立即加载

第一个问题其实就是延迟加载。
第二个问题就是立即加载。

延迟加载

在真正的使用数据时才发起查询,不用的时候不查。按需加载(懒加载)。

立即加载

不管用不用,只要一调用方法,马上发起查询。

3、三种对应的表关系中的加载

四种表 关系:一对一,一对多,多对多。
一对多、多对多:通常情况下,我们都是采用延迟加载。
多对一、一对一:通常情况下,我们都是采用立即加载。

4、打开全局延迟加载(实现一对一的延迟加载)

这里的项目结构和mybatis关联查询里面的大部分内容是一样的,我们只需要更改一些配置信息。
更改mybatis-config.xml中的信息
在这里添加两条setting标签配置信息。根据mybatis的文档

需要设置这两个属性。才能开启延迟加载。

  <settings><!-- 打开全局延迟加载的开关 --><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置延迟加载策略 --><settings><!-- 打开全局延迟加载的开关 --><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings><typeAliases><package name="cn.fpl1116.pojo"/></typeAliases><!--使用dev环境--><environments default="dev"><environment id="dev"><!--事务--><transactionManager type="JDBC"></transactionManager><!--type="POOLED":连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value=""/></dataSource></environment></environments><!--加载mapper映射文件--><mappers><package name="cn.fpl1116.mapper"/></mappers>
</configuration>

5、实现一对多的延迟加载(将上面设置的全局延迟加载给注释掉)

编写UserMapper.xml

<?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="cn.fpl1116.mapper.UserMapper"><resultMap id="getUserById2Result" type="cn.fpl1116.pojo.User"><id column="id" property="id"></id><result column="username" property="username"/><result column="address" property="address"/><result column="sex" property="sex"/><result column="birthday" property="birthday"/><!--延迟加载的一对多--><!--property="accountList":属性名ofType="com.by.pojo.Account":集合的泛型,等价于resultTypeselect="com.by.mapper.AccountMapper.selectAccountByUid":要调用的select标签的idcolumn="id":传递给select查询的参数fetchType="lazy":局部开启懒加载--><collection property="accountList"ofType="cn.fpl1116.pojo.Account"select="cn.fpl1116.mapper.AccountMapper.selectAccountByUid"column="id"fetchType="lazy"></collection></resultMap><select id="getUserById2" parameterType="int" resultMap="getUserById2Result"><!-- SELECT u.*, a.id aid, a.uid uid, a.money money FROM user u LEFT JOIN account a ON u.id=a.uid WHERE u.id=#{id}-->select * from user where id=#{id}</select>
</mapper>

在UserMapper.xml中添加select查询语句

<select id="selectAccountByUid" parameterType="int" resultType="cn.fpl1116.pojo.Account">SELECT * FROM account WHERE uid=#{uid}</select>

在UserMapper.java中添加属性

User getUserById2(Integer id);

编写测试类

 @Testpublic void testGetUserById2(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById2(41);System.out.println(user.getUsername());List<Account> accountList = user.getAccountList();for (Account account : accountList) {System.out.println(account);}}

延迟加载运行结果如下:

在这里插入图片描述

6、测试一对多的延迟加载,对比观察输出结果

将测试类中的另一个想要获得的信息给注释掉,如下:

 @Testpublic void testGetUserById2(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById2(41);System.out.println(user.getUsername());//List<Account> accountList = user.getAccountList();//for (Account account : accountList) {//    System.out.println(account);//}}

运行结果如下:

在这里插入图片描述

结论:对比两种运行结果可以得到,延迟加载的使用意义:需要获得什么信息再去执行相应的sql语句,如果不需要获得的信息则不会进行加载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294313.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …

一个简单的 HTTP 请求和响应服务——httpbin

拉取镜像 docker pull kennethreitz/httpbin:latest 查看本地是否存在存在镜像 docker images | grep kennethreitz/httpbin:latest 创建 deployment&#xff0c;指定镜像 apiVersion: apps/v1 kind: Deployment metadata:labels:app: httpbinname: mm-httpbinnamespace: mm-…

ansible的脚本:playbook剧本

&#xff08;一&#xff09;playbook的组成部分 tasks 任务&#xff0c;包含要在主机上执行的操作&#xff0c;使用模块定义这些操作&#xff0c;每一个任务都是一个模块的调用 variables 变量&#xff0c;存储和传递数据&#xff08;和shell脚本中的变量是一个意思&#xf…

什么是Vue.js ? Vue相关介绍

vue介绍 vue官网&#xff1a;Vue.js (vuejs.org) a) Vue.js目前最流行的一个前端框架&#xff0c;三大主流前端框架之一。 b) AngularJS是Vue早期开发的灵感来源。然而&#xff0c;AngularJS 中存在的许多问题&#xff0c;在 Vue 中已经得到解决。 c) Vue.js是一套构…

046.Python包和模块_导入相关

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

MySQL运维实战(1.2)安装部署:使用二进制安装部署

作者&#xff1a;俊达 引言 上一篇我们使用了RPM进行安装部署&#xff0c;这是一种安装快速、简化部署和管理过程、与操作系统提供的包管理工具紧密集成的部署方法。此外&#xff0c;当你需要更高的灵活性和自定义性&#xff0c;并且愿意承担一些额外的手动配置和管理工作&am…

Leetcode 435 无重叠区间

题意理解&#xff1a; 给定一个区间的集合 intervals 要求需要移除区间&#xff0c;使剩余区间互不重叠 目标&#xff1a;最少需要移除几个区间。 解题思路&#xff1a; 采用贪心思路解题&#xff0c;什么是全局最优解&#xff0c;什么是局部最优解。 全局最优解&#xff0c;删…

最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)

最新技术整理3款开源免费直播推流工具&#xff0c;实现实时视频推流、视频拉流&#xff0c;目标端可以是服务器、云平台、移动设备等&#xff08;附源码&#xff09;。 什么是推流&#xff1f; 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源…

2023 Intellij IDEA的热部署配置

第一步&#xff1a;导入依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>第二步&#xff1a;配置idea

基于Python的共享单车数据可视化实战

基于Python的共享单车数据可视化实战 引言数据集与技术选择数据集来源技术选择 分析与可视化功能1. 计算骑行时长2. 计算一天骑行时长3. 计算工作日骑行4. 计算骑行距离5. 用户分类6. 经纬度分析 创新点总结 引言 共享单车在城市交通中发挥着越来越重要的作用&#xff0c;对其…

人大金仓Kingbase数据库备份和还原

前言 最近在项目开发过程中&#xff0c;使用了国产数据库人大金仓&#xff08;即Kingbase数据库&#xff09;&#xff0c;在使用过过程中需要对数据库进行备份与还原&#xff0c;在此对相关的命令进行简单介绍&#xff0c;以备不时之需。 Linux环境下安装人大金仓可参考此篇文…

Pytorch项目,肺癌检测项目之二

diameter_dict{} with open(/xunlian/annotations.csv &#xff0c;‘r’) as f: for row in list(csv.reader(f)[1:]): series_uid row[0] annotationCenter_xyz tuple([float(x) for x in row[1:4]]) annotationDiameter_mm float(row[4]) diameter_dict.setdefault(seri…