关联查询


关联元素:association用于表示一对一关系,collection用于表示一对多关系;

(一)关联方式


其实就是查询的思维方式,有两种,在互联网公司中,嵌套查询的用的多一些,嵌套结果用的少一些
假如查询人和工作

ü 1.嵌套结果
使用嵌套结果映射来处理重复的联合结果的子集
嵌套结果就是两个表关联查询出来

| SELECT *
FROM t_user a,
t_job_history b
WHERE a.id = b.user_id; | | —- |



ü 2.嵌套查询


通过执行另外一个 SQL 映射语句来返回预期的复杂类型
就是先查询人,再通过这个人的id去 工作表 里面查询工作

需要查询多次

| SELECT *
FROM tuser ;
SELECT

_FROM t_job_history *WHERE user_id
= 3; | | —- |

(二)一对一关联嵌套结果方式

案例:ZJJMybatis_2019/09/30 3:22:03_inoag



association标签 嵌套结果方式 常用属性:
ü property :对应实体类中的属性名,必填项。
ü javaType :属性对应的 Java 类型 。
ü resultMap :可以直接使用现有的 resultMap ,而不需要在这里配置映射关系。
ü columnPrefix :查询列的前缀,配置前缀后,在子标签配置 result 的 column 时可以省略前缀

1、column 表示数据库user表中的字段card_id;
3、select 表示根据column数据库属性的值作为该方法的参数;
4、javaType表示返回的对象类型

| <resultMap id=”userAndPosition1” extends=”BaseResultMap” type=”TUser”>
<association property=”position” javaType=”TPosition” columnPrefix=”post_”>
<id column=”id” property=”id”/>
<result column=”name” property=”postName”/>
<result column=”note” property=”note”/>
</association>
</resultMap> | | —- |




1.懒加载配置以及加载时机概念

ü 延迟加载配置步骤:
第一步:在mybatis主配置文件中开启延迟加载的支持







第二步:在association和collection标签中使用select和column属性配置查询使用的 语句和参数
关联查询 - 图1
第三步:在association和collection标签中可以通过fetchtype调整加载时机。
取值是lazy和eager
ü 首先先说结论再说原因:
加载策略使用原则:
一对多和多对多
使用延迟加载(按需加载,懒加载)
多对一和一对一
使用立即加载

ü 下面是理由,先思考:
当查询用户的时候,它关联的账户信息要不要一起查出来?
看需求,需要就一起查出来,不需要就不一起查
其实就是按需加载
当查询账户的时候,它关联的用户信息要不要一起加载出来
它也可以使用按需加载,但是通常情况下,我们都会需要用户的信息
所以应该一起查出来
ü 接着思考:
在一对多,多对多的时候:
根据一的一方获取多的一方的时候,采用按需加载(懒加载,延迟加载)
在多对一,一对一的时候
根据多的一方获取一的一方的时候,采用立即加载


2.一对一映射

as别名方式映射

一个用户拥有一个角色,因此先在SysUser类中增加字段
public class SysUser implements Serializable {
/** 用户的角色集合 /

private List roleList;
关联查询 - 图2
关联查询 - 图3
关联查询 - 图4
关联查询 - 图5

resultMap配置一对一映射(麻烦,下面有改进的地方)

关联查询 - 图6
关联查询 - 图7
关联查询 - 图8
关联查询 - 图9
关联查询 - 图10
关联查询 - 图11
关联查询 - 图12

使用resultMap的association标签配置一对一映射

关联查询 - 图13
关联查询 - 图14
关联查询 - 图15
关联查询 - 图16
关联查询 - 图17
关联查询 - 图18

association标签的嵌套查询(延迟加载和立即加载)

关联查询 - 图19
关联查询 - 图20
关联查询 - 图21
关联查询 - 图22
关联查询 - 图23
关联查询 - 图24
关联查询 - 图25
关联查询 - 图26
关联查询 - 图27
关联查询 - 图28
关联查询 - 图29
关联查询 - 图30
关联查询 - 图31
关联查询 - 图32
关联查询 - 图33


(三)一对多关联


collection 支持的属性以及属性的作用和 association 完全相同。mybatis会根据id标签,进行字段的合并,合理配置好ID标签可以提高处理的效率;
开发小技巧:如果要配置一个相当复杂的映射,一定要从基础映射开始配置,每增加一些配置就进行对应的测试,在循序渐进的过程中更容易发现和解决问题 。

案例:ZJJMybatis_2019/09/30 4:03:36_cobo1


1.一对多映射

collection集合的嵌套结果映射

Mybatis在处理结果集的时候,会判断结果是否相同,如果相同的结果,则只会保留第一个结果,Mybatis是根据ResultMap里面的 标签来判断是否是同一条结果.
联合主键时候可以配置多个id标签,因为Mybatis的ReuseMap 只用于配置结果如何映射,并不知道要操作的这个表具体是什么情况,id的唯一作用就是在嵌套的映射配置时判断数据是否相同,当配置id标签时,Mybatis只需要逐条比较所有数据中的id标签配置的字段是否相同即可,在配置嵌套结果查询时,配置id标签可以提高处理效率.
注意,如果没有配置id时候,Mybatis会把所有的resultMap中配置的所有字段进行比较,如果所有的字段的值都系统就合并,如果只要有一个字段值不同,就不合并.

ü 注意
在嵌套结果集配置id属性时,如果查询语句中没有查询id属性配置的列,就会导致id对应的值为null,这种情况下,所有的id值都相同,因此会使嵌套的结果集合中只有一条数据,所以在配置id列时,查询语句中必须包含该列.



1、fetchType 表示是否是懒加载,可以选择eager和lazy,正常情况下,一对多关联的结合对象,都设置为懒加载lazy;
2、property 表示User实体对象中的属性card;
3、select 表示根据column数据库属性的值作为该方法的参数;
4、javaType表示返回的对象类型;


<resultMap type=”com.domain.User” id=”userMap”>
<id column=”id” property=”id”/>
<result column=”username” property=”username”/>
<result column=”sex” property=”sex”/>
<result column=”birthday” property=”birthday”/>
<result column=”address” property=”address”/>
<!— 配置实体中关联的对象是一个集合的标签: collection

  1. property:用于指定属性的名称 (就是主表实体类对应的从表集合名字)
  2. ofType:用于指定集合元素的类型(就是主表实体类对应的从表集合的泛型里面的内容)
  3. javaType:用于指定属性的类型

—>

<collection property=”accounts” ofType=”com.domain.Account”>
<id column=”aid” property=”id”/>
<result column=”uid” property=”uid”/>
<result column=”money” property=”money”/>
</collection>
</resultMap>

collection集合的嵌套查询

关联查询 - 图34
关联查询 - 图35

关联查询 - 图36
关联查询 - 图37



2.多对一建立关系

















(四)多对多关联

要实现多对多的关联,需要满足如下两个条件:
1. 先决条件一:多对多需要一种中间表建立连接关系;
2. 先决条件二:多对多关系是由两个一对多关系组成的,一对多可以也可以用两种方式实现;

案例:ZJJMybatis_2019/09/30 4:11:33_pq213