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

 

组合查询时 :结果如下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis懒加载是一种延迟加载的机制,只有在需要使用关联对象时才会进行加载。在Mybatis中,懒加载主要应用于关联查询,通过设置延迟规则,推迟对关联对象的查询,减轻数据库的压力。懒加载只对关联对象有延迟设置,而不会延迟主对象的查询。\[1\] 要开启懒加载,需要在Mybatis的主配置文件中的settings标签中设置lazyLoadingEnabled为true。同时,可以设置aggressiveLazyLoading为false来控制懒加载的行为。\[3\] 需要注意的是,开启懒加载是全局的设置,即对所有关联对象都生效。如果只想对部分关联对象进行懒加载,可以使用association和collection的fetchType属性来覆盖全局的懒加载状态。fetchType属性可以设置为eager表示立即加载,lazy表示使用懒加载。\[3\] 总结来说,Mybatis懒加载是一种延迟加载机制,可以减轻数据库的压力。通过在主配置文件中设置相关属性,可以控制懒加载的行为,包括全局开启懒加载、设置懒加载的延迟规则以及对部分关联对象进行懒加载。\[1\]\[3\] #### 引用[.reference_title] - *1* [Mybatis懒加载](https://blog.csdn.net/qq_52519008/article/details/127118918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [八、(了解即可)MyBatis懒加载(或者叫延迟加载)](https://blog.csdn.net/a924382407/article/details/130505098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MyBatis懒加载](https://blog.csdn.net/layonly/article/details/120719900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚人钊呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值