1.背景:
在涉及到数据库操作时,常常遇到多表联合查询问题,在java中就涉及到了POJO类(数据库表的映射类)的关联,在Mybatis中也提供了关联映射,解决多表联合查询的问题
根据数据库中表与表的关系,主要分为一对一,一对多、多对多 3种情况:
2.一对一:
利用<resultMap>
元素 的 <association>
子元素来处理一对一的关联关系
Mybatis针对一对一的关联关系,提供了两种实现方式:
嵌套查询
(是在查询SQL中嵌入一个子查询,在查询过程中,会执行多条SQL语句,但单个SQL语句的编写较为简单)
其中,<resultMap>
元素的
type属性:指定java中的类作为查询结果的返回类型;
id属性:是resultMap的唯一标识,供Select定义的SQL关联使用;
id子元素:在于标识主键,property、column分别表示POJO类的属性、数据库表的字段;
&emsp**;result子元素**:property、column分别表示POJO类的属性、数据库表的字段;
association子元素:
property属性:指定POJO类的属性名;
column属性:指定数据库表的字段名称;
&emsp**;javaType属性**:指定映射到POJO类的属性的数据类型(这里一般是一对一关联的另一个POJO类名(如本例的Idcard))
select属性:指定引入的嵌套查询的子查询语句;
fetchType属性:指定在联合查询时,是否启用延迟加载,属性值分为“lazy”、“eager”两个,默认为lazy,即启用延迟加载(一定程度上,可以提高查询效率)
demo:
一个人的信息(年龄、性别,身份证号码),其中,身份证号码存在数据库表的另一张表中,两张表通过id关联
嵌套结果(是执行一个嵌套多表的查询SQL,查询中只会执行一条SQL语句,但是SQL的编写较为复杂)
该种方法,相对于嵌套查询,主要难点在于编写SQL语句,用到的属性及元素在嵌套查询中,均已说明;
不同的是:
嵌套查询在association子元素中的select属性指定的子查询;
嵌套结果中,则直接将身份证号码也就是Person类的card属性,通过association元素的javaType属性直接与Idcard这个POJO类关联
demo:
如果还是混乱,看大图:
3.一对多
Mybatis利用<resultMap>
元素的<collection>
子元素来处理一对多的关联
<collection>
的大部分属性 与 <association>
相同,不同的是,<collection>
元素还有一个属性 ofType。
<collection>
的ofType属性 与 javaType 对应,用于指定POJO类中 集合类属性所包含的元素类型(即 List 中的 T)
demo(也可以分为嵌套查询和嵌套结果两类的,此处是嵌套结果的):
4.多对多
这个就和一对多 基本 一直了,区别只是在于 嵌套查询的子查询的SQL写法了
5.写在最后:
Mybatis的延迟加载在一定程度上,降低运行消耗并提高查询效率,在Mybatis的核心配置一般没有开启延迟加载,可以在核心配置文件mybatis-config.xml文件 <configuration>
根节点下,添加 <settings>
子元素(忘了就看看 2.2):
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false" />
</settings>
配置开启延迟加载,在配置文件中配置延迟加载后,就无需配置映射文件的 resultMap > association > fetchType属性了