Mybatis嵌套查询和嵌套结果查询总结

嵌套结果查询参考:

https://www.cnblogs.com/

luxiaoxun/p/4035276.html

嵌套查询参考:

http://199604.com/709

首先要了解对象的三种关联方式

*数据库表的关联关系有三种,一对一,一对多,多对多

一对一   是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段

一对多   是通过在“多”的一方,添加“一”的一方的主键作为外键

多对多   是通过一张中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键

*在java类中关联关系也有三种,一对一,一对多,多对多

一对一   在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a

一对多   一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a

多对多   在A类中定义B类类型的集合,在B类中定义A类类型的集合

1

三种关联guan关系都有两种关联查询的方式,嵌套查询,嵌套结果

*Mybatis的yanc延迟加载配置

在全局配置文件中加入下面代码

<settings>

<setting name=”lazyLoadingEnabled” value=”true” />

<setting name=”aggressiveLazyLoading” value=”false”/>

</settings>

在映射文件中,<association>元素和<collection>元素中都已默认配置了延迟加载属性,即默认属性fetchType=”lazy”(属性fetchType=”eager”表示立即加载),所以在配置文件中开启延迟加载后,无需在映射文件中再做配置

1一对一

使用<association>元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可

2

2.一对多

<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的

<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性–ofType

ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

<collection >元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:

3

3.多对多

多对多的关联关系查询,同样可以使用前面介绍的<collection >元素进行处理(其用法和一对多关联关系查询语句用法基本相同)

<!–在多对多的关系映射中,存在第三张中间表,中间表注入另外两张表的实体对象,其它两张表相互注入List<T>集合对象。在map.xml中直接用collection 进行多对多关联即可
https://www.cnblogs.com/ysocean/p/7237499.html#_label5
–>

案例:

实体bean:三张表tbuser,tbgroup,UserGroup(中间表) 多对多关系

TbUser:

TbGroup:

UserGroup:

 

tbgroup.xml文件

 

总结:这两种方式各有各的优缺点,嵌套查询的查询语句写起来简单,但是执行的sql语句多,性能要低一点,嵌套结果的查询语句写起来难一点,而且sql语句只执行一条,性能相对较高;刚开始用可能会遇到很多细节问题,但是慢慢熟悉了,感觉就会好很多,用起来也得心应手了

———————