• Mybatis懒加载


    懒加载是什么?

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

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

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

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


    举例:

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

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

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

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

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

    Mybatis懒加载实例

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

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "https://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <properties resource="database.properties">properties>
    7. <settings>
    8. <setting name="logImpl" value="STDOUT_LOGGING"/>
    9. <setting name="autoMappingBehavior" value="FULL"/>
    10. <setting name="lazyLoadingEnabled" value="true"/>
    11. settings>
    12. <typeAliases>
    13. <package name="com.hz.pojo"/>
    14. typeAliases>
    15. <environments default="smbms">
    16. <environment id="smbms">
    17. <transactionManager type="JDBC"/>
    18. <dataSource type="POOLED">
    19. <property name="driver" value="${driver}"/>
    20. <property name="url" value="${url}"/>
    21. <property name="username" value="${user}"/>
    22. <property name="password" value="${password}"/>
    23. dataSource>
    24. environment>
    25. environments>
    26. <mappers>
    27. <mapper resource="mappers/AddressMapper.xml"/>
    28. <mapper resource="mappers/UserMapper.xml"/>
    29. mappers>
    30. configuration>

    2、创建实体类等

    1. package com.hz.pojo;
    2. import lombok.Data;
    3. import java.io.Serializable;
    4. import java.util.List;
    5. @Data
    6. public class User implements Serializable {
    7. private Long id; //id
    8. private String userCode; //用户编码
    9. private String userName; //用户名称
    10. private String userPassword; //用户密码
    11. private Integer gender; //性别
    12. private String birthday; //出生日期
    13. private String phone; //电话
    14. private String address; //地址
    15. private Integer userRole; //用户角色
    16. private Integer createdBy; //创建者
    17. private String creationDate; //创建时间
    18. private Integer modifyBy; //更新者
    19. private String modifyDate; //更新时间
    20. private Role role; //用户角色对象
    21. private List
      addressList; //收货地址集合
    22. }
    1. package com.hz.pojo;
    2. import lombok.*;
    3. @Setter
    4. @Getter
    5. @NoArgsConstructor //无参构造方法
    6. @AllArgsConstructor //有参构造方法
    7. @ToString
    8. public class Address {
    9. private Long id; //主键ID
    10. private String postCode; //邮编
    11. private String contact; //联系人
    12. private String addressDesc; //地址
    13. private String tel; //联系电话
    14. private Integer createdBy; //创建者
    15. private String creationDate; //创建时间
    16. private Integer modifyBy; //更新者
    17. private String modifyDate; //更新时间
    18. private User user; //所属用户对象
    19. }

    3、创建Dao接口和XML文件

    1. <resultMap id="userMap1" type="User">
    2. <id property="id" column="id"/>
    3. <collection property="addressList" column="id" ofType="Address" select="getAdd" fetchType="lazy">
    4. <id property="id" column="id"/>
    5. collection>
    6. resultMap>
    7. <select id="findUserList1" resultMap="userMap1">
    8. select * from smbms_user
    9. select>
    10. <select id="getAdd" resultType="Address">
    11. select * from smbms_address where userId = #{id}
    12. select>

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

    4、测试

    1. @Test
    2. public void findUserList1() {
    3. SqlSession sqlSession = MyBatisUtil.createSqlSession();
    4. UserDao userDao = sqlSession.getMapper(UserDao.class);
    5. List userList = userDao.findUserList1();
    6. for (User u :userList) {
    7. System.out.println("userName:"+u.getUserName());
    8. }
    9. //调用地址
    10. // List userList = userDao.findUserList1();
    11. // for (User u :userList) {
    12. // List
      addressList = u.getAddressList();
    13. // System.out.println("userName:"+u.getUserName());
    14. // for (Address address :addressList) {
    15. // System.out.println("addressName:"+address.getContact());
    16. // }
    17. // }
    18. }

    只查询 UserName :结果如下

     

    组合查询时 :结果如下

  • 相关阅读:
    Kafka - This server does not host this topic-partition
    探索Java异常处理的奥秘:源码解析与高级实践
    【21】面向流水线的指令设计(下):奔腾4是怎么失败的?
    2024年腾讯云2核2G4M服务器并发承载能力大测试:性能数据一览无余!
    智能水电表对于普通居民来说有哪些好处?
    Java笔记:Volatile
    Redis缓存相关问题
    【LeetCode】2562. 找出数组的串联值
    HTTP协议概览
    CentOS7环境下定时任务执行不成功的排查
  • 原文地址:https://blog.csdn.net/qq_44114187/article/details/132873043