Mybatis入门笔记(五)

MyBatis的入门笔记(五)

     - 2018年11月16日

MyBatis的懒加载(延迟加载):

以前多表关联查询时,每次都会讲所有数据查一遍,如果紧紧只是需要整个数据中的一张表的数据中的一个字段的信息呢,那该怎么办,这时候就需要懒加载。

1. 需求:查询教室相关信息,有时候仅仅只是需要关联的学生的姓名

Mybatis入门笔记(五)

就如这种,我们一次查询了所有的数据,需要什么信息的时候直接从查询的结果中筛选。但是教室关联的学生很多,这种关联查询就比较耗时耗资源。

 

2. 什么是懒加载:

通俗的讲就是按需加载,我们需要什么的时候再去进行什么操作。而且先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

在MyBatis的中,结果映射可以实现高级映射(使用关联,集合实现一对一及一对多映射),关联,集合具备延迟加载功能。

 

3. 启用懒加载:

<! - 要使延迟加载生效必须配置下面两个属性- >
<! -
全局性设置懒加载。如果设为'false',则所有相关联的都会被初始化加载- >
< 设定名称=“lazyLoadingEnabled” value =“true” />
<! - 当设置为真的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载- >
< setting name = “aggressiveLazyLoading” value =“false” />
<! - 指定日志记录- >
< setting name =“logImpl” value =“LOG4J” />

<!-- 要使延迟加载生效必须配置下面两个属性 -->
        <!--全局性设置懒加载。如果设为'false',则所有相关联的都会被初始化加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--当设置为true的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--指定日志记录-->
        <setting name="logImpl" value="LOG4J" />

首先需要每个表映射实体类:

Mybatis入门笔记(五)

在创建接口加载mapper.xml文件,这都是基本操作。

Mybatis入门笔记(五)

这里将以前的关联查询的所有SQL删掉,直接查询所有的信息。

 

Studentmapper.xml:

Mybatis入门笔记(五)

通过teacherid查询所有学生的信息,返回列表<>集合

Mybatis入门笔记(五)

Wife.xml:也是同样的操作。

 

在TeacherMapper.xml:

Mybatis入门笔记(五)

<!--实现懒加载-->
    <!--使用resultMap映射实体类和字段之间的一一对应的关系-->
    <resultMap id="teacherMap" type="Teacher" autoMapping="true">
        <!--一对一的关联查询-->
        <association property="wife" select="org.robert.mapper.WifeMapper.getByTeacherid" column="id" fetchType="lazy"></association>
        <!--一对多的关联查询-->
        <collection property="stu" select="org.robert.mapper.StudentMapper.getByTeacherid" column="id" fetchType="lazy">
        </collection>
    </resultMap>

中实现懒加载查找每个映射类的方法。

 

测试:

测试:查询老师关联的学生信息的姓名

Mybatis入门笔记(五)

 

Log4j的:打印的日志:

Mybatis入门笔记(五)

先用ID去查询老师的信息,然后用老师的ID信息去查询学生。

这样就没有查询妻子的信息。