要求,我们要从下面的两张表中,查找信息(这里返回的信息是两张表的, 怎么办?之前我们都是一张表):

班级表:

学生表:

定义两个Java中的类:

班级类:

学生类:

1、我们要查找学生的信息,注意上面的图,学生信息里面还封装了班级的信息,我们怎么办?

1、)我们可以使用业务装配方式

提取业务到业务层,关键代码如下:

分别在班级mapper和学生mapper里面写

运行效果:

实际上,就相当于是我们先查询学生表t_student,然后遍历查询到得到学生集合,通过传学生的cid去查课程表信息

2、多表关联查询resultMap_单个对象——N+1方式实现

我们在学生的StudentMapper.xml中,这样配置

这里解释一下:本来select标签的resultType是自动映射,这里我们使用的是resultMap,resultMap中关联(association)另外一个对象的语句,(没有自动映射了)

测试结果:

什么是N+1,因为这里只查询了一次学生表,查询了N次班级表,所以叫做N+1模式

3、我们这里也可以不使用N+1模式,只查询一次那就得让查询语句变一下就好了

我们看到,SQL语句变为了两表连接查询,得到的返回结果是一个student对象,但是这里注意,每个学生对象里面还有一个班级的信息,这里使用了association标签

通过定义映射关系, 并通过指定对象属性的映射关系. 可以把看成一个使用. javaType 属性表示当前对象, 可以写全限定路径或别名.

运行结果:

2、我们现在要查询班级的信息,注意了,这次班级里面包含有学生的信息,和前面的换了,看类:

班级类:

学生类:

学生类中已经没有了班级信息了

2.1首先肯定是N+1模式查询班级的信息

ClassMapper.xml配置文件:

它返回值类型还是resultMap,它引用了StudentMapper.xml中的查询

运行结果:

查询了一次班级信息,再根据班级的cid去查找对应班级的学生生息,所以也是N+1

但是这里注意了,之前我们查询学生的时候,一个学生对应一个班级,我们使用association标签,它就是对应一个对象的,这里一个班级对应多个学生,这里的是集合,我们得用collecttion标签

2、1现在我们也可以使用多表联查

注意colletion标签

3、我们也可以使用Auto-Mapping配合别名实现

我们不用那么复杂,直接这样写就可以了

说明:ResultType是自动映射的,

a) 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.

b) SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号(左上角1数字旁边那个键), Oracle 可以使用("")符号.

总结:

associattion 是关系 一个学生对象中包含有一个班级对象

collection 是集合 一个班级对象包含有多个学生对象

ResultType 自动映射

ResultMap 手动映射

MyBatis多表联查练习pan.baidu.com

提取码:ur2z