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语句只有在实际中去认真仔细考量和权衡。

时间: 2024-10-25 20:23:47

MyBatis之级联小结的相关文章

MyBatis动态SQL小结

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: 等线 } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm } Mybati

MyBatis之级联——一对多关系

上次我们讲到了MyBatis的一对一关系的表示,简单回顾一下一对一关系就是一个学生只有一个学生证.那么什么是一对多关系呢?一个学生有多个课程这就是一对多的关系.我们结合上一章中的学生和学生证,在此基础上新增一个课程表和课程成绩表.学生对应课程表是一对多的关系,在学生确定的情况下课程表对应课程成绩是一对一的关系.我们先来看看我们所假设的场景数据结构的设计. 数据库的ER图如下(因为对数据库还处于菜鸟阶段--所以可能ER图绘制有误,但不影响我们讲解MyBatis一对多关系的级联): 再看看数据库的物

MyBatis之级联——一对一关系

在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系的,我们就暂且先介绍一对一关系.所谓一对一关系其实在生活中很常见,比如一个学生有且只对应一个属于他的学生证.下面就是我们的所假设的数据库物理模型. 在这个数据库模型中,学生证和学生表是1对1的关系.那么基于此,我们会在Java代码的POJO包中就会有两个POJO对象,Student和SelfCard

mybatis之级联关系(一对一、一对多)

1. 一对一关系 1.1 entiry 1.1.1 TPersonInfo.java package com.blueStarWei.entity; public class TPersonInfo { private Integer id; private String name; private Integer age; private Address address; //setter & getter @Override public String toString() { return

SQL mybatis动态查询小结

动态返回mysql某张表指定列的名字 <select id="queryColumns" resultType="map" parameterType="java.util.HashMap"> select column_name columnName, data_type dataType, column_comment columnComment from information_schema.columns where tabl

mybatis 级联

级联是一个数据库实体的概念.一对多的级联,一对多的级联,在MyBatis中还有一种被称为鉴别器的级联,它是一种可以选择具体实现类的级联. 级联不是必须的,级联的好处是获取关联数据十分便捷,但是级联过多会增加系统的复杂度,同时降低系统的性能,此增彼减,所以当级联的层级超过3层时,就不要考虑使用级联了,因为这样会造成多个对象的关联,导致系统的耦合.复杂和难以维护.在现实的使用过程中,要根据实际情况判断是否需要使用级联. MyBatis中的级联 MyBatis的级联分为3种. •鉴别器(discrim

mybatis 中 sql 映射文件 select 标签以及 入 resultMap 标签的应用

1.自定义某个 javabean 的封装规则: 注:可以看到,select 标签中引用了 定义好的 resultMap 的值.resultMap 标签中的 type 为javabean 类型,id 为唯一标识.id 子标签定义主键(这样定义底层会有优化.)column 属性为字段名,property 属性为字段值. 注:可以看到测试结果没有出现问题,说明代码没有错误. 2.自定义某个 javabean 的级联属性封装: a.准备工作:mysql 数据库中,在之前 tbl_employees 表的

Mybatis 查询小技巧

在大部分的数据库设计中,为了方便数据表的维护和查询,都会用使用list+detail 的方式,例如:订单表+订单详情表.但是,这样在查询上,这个时候,用mybatis的级联查询,就回方便很多. 使用级联查询步骤: 1.设置returnMap, 2.<resultMap type="hashmap" id="aMap"> <id property="SUPPLIER_ID" column="SUPPLIER_ID&quo

MyBatis 使用接口增删改查和两表一对一级联查询

导包 总配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties re