Mybatis懒加载

懒加载是什么?

        按需加载所需内容,当调用到关联的数据时才与数据库交互否则不交互,能大大提高数据库性能,并不是所有场景下使用懒加载都能提高效率。

        Mybatis懒加载:resultMap里面的association、collection有延迟加载功能

懒加载针对什么使用?为什么要用懒加载?

        懒加载针对级联使用的,懒加载的目的是减少内存的浪费和减轻系统负担


举例:

查询所有用户信息(其下有多个收货地址)

select b.id ,b.userName,b.userCode,a.*
from smbms_address a right join smbms_user b on a.userId = b.id

进行分步查询:当我需要查看地址的时候加载收货地址信息

-- 查询所有用户信息
select * from smbms_user
-- 查询地址信息
select * from smbms_address where userId = #{id}

以上为单表查询,效率相对于大数据量的关联查询要高

Mybatis懒加载实例

1、在 Mybatis 主配置文件中开启懒加载

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入properties文件--><properties resource="database.properties"></properties><!--配置打印sql语句--><settings><setting name="logImpl" value="STDOUT_LOGGING"/><!--在mybatis主配置文件中关闭自动映射--><!--NONE  FULL全映射--><setting name="autoMappingBehavior" value="FULL"/><!-- 开启懒加载(延迟加载) --><setting name="lazyLoadingEnabled" value="true"/></settings><!--起别名--><typeAliases><package name="com.hz.pojo"/></typeAliases><!--可以起多个environments--><environments default="smbms"><environment id="smbms"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mappers/AddressMapper.xml"/><mapper resource="mappers/UserMapper.xml"/></mappers></configuration>

2、创建实体类等

package com.hz.pojo;import lombok.Data;import java.io.Serializable;
import java.util.List;@Data
public class User implements Serializable {private Long id; //idprivate String userCode; //用户编码private String userName; //用户名称private String userPassword; //用户密码private Integer gender;  //性别private String birthday;  //出生日期private String phone;   //电话private String address; //地址private Integer userRole;    //用户角色private Integer createdBy;   //创建者private String creationDate; //创建时间private Integer modifyBy;     //更新者private String modifyDate;   //更新时间private  Role role;	//用户角色对象private List<Address> addressList; //收货地址集合}
package com.hz.pojo;import lombok.*;@Setter
@Getter
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //有参构造方法
@ToString
public class Address {private Long id;				//主键IDprivate String postCode; 		//邮编private String contact;			//联系人private String addressDesc;		//地址private String tel;				//联系电话private Integer createdBy; 		//创建者private String creationDate; 	//创建时间private Integer modifyBy; 		//更新者private String modifyDate;		//更新时间private User user;  			//所属用户对象}

3、创建Dao接口和XML文件

   <!--懒加载--><resultMap id="userMap1" type="User"><id property="id" column="id"/><!-- 一对多  对象套集合 --><collection property="addressList" column="id" ofType="Address" select="getAdd" fetchType="lazy"><id property="id" column="id"/></collection></resultMap><select id="findUserList1" resultMap="userMap1">select * from smbms_user</select><select id="getAdd" resultType="Address">select * from smbms_address where userId = #{id}</select>

因为 User表与 Address表 是一对多关联,所以使用resultMap的collection映射,在collection标签中,添加属性fetchType,属性值为lazy,表示懒加载。

4、测试

    @Testpublic void findUserList1() {SqlSession sqlSession = MyBatisUtil.createSqlSession();UserDao userDao = sqlSession.getMapper(UserDao.class);List<User> userList = userDao.findUserList1();for (User u :userList) {System.out.println("userName:"+u.getUserName());}//调用地址
//        List<User> userList = userDao.findUserList1();
//        for (User u :userList) {
//            List<Address> addressList = u.getAddressList();
//            System.out.println("userName:"+u.getUserName());
//            for (Address address :addressList) {
//                System.out.println("addressName:"+address.getContact());
//            }
//        }}

只查询 UserName :结果如下

 

组合查询时 :结果如下

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

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

相关文章

cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

cmake定义的target有两个名字类似的属性&#xff1a;POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE&#xff0c;本文说明它们的含义和区别 -fPIC 介绍POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE属性前先介绍一下-fPIC编译选项。 -f…

CloudCompare 二次开发(14)——高斯滤波

目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare与PCL的混合编程实现点云高斯滤波。高斯滤波的算法原理见:PCL 高斯滤波。 二、代码集成 1、mainwindow.h文件public中添加: void doActionPCLGassFilter(); // 高斯滤波2、mainwindow.cpp文件中添加头文…

视频文本检索(ICCV 23):Unified Coarse-to-Fine Alignment for Video-Text Retrieval

论文作者&#xff1a;Ziyang Wang,Yi-Lin Sung,Feng Cheng,Gedas Bertasius,Mohit Bansal 作者单位&#xff1a;UNC Chapel Hill 论文链接&#xff1a;http://arxiv.org/abs/2309.10091v1 项目链接&#xff1a;https://github.com/Ziyang412/UCoFiA 内容简介&#xff1a; …

音视频 SDL简介

一、SDL简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;是一套开放源代码的跨平台多媒体开发库&#xff0c;使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的代码就可以开发出跨多个平台&#xff08;Linux、Win…

Win10专业版开启远程桌面

Win10专业版开启远程桌面 方法一&#xff1a; 一、按“Win R”键&#xff0c;然后输入“sysdm.cpl”并按下回车键打开系统属性。 二、选择“远程”选项卡&#xff0c;在远程桌面中勾选“允许远程连接到此计算机”就可以开启远程桌面&#xff1b; 方法二&#xff1a; 一、打…

Rxjs操作符理解篇

创建运算符 ajax bindCallback: 把回调 API 转化为返回 Observable 的函数 bindNodeCallback: 把 Node.js 式回调 API 转换为返回 Observable 的函数。 defer empty from fromEvent fromEventPattern generate interval of range throwError timer iif 调度器 queue: 接受三…

【Python深度学习】深度学习框架Tensorflow、Pytorch介绍

深度学习已经成为了人工智能领域的一股重要力量&#xff0c;而深度学习框架则是在这个领域中进行研究和应用的必备工具。常见的深度学习框架包括TensorFlow、PyTorch、Keras、Theano和Caffe等&#xff0c;其中TensorFlow和PyTorch是最受欢迎的两个框架。本文将着重介绍这两个框…

IP代理与加速器:理解它们的区别与共同点

在网络使用过程中&#xff0c;我们经常会遇到需要提高访问速度或保护隐私的需求。IP代理和加速器都是常见的应对方案&#xff0c;但它们在工作原理和应用场景上存在一些区别。本文将为您深入探讨IP代理和加速器的异同&#xff0c;帮助您更好地理解它们的作用和适用情况&#xf…

评价指标分类

声明 本文是学习GB-T 42874-2023 城市公共设施服务 城市家具 系统建设实施评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了城市家具系统建设实施的评价原则、评价流程&#xff0c;给出了评价指标&#xff0c;描述了 方…

visual studio 安装包丢失或损坏

visual studio 安装包丢失或损坏 如下图所示为vs2015报错信息。 解决方案&#xff1a; 找到镜像文件或者压缩包的解压位置&#xff1b; 路径&#xff1a;C:\Users\Administrator\Desktop\packages 复制该路径至上图的请提供搜索包的位置。

如何自动获取短信验证码?

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题&#xff0c;进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…

【Vue】Vue中lauch.js的详细介绍,各个参数的内涵

"lauch.js" 在 Vue 中是一个启动文件&#xff0c;通常用来创建 Vue 实例并配置一些默认设置。 下面是常见的 "lauch.js" 参数及其意义&#xff1a; el&#xff1a;表示要挂载的元素&#xff0c;通常是一个字符串或者一个 DOM 对象。 router&#xff1a;表…

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播 SV-2102VP和 SV-2103VP网络音频模块是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 本系列模块可以应用于以下领域&#xff1a; • 各种商…

1.6python基础语法——输出

作用&#xff1a;程序输出内容给用户 1&#xff09;格式化符号 格式符号转换%s字符串%d有符号的十进制整数%f浮点数%c字符%u无符号十进制整数%o八进制整数%x十六进制整数&#xff08;小写ox&#xff09;%X十六进制整数&#xff08;大写OX&#xff09;%e科学计数法&#xff08…

selenium自动化测试-登录网站用户

昨天学习了selenium自动化测试工具的入门&#xff0c;知道了Selenium是用于自动化控制浏览器做各种操作&#xff0c;打开网页&#xff0c;点击按钮&#xff0c;输入表单等等。 今天学习通过selenium自动化测试工具自动登录某网站用户操作。 第一步&#xff1a;确定目标网址 …

【C++进阶】:哈希

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 l o g 2 N log_2N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的…

【C++面向对象侯捷】4.参数传递与返回值

文章目录 构造函数放在 private&#xff1f;>单例模式 const member functions(常量成员函数) > 不会改变数据内容的&#xff0c;加上const参数传递&#xff1a;pass by value vs. pass by reference(to const)【最好传引用&#xff0c;占用空间小】返回值传递&#xff1…

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库&#xff0c;用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式&#xff0c;并提供从图像中​​读取多个字符和字体、粗体和斜体样式…

vue3 知识点(二)

1: 隐藏dom节点 ​ v-if 是注释掉dom节点 ​ v-show 只是改变css样式&#xff1a;display:none&#xff0c;如果对性能有高要求的话&#xff0c;可以使用v-show 2: 点击事件 click 可以把click 改成动态的 [event] <a-button type"primary" [event]"hand…

CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存&#xff0c;也是一层一层的&#xff0c;能不访问后端真正的源&#xff0c;就不打扰它。 在没有 CDN 的情况下&#xff0c;用户向浏览器输入 www.web.com 这个域名&#xff0c;客户端访问本地 DNS 服务器的时候&#xff0c;如果本地 DNS 服务…