Java06-MyBatis如何实现多表查询(一对一、一对多)

前提

总结这个文章的前提是要会基本的SQL语句(我用的MySQL)和JDBC的基本实现。在这个基础上,我们可以通过一些标签或者注解去实现对数据库的多表联查基于一对一和一对多的关系。

第二点,我们在制作数据库时一定要考虑不同的表之间的关系。这种关系指的就是一对一和一对多的关系,举个例子,一个班有许多学生但一个学生不会在不同班上课,因此班级——>学生就是一对多,而学生——>班级就是一对一。

在理解以上两点后,我们就可以去用Mybatis去实现多表联查。

注解去实现联查

首先,我们建立一个基于mybatis框架的项目,具体的目录如图

图1. 一个mybatis框架的项目

整个项目中,我们需要完成实体类的包,Dao层的包以及Mapper包去放我们的接口如图2和图3,我展示了购物地址的实体类和Dao层接口。


图2. 实体类

 图3. Dao层接口

 在Dao层接口中,我们需要写一个实现增删改查等数据库操作的接口,那么mybatis会在我们调用这些接口时,自动帮我们去创建实现类然后去实现这些接口。用注释的方法来传输我们的SQL语句,一些关键字是我们需要知道的:insert, delete, update,select。这四个关键字是最重要的,以上是在单表查询需要知道的关键字,如果是多表联查,我们需要在这些关键字的基础上了解一下其它关键字如图4和图5。

图4. 多表联查的关键字 one =@One

 

 图5. 多表联查的映射关系

从上面两个图可以看到,关键字 one =@One就是表示两表是一对一的关系,需要注意关键字的大小写。然后需要知道,我们在数据库中,多表联查得到的是一个虚表,那么为了让mybatis能映射到这张虚表的数据,我们可以以一张表为主表,然后让它和另一张表相同的字段作为一个焊接点去焊接另一张表,需要注意的是,因为这个字段以及被用来映射表了,所以如果我们需要这个字段的数据,可以重新在映射它与java的属性名。最后,可以看出,多表联查对于表中的每个字段与java的属性必须一一映射,所以我们最好把映射关系写全,同时多表查询也是两个接口的互动,因为我们是用两个select语句来实现这个联查。那么多表中一对多的实现就是关键字的改变:many =@Many。我们看图6

图6. 一对多的多表联查

 图7. 一对多的多表联查

 还是我在上面强调的内容,关键字,映射以及SQL语句,这三点完成我们就能实现多表联查,值得注意的是,一对多我们需要考虑谁是主表。

小结:注解的方式去实现多表联查是我认为最轻松的方式,它只需要写两个接口的就可以实现我们想要的功能。对比于用XML文件去映射在代码量上确实轻松不少,但是它同样也带来了很多问题,比如我们需要熟悉这个逻辑,同时SQL语句也又一次和java代码写在一起,这也就说明了硬编码问题。

XML文件映射

对于注释,XML文件的内容会比较多,但是它的映射逻辑更清晰,同时没有硬编码问题。SQL语句也不再是分开写再映射,而是一个完整的SQL语句。首先我们看一对一。

图8 XML文件一对一关系

首先我们要注意一对一的标签:<collection></collection>这是一个双标签,它包裹了另外一张表的映射关系,所以我们就可以在一个XML文件去完成整个查询。我们再看一对多关系

图9. XML文件一对多关系

一对多的关键标签是:<association></association>,这个标签里写的是副表的映射,一般一对多我们是要想清楚谁作为主表的,也就是一对多中的“一”, 这样的数据也会更清晰。

总结

Mybatis的多表联查是十分重要的内容,因为我们的客户需求很多时候我们是需要将两个表结合在一起比如购物车系统,所以我们需要先理清表与表之间的关系,然后选择合适的方式去进行多表联查。 

 

 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值