MyBatis:自关联查询——多对多查询的实现

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

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

建立DB表:

MyBatis:自关联查询——多对多查询的实现

course表:课程名和id

MyBatis:自关联查询——多对多查询的实现

student表:学生姓名和id

MyBatis:自关联查询——多对多查询的实现

中间表:学生id和课程id

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

建立实体类:

MyBatis:自关联查询——多对多查询的实现

Student

MyBatis:自关联查询——多对多查询的实现

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);

MyBatis:自关联查询——多对多查询的实现

映射文件

MyBatis:自关联查询——多对多查询的实现

测试类

MyBatis:自关联查询——多对多查询的实现

查询结果


二、多表单独查询:

MyBatis:自关联查询——多对多查询的实现

映射文件

为甚要创建中间类?

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

MyBatis:自关联查询——多对多查询的实现

Middle类(中间类)


三、多表复杂查询:

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

MyBatis:自关联查询——多对多查询的实现

映射文件

MyBatis:自关联查询——多对多查询的实现

测试类

MyBatis:自关联查询——多对多查询的实现

查询结果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值