Mybatis懒加载

2023-09-14 13:01:13

懒加载是什么?

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

        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 configuration
        PUBLIC "-//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; //id
	private 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;				//主键ID
	private 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、测试

    @Test
    public 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 :结果如下

 

组合查询时 :结果如下

更多推荐

Spring Cloud Eureka:服务注册与发现

💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!SpringCloudEureka:服务注册与发现SpringCloudEureka是SpringCloud生态系统中的一个组件,它是用于实现服务注册与发现的服务治理组件。在微服务架构中,服务之间存在复杂的依赖关系,而SpringCl

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。有用户反馈,在使用下级平台的海康设备级联到视频监控EasyCVR平台

游戏服务器搭建过程中Maven多模块编译遇到的一些问题

目录1、多模块的创建1.1父模块的创建1.2删除垃圾文件1.3修改pom.xml1.4创建子模块继承2、子模块之间的互相引用3、多个模块间版本的管理3.1dependencis3.2dependencyManagement4、依赖执行5、在SpringBoot项目中加载依赖项目的组件有几种常用的方法5.1.使用@Com

ip地址怎么改网速快

在当今高度依赖互联网的时代,快速稳定的网络连接对于人们的生活和工作至关重要。然而,有时我们可能会遇到网络速度缓慢的问题。虽然更改IP地址并不能直接影响网络速度,但它可以成为改善网络连接的一种策略之一。虎观代理小二二将探讨如何通过更改IP地址来尝试提升网络速度,并提供一些实用的方法与建议。请注意,网络速度受多个因素影响,

MongoDB简介以及安装

文章目录1.MongoDB简介2.NoSQL简介3.MongoDB安装1.MongoDB简介MongoDB是一种NoSQL数据库,采用了文档数据库模型。它以BSON(BinaryJSON)格式存储数据,支持动态模式和灵活的查询语言。MongoDB具有以下特点:文档存储:MongoDB以文档(Document)的形式存储

传统生产者和消费者问题,Sychronized版和Lock版

1.生产者和消费者问题Synchronized版面试:单例模式、排序算法、生产者消费者、死锁packagecom.kuang.pc;/***线程之间的通信问题,生产者和消费者问题!等待唤醒,通知唤醒*线程交替执行AB操作同一个变量num=0*Anum+1;*Bnum-1;*/publicclassA{publicsta

MongoDB差异数据对比的快速指南

MongoDB是一种非关系型数据库,它以灵活的JSON-like文档的形式存储数据,这种特性使其在处理大量数据和实现快速开发时更具有优势。而由于其灵活的数据模型和强大的性能,MongoDB被广泛应用在各种业务场景中。随着业务的发展和数据的增长,如何准确快速地完成MongoDB数据对比成为了一个重要的问题。如何准确快速地

监控办公室电脑用什么软件?

监控办公室员工电脑的工作情况是一项非常重要的管理任务,它可以帮助企业管理者及时发现员工的问题、提高工作效率和保障企业安全。以下是一些具体的方法和步骤,供您参考:1、安装监控软件在监控员工电脑之前,您需要先安装一款专业的监控软件。目前市面上有很多种不同的监控软件,您可以根据自己的需求选择适合自己的软件。比如,如果您想要监

【Rust日报】2023-09-19 为 aho-corasick 添加 aarch64 的 SIMD 实现

为aho-corasick添加aarch64的SIMD实现此次PR主要目的是为Teddy(一个关键的数据结构)添加aarch64的SIMD实现。之前,Teddy使用了x86-64SIMD指令,特别是SSSE3和AVX2。这个PR将Teddy的主要实现重组为一个新的Vectortrait,并为x86-64以及aarch6

代码随想录算法训练营Day46 | 动态规划(8/17) 1.练习题 LeetCode 139.单词拆分 2.多重背包 3. 背包问题总结篇!

背包问题要结束了!首先是今天的练习题,然后是多重背包的知识点,最后对这几天背包问题做一个总结!1.练习题139.WordBreakGivenastringsandadictionaryofstringswordDict,returntrueifscanbesegmentedintoaspace-separatedseq

Linux之Socket函数(详细篇)

本篇是基于Linuxman手册的一些总结socket作用:createanendpointforcommunication函数结构```c#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intsocket(intdomain,inttype,intproto

热文推荐