Mybatis的级联操作主要是针对一对多、多对一和多对多的情况而设定的。级联是在resultMap标签中配置的。级联并不是必须的,好处就是获取关联数据便捷,但如果级联过多会增加系统的复杂度,同时降低系统的性能。
一个人对应多件衣服为例
(1)先来看一下 标签中的属性:
property:对象属性的名称,对应一对多中一的字段名
ofType:指定的是映射到集合属性中bean的类型
column:所对应的外键字段名称
select:使用另一个查询封装的结果
xml文件
主要注意的是collection标签的property属性要对应一对多中一的字段名
mapper接口
public interface UserMapper {
List oneToMoreQuery(int id);
}
当然也可以通过 < collection > 标签中 select 属性来执行另一个映射语句来返回预期的复杂类型结果
xml文件
这个 < collection > 标签的select意思是:根据 oneToMoreQuery2 方法查询出的结果对象中的 id 属性当做参数,传递给 otherQuery 方法再次进行查询,实际上是执行了两次查询操作。
多件衣服对应一个人为例
先来看一下 < association > 标签中的属性:
property:对象属性的名称
javaType:对象属性的类型
column:所对应的外键字段名称
select:使用另一个查询封装的结果
在Clothe类中新增User属性
和一对多的场景类似,只不过这里是借助了association标签来进行关联:
xml文件:
以用户和角色这个例子,一个用户可以属于多个角色,一个角色又可以分配多个用户,这就形成了一个多对多的关系,由于是多对多,就要使用到第三张表,这是一个关系表,用于记录两个表中的主键。
users表:
roles表:
user_role表:
查询user中的多角色
xml文件
查询role中的多用户
xml文件
其实多对多就是两个一对多组成的,一对多掌握了,多对多也就很容易上手了。
所以最重要的还是要掌握住一对多和多对一的写法,一法通则万法通,最基础的掌握住了,一对一和多对多也就不难理解了。另外主要好好理解 < collection > 和 < association > 标签,mybatis中级联查询的实现就是通过这两个标签实现的。