MyBatis之三:多表联合查询

在这篇文章里面主要讲解如何在mybatis里面使用一对一、一对多、多表联合查询(类似视图)操作的例子。

注:阅读本文前请先大概看一下之前两篇文章。

 

一、表结构

班级表class,学生表student,班级学生关系表ClassStudent。

这里一个学生只会在一个班级里面,也就是一对一的关系;一个班级有多个学生,也就是一对多的关系。

 

结构如下:

 

3张表的数据如下:

 

二、在原项目下新建一个包com.mybatis.sqljoinrelation,在包里面新建一个sqlMapper.xml的映射文件,在项目的mybatis的配置文件conf.xml中对这个sqlMapper.xml进行注册,注册片段如下:

紧接着在原项目下再新建一个包com.mybatis.bean,在里面新建实体类

 

学生:

 

班级:


 

学生班级视图类:

 

三、查询操作

1、 一对一,查询学生编号等于1001且他所在班级信息

2、一对多,查询班级编号等于1且包含所有学生信息

3、类似视图查询学生编号等于1001且他所在班级信息

 

sqlMapper.xml如下:

 

测试代码如下:

一对一与类似视图查询的代码在一起,如下:

 

一对多测试代码如下:

 

四、sqlMapper.xml需要说明的问题

1、一对一:<association property="tempClass" javaType="com.mybatis.bean.Class">
association字面意思关联,这里只专门做一对一关联; property表示是com.mybatis.bean.StudentTemp中的属性名称; javaType表示该属性是什么类型对象

2、类似视图查询: <select id="getStudentAndClassView" parameterType="int" resultType="com.mybatis.bean.studentclass">
resultType 对应简单类型,也就是实体中的属性名称与数据库表字段名称一模一样;
resultMap 对应复杂类型,属性名称与字段名称不一样可以通过resultMap中property,column进行映射,其中一对一与一对多都是用resultMap来映射

3、一对多:<collection property="students" ofType="com.mybatis.bean.Student">
collection字面意思是集合,这里专门做一对多关联 ,property表示集合类型属性名称,ofType表示集合中的对象是什么类型

4、<select>select * from …</student>与<select>select 字段1,字段2,字段3… from …</student>
可以显示指出c.class_id,c.class_name,s.s_id,s.s_name列明,如果用"*"代替,则mybatis会自动匹配resultMap或者resultType中提供的列名,
如果某对象存在列映射的属性,但是在select 后面找不到这个列,则在返回结果中,该列多映射的值为null。

至此,对于一对一、一对多、视图查询都能很好的解决,主要还是要重点关注第四点说明。

 

from:https://www.cnblogs.com/wucj/p/5148813.html