MyBatis的延迟加载(十四)下

简介: MyBatis的延迟加载(十四)

四. 将 aggressiveLazyLoading 设置为true 时


<!-- 控制懒加载的 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="true"/>


这个时候,测试运行 findByIdWithSelectF1Test()


20190718194033915.png


发现,并没有延迟加载。 故需要将其字段设置为false 才可以。


五. 在关联处 设置是否延迟加载


有的时候,需要对同一个类 中的不同的属性分别进行设置 是否进行延迟加载, 如 查询员工时,把身份证信息查询出来,把部门延迟加载出来。 故在setting 的 lazyLoadingEnabled 设置总开头时,又设置了一个分开关。 fetchType , 默认为lazy, 延迟加载。 有两个值, lazy 延迟加载, eager 急切加载,即不延迟加载。


如分别设置 身份证为延迟加载, 部门为不延迟加载。


<association property="idCard" javaType="idCard" 
    column="id" select="com.yjl.mapper.IdCardMapper.findByUserId"
    fetchType="lazy">
<association property="dept" javaType="dept"
    column="deptId" select="com.yjl.mapper.DeptMapper.getById"
    fetchType="eager"></association>


这个时候,执行 findByIdWithSelectF1Test() 方法。(aggressiveLazyLoading 已经设置为false 了。)


20190718195044365.png


查询了部门的信息,没有查询身份证信息, 身份证信息被延迟加载了。


六. 部门查询员工的一对多加载


接口上面写过了。


DeptMapper.xml sql语句:


<resultMap type="dept" id="deptCollectionResultMapWithSelect">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="description" column="description"/>
    <!-- 用的是ofType的类型。 -->
    <collection property="allUser" ofType="user" column="id"
    select="com.yjl.mapper.UserMapper.findUserByDeptId"></collection>
  </resultMap>
  <select id="getAllInfoByIdWithSelect" parameterType="int" resultMap="deptCollectionResultMapWithSelect">
    select * from dept where id=#{id}
  </select>


UserMapper.xml 语句:


<resultMap type="user" id="userResultMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="description" column="description"/>
  </resultMap>
  <select id="findUserByDeptId" parameterType="int" resultMap="userResultMap">
    select * from user u where u.deptId=#{deptId}
  </select>


测试方法:


@Test
  public void getAllInfoByIdWithSelectTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class);
    Dept dept=deptMapper.getAllInfoByIdWithSelect(1);
    System.out.println(dept);
  }


测试运行,发现只查询出了 部门的信息,并没有查询出员工的信息。


20190718195440486.png


当使用员工集合时,才会查询。


@Test
  public void getAllInfoByIdWithSelectTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class);
    Dept dept=deptMapper.getAllInfoByIdWithSelect(1);
    System.out.println(dept);
    List<User> allUser=dept.getAllUser();
    allUser.forEach(n ->System.out.println(n));
  }


在调用 getAllUser() 方法时才会查询。


20190718195558788.png


debug 运行的话:


20190718195644461.png


getAllUser() 时进行查询:


2019071819571129.png


输出:


2019071819595073.png


当然,如果想将其改成 不延迟加载,而是立即查询,只需要 fetchType 改成eager 即可。


<!-- 用的是ofType的类型。 -->
    <collection property="allUser" ofType="user" column="id"
    select="com.yjl.mapper.UserMapper.findUserByDeptId"
    fetchType="eager"></collection>


20190718200154537.png


谢谢!!!

相关文章
|
1月前
|
Java 数据库连接 数据库
【Mybatis】mybatis 是否支持延迟加载?
【Mybatis】mybatis 是否支持延迟加载?
|
2天前
|
Java 数据库连接 数据库
MyBatis中的延迟加载与分步查询总结
MyBatis中的延迟加载与分步查询总结
|
1月前
|
存储 缓存 Java
【MyBaits】4、延迟加载、MyBatis 的缓存
【MyBaits】4、延迟加载、MyBatis 的缓存
27 0
|
1月前
|
Java 数据库连接 mybatis
Mybatis中延迟加载~
Mybatis中延迟加载~
|
1月前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
|
10月前
|
SQL Java 数据库连接
【MyBatis】高级映射多对一,一对多和延迟加载
【MyBatis】高级映射多对一,一对多和延迟加载
|
10月前
|
SQL Java 数据库连接
2021-08-06项目实现过程-ssm框架,关联映射,延迟加载,使用注解实现mybatis映射
2021-08-06项目实现过程-ssm框架,关联映射,延迟加载,使用注解实现mybatis映射
49 0
|
11月前
|
SQL Java 数据库连接
Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
73 0
|
11月前
|
Java 数据库连接 mybatis
MyBatis 是否支持延迟加载?怎么实现?什么时候启用?
MyBatis 是否支持延迟加载?怎么实现?什么时候启用?
97 0
|
SQL 存储 XML
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)
290 0
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)