mybatis order by 多个_mybatis框架学习的最后一天

本文介绍了在mybatis中进行多对多查询的实践,包括如何处理多对多关系,使用resultMap进行一对一和一对多映射,并探讨了resultMap的继承来避免重复配置。此外,还详细讲解了mybatis的延迟加载机制,如何改造一对一查询以实现性能优化。
摘要由CSDN通过智能技术生成

今天是刘小爱自学Java的第119天。

感谢你的观看,谢谢你。

fff47f3b748c63e320094090e7d1fb61.png

学习内容安排如下:

  • 昨天没有学完的多对多查询补充。
  • resultMap标签的继承问题。
  • mybatis中的延迟加载。

一、多对多查询

案例:查询订单,查询出下单人信息并且查询出订单详情中的商品数据。

1业务分析

一共有4张表,都是基于订单表的,我们再次梳理下它们的关系:

  • 一对一:订单和用户的关系,所以在订单类中封装了一个用户对象。
  • 一对多:订单和订单详情的关系,所以在订单实体类中封装订单详情集合。
  • 多对多:订单详情和商品的关系,它们之间的关系是依托于订单的。
36470d2a9ff46d24c8a19080ffbd38c6.png

一个订单对应多个订单详情,从而引出了多个商品。但是如果在同一个订单详情中呢?

一个订单详情对应一个商品,所以我们在订单详情中加入item实体类对象。

这个关系捋清楚了,代码也就好写了。

其中关于sql语句的编写

本来一开始时特不喜欢sql语句大写字母的,因为个人觉得其可读性差,就跟枚举一样。

不过Navicat中有一个美化SQL的功能,就是将sql语句弄成这个样子的。

我一想那肯定有它的道理,就试着用了下,慢慢地竟然觉得也挺好看的,真香。

人啊,果然最怕陷入固有的思维,不敢或者说反感去接触自身不熟悉的东西。

总觉得自己很了解自己,其实根本就不了解。

2代码编写

e66d8c2b2355c84422b688ca9b98241e.png

在接口OrderMapper中创建对应的查询方法,关于方法要保证见名知义。

老实说,这种大驼峰式的命名方式,我还觉得蛮好看的,可读性很强。

然后在映射文件中编写对应的sql语句。

返回值使用resultMap标签说明其映射关系。

其中resultMap标签中代码编写如下:

f6f533660a34f1a4d1e68881173bfe18.png

返回值都是依托于Order这个实体类的。

①一对一关系

用association标签说明Order实体类中的user属性是和User实体类对应的。

②一对多关系

用collection标签说明Order实体类中的orderdetails和List相对应的。

③多对多关系

在一对多关系中的一对一关系即为多对多。

在同一订单详情中商品和订单详情是一对一关系,所以使用association标签说明。

值得注意的是

  • autoMapping属性为true即开启自动映射,如果控制台有的值输出为null,大概率就是没有设置自动映射的原因。
  • colum属性,是和数据库中的列名相对应的,非order的id就使用对应的外键id名,如果没有,我们可以自己创建一个别名。

关于colum属性,我做一个详细说明:

10e8955de13adcb429eff1db03df79fc.png

上图是Navicat中执行sql语句后的一张结果表,因为太长了我把它们分开了,其实就是一张表,数据由四张表组成:

该结果表中的id也就是和主表order中的id。

id1,id2,id3也就是从表各自的id,但是因为其顺序是可变化的,并不能成为表的唯一标识。

所以就使用外键的方式来说明从表的id,也就是user_id,item_id这些。

但是orderdetail这张表并没有外键,就在sql语句中给它创建一个别名,也就是detail_id。

二、resultMap的继承

补充说明下这个小知识点;

95b9ce14495f1c31398595c4f253846b.png

在resultMap中有代码会出现不断地重复配置的情况,比如关于order与user的映射关系。

如果存在重复的代码,可以使用继承的方式,和Java中一样也是extend这个关键字。

在extend属性中说明需要继承的resultMap标签对应的id即可。

三、延迟加载

延迟加载的作用在于性能上的节省。

1改造一对一查询

案例:根据订单号查询出订单信息,并查询出该订单的下单人信息。

我们一开始是使用的一条sql语句完成数据库查询,可以将其改造成两条sql语句。

24615f1b6b5731d0aac5154f0c088f4e.png

①resultMap标签中说明返回值。

②association子标签

通过select指定需要执行的查询语句。

也就是说①中的sql语句执行后,通过该属性让③中的sql语句执行。

这样就能完成两条sql语句的依次执行了。

2开启延迟加载

cfc370b330c776410393ce003b330c94.png

①开启延迟加载

lazyLoadingEnabled,延迟加载的全局开关,当开启时,所有关联对象都会延迟加载。

默认值是false,我们需要将其设定为true。

②开启按需加载

aggressiveLazyLoading

当开启时,任何方法的调用都会加载该对象的所有属性;否则,每个属性会按需加载。

默认值为true,这里设定false,关闭立即加载,也就是开启按需加载了。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值