mybatis一对多和多对一的联系和区别(例子详解)

使用mybatis操作数据库也有好一阵时间了,本篇记录并解释一下使用mybatis进行一对多,多对一查询显示数据。(一对一此处不讲解,会了一对多查询,一对一也就会了)

本例用员工表和部门表作为讲解,首先看员工表和部门表的表结构:

在这里插入图片描述
解释:部门表就包含两个字段,员工表的部门编号作为外键指向部门表的部门号(员工表是子表(这里可以理解为从表),部门表是父表(这里可以理解为主表))
(一般存在关系的表,在多的一方(员工表)存一(部门表)的字段(此例是存部门表的部门号)作为外键)

员工表:
在这里插入图片描述
部门表:
在这里插入图片描述
写java接口之前先把sql写出来,一般来说,进行关联查询(一对一,一对多,多对一),至少要用两张表以上,

首先看多对一,意思是说。多个员工对应一个部门,先看sql:

#查询全部员工信息
SELECT e.id,emp_name,emp_pwd, sex,age,phone,iner_date,job,d.depart_name
FROM employee e
LEFT JOIN department d ON e.depart_id = d.id;

在上面就讲述了存在关系的表,用关联字段把两张表连接起来(此例是用员工表的部门编号关联部门表的部门号),也就是两表关联查询

查看结果:
(数据有点少啊哈哈哈)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190908175213520.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NfYmlhbmNoZW5neGlhb2JhaQ==,size_16,color_FFFFFF,t_70
上面相信有sql基础的朋友都能写出来,那怎么在java上表示这种关系呢。
首先java先创建员工类和部门类的javaBean:
员工类:
在这里插入图片描述
(注意要遵循javabean规范,此处的构造器和setget方法省略)

部门类:
在这里插入图片描述
有朋友会问,员工表不是有个部门编号吗,为什么不把部门编号作为员工类的属性
这就是sql和java 的区别了

在数据库中,员工表是通过字段(部门编号)去关联部门表的,那么在java上,则是用部门类作为员工类的属性,这样两者就有关联了!

员工类:
在这里插入图片描述
部门类:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190908180239226.png
员工类存单个部门类,部门类存员工类的集合(前者为多对一,一个员工对应一个部门,后者为一对多,一个部门对应多个员工)

理解这种关系后,就可以写mapper了(用注解也行)。
(多对一)
首先写dao接口:
在这里插入图片描述
对应的mapper:
在这里插入图片描述
因为是两张表,所以返回的是resultMap
resultMap:
在这里插入图片描述
主要是看红色圈:该标签是用来关联“一”的(此例关联部门类),把查询到的关于部门的数据(此例为部门名)放到该属性上,形成多对一。
写完后,单元测试一下:
在这里插入图片描述
数据就出来了:
在这里插入图片描述
在这里插入图片描述
红圈处为部门表的数据

再来看一对多:一个部门对应多个员工,先看sql:
#查询部门对应的员工信息
SELECT d.id,depart_name,e.id eid,emp_name,phone
FROM department d LEFT JOIN employee e ON
d.id = e.depart_id;
结果:
在这里插入图片描述
先写dao接口:

对应的mapper:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190908211016171.png![在这里插入图片描述](https://img-blog.csdnimg.cn/20190908213513603.png
此处注意:因为查询的字段有两个相同名字的,所以后者用别名区别一下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190908211041924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NfYmlhbmNoZW5neGlhb2JhaQ==,size_16,color_FFFFFF,t_70
主要看红色大框的地方,上处框了两个红框,先看第一个,由于是一对多关联,所以使用的标签把查到的属于员工表的字段映射员工类的属性上。
第二个框(根据需要)的意思是把查到的字段再映射到员工类下的部门属性字段:
在这里插入图片描述
可以进行级联映射。
写测试查看结果:
在这里插入图片描述在这里插入图片描述
至此,一对多的结果就出来了

最后说一下本人用mybatis查询踩的一些坑:
首先是别名问题,比如上例
SELECT d.id,depart_name,e.id eid,emp_name,phone
FROM department d LEFT JOIN employee e ON
d.id = e.depart_id
不要别名eid,直接在column写e.id员工id是出不来的(显示null)

再看一下类型区别:
resultMap中的type指的是返回的整个类型,这里返回的是Department(不设置别名的话要写全限定名(包名+类名))
collection上的property是Department类中的员工属性名,ofType是指该属性的元素值(属性employees是List类型,用ofType表示List下的Employee元素 javaType是写java类型,比如List的实现类ArrayList)
在这里插入图片描述

一对多和多对一的本质都差不多,一对多会了,一对一,多对一也就会了。

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值