假设一名学生可以选多门课,每门课可以由多名同学来选,那么这就涉及到多对多关系。

需求:通过查询学生,可以得到这名学生所选全部课程信息。

建立DB表:

course表:课程名和id

student表:学生姓名和id

中间表:学生id和课程id

student和course表的内容其实都是相对独立,我们通过一个中间表middle来连接两个表。

建立实体类:

Student

Course

注意:

多对多查询时,双方的地位都是相同的,为此我们可以在任何一方设立关联属性,现在我们在两者中都设立关联属性(双向关联)。

我们在写toString()方法时要注意以一方为主,假如Student类的toString()是这样的

public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", course=" + course + "]";
}
Course类的toString()方法是这样的:
public String toString() {
return "Course [cid=" + cid + ", cname=" + cname + ",student="+student+"]";
}

这时在查询Student时,会输出course,也就会查询并输出Course,输出时遇到student,就会再去找Student......这就是一个死循环。为此,假如我们以Student为主,Course类的toString可以是这样的:

public String toString() {
return "Course [cid=" + cid + ", cname=" + cname + "]";
}

这就很好的避免了死循环。

一、多表连接查询:

创建接口: Student selectStudentById(int id);

映射文件

测试类

查询结果


二、多表单独查询:

映射文件

为甚要创建中间类?

因为查询courseid的map封装时type需要一个封装对象来承担这个结果

Middle类(中间类)


三、多表复杂查询:

创建接口: List<Student> selectStudentById(int id)

映射文件

测试类

查询结果

这里不同于前两个的是,这里查询需要List。