MyBatis之级联小结

简介:

在这之前我们知道了MyBatis为我们提供了三种级联:一对一关系(assocation)、一对多关系(collection)、鉴别器(discriminator)。在最后一个鉴别器例子中,看到了当层级关系比较负责时,我们似乎已经难以应对和维护各种级联关系,在对数据库进行查询是否应用MyBatis为我们提供的级联这需要在实际中去斟酌和取舍。在我们通过级联来查询信息时会发现有一个问题,当我们只想查询出学生的普通信息(姓名、性别),而不想查询出他的成绩、课程、体检表时,之前的三个例子不管你是否需要成绩、课程等信息它都会去执行,只要有一个关联。这并不是我们所想要的,我们所想要的是,我需要时才去执行这条sql,我需要成绩时才将此条sql发送到数据库查询出结果,不需要时就不需要发送到数据库进行查询。很高兴的是,MyBatis为我们提供了这一需求,即:lazyLoadingEnabled。

我们在mybatis-config.xml配置文件中做一下配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 --></settings>

这句话的意思就是我们上面所要想达到的效果——按需加载。但其实只有这么一句话是不够的,MyBatis的延迟加载方式是按层级延迟加载。

当我们在查询学生的基本信息时,MyBatis会根据鉴别器去找到健康情况。而在当我们访问课程成绩时,由于学生证和课程成绩出于同一层级,所以学生证也会跟着被加载。只有课程不是和课程成绩出于同一层级,所以它不会被加载。这还没有达到我们想要的“按需加载”效果,我们所想要达到的按需加载是真正只有用到的时候才会去加载。这个时候就需要在刚刚的配置文件中再做以下的配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</
settings>

attressiveLazyLoading配置项,意思就是这个意思——侵略性延迟加载。

这实际上是在mybatis-config.xml文件中做的全局配置,当想要针对某些属性进行延迟加载,对某些属性进行立即加载时,我们可以细化到具体的mapper映射配置文件中去。例如StudentMapper.xml:

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper  
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="day_8_mybatis.mapper.StudentMapper"> 6     <resultMap type="day_8_mybatis.pojo.Student" id="studentMap"> 7         <id property="id" column="id"/> 8         <result property="name" column="name"/> 9         <result property="sex" column="sex"/>10         <association property="selfCard" column="id" select="day_8_mybatis.mapper.SelfCardMapper.findSelfCardByStudentId" fetchType="lazy"/>11         <collection property="courseScoreList" column="id" select="day_8_mybatis.mapper.CourseScoreMapper.findCourseScoreByStudentId" fetchType="eager"/>12         <discriminator javaType="string" column="sex">13             <case value="男" resultMap="maleStudentMap"/>14             <case value="女" resultMap="femaleStudentMap"/>15         </discriminator>16     </resultMap>17 <!--以下省略-->

在第10行中我们对查询出学生的学生证信息配置为延迟加载,第11行中我们对查询出学生的课程成绩做了立即加载配置。

以上几乎就是MyBatis级联的全部内容,至于用级联还是用sql的join语句只有在实际中去认真仔细考量和权衡。





      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1929699,如需转载请自行联系原作者




相关文章
|
7月前
|
SQL Java 数据库连接
19MyBatis - MyBatis修改操作
19MyBatis - MyBatis修改操作
30 0
|
7月前
|
XML Java 数据库连接
mybatis之配置优化and映射器~
mybatis之配置优化and映射器~
mybatis之配置优化and映射器~
|
6月前
|
SQL 安全 Java
Mybatis之动态SQL及映射结果
Mybatis之动态SQL及映射结果
69 0
|
7月前
|
SQL Java 数据库连接
Mybatis系列(五)之Mybatis的关系关联配置
Mybatis系列(五)之Mybatis的关系关联配置
|
3天前
|
SQL Java 数据库连接
MyBatis 初识简单操作
MyBatis 初识简单操作
8 0
|
SQL Java 数据库连接
Mybatis-各标签解读以及增删改查
Mybatis-各标签解读以及增删改查
|
SQL Java 数据库连接
跟我一起学mybatis之注解开发多表操作
跟我一起学mybatis之注解开发多表操作
129 0
跟我一起学mybatis之注解开发多表操作
|
XML Java 数据库连接
Mybatis:Mybatis注解开发单表操作(代码实例)
Mybatis:Mybatis注解开发单表操作(代码实例)
128 0
Mybatis:Mybatis注解开发单表操作(代码实例)
|
SQL Java 数据库连接
MyBatis注解开发之一对多查询
MyBatis注解开发之一对多查询
186 0
MyBatis注解开发之一对多查询
|
SQL Java 数据库连接
MyBatis注解开发之多对多查询
MyBatis注解开发之多对多查询
180 0
MyBatis注解开发之多对多查询