mybatis 多表关联查询
MyBatis 多表关联查询
一对多查询
一对多关联查询是指,在查询一方对象的时候,同时将其所关联的多方对象也都查询出来。
.
Ⅰ、多表连接(联合)查询
这种方式只用到
1
条SQL
语句。
.
注意:
-
即使字段名与属性名相同,在
<resultMap> </resultMap>
中也要写出它们的映射关系。因为框架是依据这个<resultMap> </resultMap>
封装对象的。 -
在 "一方" 的映射文件中使用
<collection> </collection>
标签体现出两个实体对象间的关联关系。
其 collection
两个属性的解释如下:
-
property
:指定关联属性,即Class
类中的集合属性studentList
。 -
ofType
:集合属性的泛型类型,即com.rnny.entity.Student
。
Ⅱ、多表单独查询
多表连接查询方式是将多张表进行连接,连为一张表后进行查询。其查询的本质是一张表。
而多表单独查询方式是多张表各自查询各自的相关内容,需要多张表的联合数据,再将主表的查询结果联合其它表的查询结果,封装为一个对象。
多个查询是可以跨越多个映射文件的,即是可以跨越多个 namespace
的。在使用其它 namespace
的查询时,添加上其所在的 namespace
即可。这种方式要用到 2
条 SQL
语句。
代码如下所示:
.
-
先执行
findClassesById
查询主表classes
,查询出各个列的值,包括cid
。 -
查主表出来的各个列值传递给
<resultMap id="classesResultMap" >
进行结果映射。其中cid 的值还要传给<collection>
节点作为实参。 -
执行
selectStudentsByClasses
查询,以cid
做为实参,查询出结果,结果封装为<resultMap id="studentResultMap">
。
多对一关联查询
多对一关联查询是指在查询多方对象的时候,同时将其所关联的一方对象也查询出来。
由于在查询多方对象时也是一个一个查询,所以多对一关联查询,其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。 配置多对一关联的重点在于 "多方" 的映射文件要有 <association> </association>
属性关联 "一方"。
Ⅰ、多表联合(连接)查询
.
Ⅱ、多表单独查询
.
-
<select id="searchStudentsById">
中查询出来的classno
传递给<association>
中的column="classno"
-
再把
classno
的值做为实参,传递给<select id="findClassesById">
中的形参#{cid}
自连接
多对一的方式实现自连接
思路分析:将员工当作多方,上司当用一方。
.
Employee
里面的一个属性 leader
, 本身就是 Employee
类型。
单独查询
.