mybatis中的延迟加载类型及设定详解

 更新时间:2023年10月27日 10:30:08   作者:guo123shuang  
这篇文章主要介绍了mybatis中的延迟加载类型及设定详解,MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询,延迟加载可以有效的减少数据库压力,需要的朋友可以参考下

概念

MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

延时加载类型及设定

通过对全局参数:lazyLoadingEnabled进行设置,默认就是false。 进行设置修改延时加载状态

直接加载: 执行完对主加载对象的select语句,马上执行对关联对象的select查询。

<settings>
    <!-- 延迟加载总开关 -->
    <setting name="lazyLoadingEnabled" value="false"/>
</settings>

侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的

某个属性(该属性不是关联对象的属性)时,就会马上执行关联对象的select查询。

<settings>
    <!-- 延迟加载总开关 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 侵入式延迟加载开关 -->
    <setting name="aggressiveLazyLoading" value="true"/>
</settings>

**深度延迟:**执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。

<settings>
    <!-- 延迟加载总开关 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 侵入式延迟加载开关 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

优缺点

  • 深度延迟加载的使用会提升性能。
  • 如果延迟加载的表数据太多,此时会产生N+1问题,主信息加载一次算1次,而从信息是会根据主信息传递过来的条件,去查询从表多次。

延时加载实例

需要校验的是 深度延迟的时候直接调用bankCardList是否有问题

​ 首先我们先思考一个问题,假设:在一对多中,我们有一个用户,他有10张银行卡。

问题1:在查询用户的时候,要不要把关联的银行卡查出来?

问题2:在查询银行卡的时候,要不要把关联的用户查出来?

用户类及银行卡类

public class User implements Serializable{
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<BankCard> cardList;

    get和set方法省略.....      
}


public class BankCard implements Serializable{
    private Integer id;
    private Integer uid;
    private String cardNo;

    get和set方法省略.....      
}

dao层接口

/**
     * 查询所有的用户
     *
     * @return
     */
    List<User> findAll();


xml配置

<resultMap id="userAccountMap" type="com.example.domain.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="birthday" column="birthday"/>
    <result property="sex" column="sex"/>
    <result property="address" column="address"/>
    <collection property="bankCardList" ofType="com.example.domain.BankCard" column="id"
                select="com.example.dao.BankCardDao.findAllByUid"/>
</resultMap>
<select id="findAll" resultMap="userAccountMap">
    SELECT * FROM USER;
</select>

**注意:**主要的功能实现位于中,对于银行卡列表的信息通过collection集合来映射,通过select指定集合中的每个元素如何查询,在本例中select的属性值为BankCardDao.xml文件的namespace com.example.dao.AccountDao路径以及指定该映射文件下的findAllByUid方法,通过这个唯一标识指定集合中元素的查找方式。因为在这里需要用到根据用户ID查找账户,所以需要同时配置一下findAllByUid方法的实现。

BankCardDao的实现

 /**
     * 根据用户ID查询账户信息
     * @return
     */
    List<BankCard> findAllByUid(Integer uid);

BankCardDao.xml

 
<select id="findAllByUid" resultType="com.example.domain.BankCard">
        SELECT * FROM bank_card WHERE uid = #{uid};
 </select>

mybatis开启全局延迟加载配置

configuration>
    <settings>
        <!--开启全局的懒加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭立即加载,其实不用配置,默认为false-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--开启Mybatis的sql执行相关信息打印-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>


    <typeAliases>
        <typeAlias type="com.example.domain.Account" alias="account"/>
        <typeAlias type="com.example.domain.User" alias="user"/>
        <package name="com.example.domain"/>
    </typeAliases>


    <environments default="test">
        <environment id="test">
            <!--配置事务-->
            <transactionManager type="jdbc"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件的路径-->
    <mappers>
        <mapper resource="com/example/dao/UserDao.xml"/>
        <mapper resource="com/example/dao/AccountDao.xml"/>
    </mappers>
</configuration>

到此这篇关于mybatis中的延迟加载类型及设定详解的文章就介绍到这了,更多相关mybatis中的延迟加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现字符串倒序输出的四种方法汇总

    Java实现字符串倒序输出的四种方法汇总

    这篇文章主要介绍了Java实现字符串倒序输出的四种方法汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)

    MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)

    树形结构数据在开发中十分常见,比如:菜单数、组织树, 利用 MyBatis 提供嵌套查询功能可以很方便地实现这个功能需求。本文主要介绍了两种方法,感兴趣的可以了解一下
    2021-09-09
  • Java的@Repeatable注解使用详细解析

    Java的@Repeatable注解使用详细解析

    这篇文章主要介绍了Java的@Repeatable注解使用详细解析,java8新增了注解@Repeatable,在hibernate-validator的源码注解如@MAX、@NotNull等中,有@Repeatable注解的使用,需要的朋友可以参考下
    2024-02-02
  • Java Spring @Lazy延迟注入源码案例详解

    Java Spring @Lazy延迟注入源码案例详解

    这篇文章主要介绍了Java Spring @Lazy延迟注入源码案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java利用endorsed如何覆盖jdk提供的类详解

    Java利用endorsed如何覆盖jdk提供的类详解

    这篇文章主要给大家介绍了关于Java利用endorsed如何覆盖jdk提供的类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 使用Swagger2实现自动生成RESTful API文档

    使用Swagger2实现自动生成RESTful API文档

    在开发 RESTful API 的过程中,文档是非常重要的一部分,可以帮助开发者了解 API 的功能和使用方法,本文将使用Swagger2 实现自动生成 RESTful API 文档,需要的可以参考一下
    2023-06-06
  • Java获取视频时长、大小的示例

    Java获取视频时长、大小的示例

    这篇文章主要介绍了Java获取视频时长、大小的示例,帮助大家利用Java处理视频,完成需求,感兴趣的朋友可以了解下
    2020-11-11
  • elasticsearch聚合查询实践示例

    elasticsearch聚合查询实践示例

    这篇文章主要为大家介绍了elasticsearch聚合查询实践示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 使用Java和ffmpeg把音频和视频合成视频的操作方法

    使用Java和ffmpeg把音频和视频合成视频的操作方法

    这篇文章主要介绍了使用Java和ffmpeg把音频和视频合成视频,本文通过实例代码给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • JAVA实现异步调用实例代码

    JAVA实现异步调用实例代码

    在java平台,实现异步调用的角色主要三种角色:调用者、取货凭证、真实数据。本篇文章给大家介绍java实现异步调用实例代码,需要的朋友可以参考下
    2015-09-09

最新评论