假设一名学生可以选多门课,每门课可以由多名同学来选,那么这就涉及到多对多关系。
需求:通过查询学生,可以得到这名学生所选全部课程信息。
建立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。