order by 子查询_【框架】118:mybatis之多表高级查询

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

感谢你的观看,谢谢你。

27b57b1108fe9b47eb505816bc2e938b.png

学习内容安排如下:

  • 补充说明知识点:resultMap,sql片段。
  • mybatis中的高级查询,即多表关联查询。
  • 查询主要分为:一对一,一对多,多对多,本来打算全学完的,奈何计划赶不上变化。

一、知识点补充

1resultMap

又要提到前面那个说了好几遍的起别名问题了,使用resultMap标签也能解决这个问题。

当然该标签最主要的应用还是在于多表关联查询,先对其有个初步了解:

67aff980e01ac252947763f668e7fe78.png

select标签中resultMap的值为userMap,根据这个值找到对应id的resultMap标签。

这样的一个好处在于独立出来了一个标签,我们在该标签里面可以做很多事情。

上述中就可以在resultMap标签中使用type属性说明,其对应的实体类为User。

使用result子标签也可以将数据表中的字段和实体类属性关联起来:

  • column对应的也就是数据库中的列名。
  • property对应的也就是实体类的属性。

当然取别名的方法还是使用settings开启驼峰匹配方便,不过resultMap也有其它的应用。

2sql片段

我们先看两条sql语句:

8d515baaeb7fd4066665e89e7fe997ff.png

在sql语句中,*号是大忌,它的出现也就意味着性能低下,一般都不会直接用它。

在这里使用将所有列名都书写的查询方式,这两条sql语句本质上其实就是一回事。

当然具体如何优化sql语句,应该没这么简单,我只是以此引出sql片段这个知识点。

如果每次都要书写这么长的sql语句,显然是一件很麻烦的事情。

所以为了解决这个问题,使用sql片段:

d916ccf25988755e6e06c4bbcb15d18d.png

将sql语句经常被使用的部分抽取成一个sql片段,在sql语句中使用标签引用该片段即可。

当然关于sql片段我们专门创建一个xml文件存放,再引用对应的片段也是可以的。

不过要注意:在核心配置文件中别忘了引入该映射文件,我这边就不说详述了。

3高级查询引入

表与表之间的关系,无外乎就是三种:

  • 一对一关系:比如用户和订单关系。
  • 一对多关系:比如订单和订单详情关系。
  • 多对多关系:比如订单和商品的关系。

二、一对一查询

案例:根据订单号,查询出订单信息,以及下单人信息。

1案例分析

5692cd05f3a8048be9d9a2cd7d37e0a1.png

①需求分析

因为涉及到订单信息表,和下单人信息表两张表的信息,所以需要使用到多表关联查询。

②查询结果

其结果有两张表的数据,那么如何在Java中接受查询到的数据呢?

我们知道数据表可以对应一个Java实体类,现在有多张表数据如何对应一个Java实体类?

就可以使用③这种方式,将User实体类对象作为Order实体类的成员变量。

2代码编写

5eb26fdaa689aa3cf646520e43032cfd.png

①mapper层接口方法

根据订单号查询订单和用户,参数为订单号,结果为一个order对象。

②映射文件sql语句编写

这不用多说,上述就已经分析了。

③测试代码

我们会发现其查询结果中,order实体类中的user属性为null

为什么会这样呢?

因为mybatis并不能自动映射user实体类,所以需要自行配置resultMap。

3代码优化

4b562271f67f0aff590e01d747c79b48.png

①结果集类型为order

指定结果集id,编写对应的resultMap标签。

②association标签

其翻译过来本身就是联合的意思。

  • property:也就是order中需要关联的属性,这里也就是user。
  • javaType:关联属性对应的Java类型,这里也就是User实体类。

③关联属性id

User的id在order中对应的也就是user_id。

再次测试查询时,就能发现查询结果中user类中的数据也能获取了。

三、一对多查询

案例:查询订单,查询出下单人信息并且查询出订单详情。

653a1c5994676e61b8a23dbe0d550c9f.png

①sql语句编写

查询结果与三张表相关联,那么一共有两次表关联查询。

②数据库查询结果

通过结果我们可以发现一个订单号查询出了2个订单详情。

③Order实体类拓展

订单和订单详情是一对多关系,那么同理,将订单详情的集合封装成订单的一个属性。

分析完毕,代码编写,同样的方式使用resultMap标签,一次性将代码写完整。

55bc938be2df14a5d666cff2d7cb0a41.png

①mapper层接口方法说明

②映射文件中sql语句编写

③一对多查询,collection标签,其本身翻译过来也就是集合的意思:

  • property:属性名,这里也就是封装到Order类中的orderdetails属性。
  • javaType:集合类型,我们封装的是List。
  • ofType:集合中的元素类型,即泛型。
  • autoMapping:开启自动映射

id子标签:要指定在查询结果中orderdetail表中的id,其id我们使用了起别名的方式加以说明,也就是detail_id。

最后

谢谢你的观看。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css中变形,css3中变形处理

transfrom功能在css3 中可以使用transfrom功能实现文字或图像的旋转,缩放,倾斜,移动等变形处理deg是css3中使用的一种角度单位。旋转: 使用rotate方法,在参数中加入角度值,在角度值后要加上角度单位deg。旋…

获取 子文件夹 后缀_后期制作老司机教你一键批量生成项目文件夹

我猜你的项目工程是这样的,当你老板说去修改一下之前几个月的工程的时候,你都不知道哪个工程才是最终版呀。乱糟糟的工程而且当你打开工程的时候,wo艹,素材怎么丢失了~~不管是后期制作者还是平常我们日常工作,一定要养…

ffmpeg将文件转码后推向服务器,使用 Serverless 云函数 + ffmpeg 实现音视频转码服务...

核心价值视频应用、社交应用等场景下,用户上传的图片、音视频的总量大、频率高,对处理系统的实时性和并发能力都有较高的要求。例如:对于用户上传的视频短片,我们可以使用多个云函数对其分别处理,对应不同的清晰度(108…

python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行

展开全部${rr.right_name}扩展资料 java控制台程序判断String字符e68a8462616964757a686964616f31333431373263串中只输入了一个回车: importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.util.Scanner; publicclassTest{ publicstaticvoi…

logger 参数列表过长_[源码级解析] 巧妙解决并深度分析Linux下rm命令提示参数列表过长的问题...

在维护实习单位服务器的过程中,偶然发现一个有350万文件的文件夹需要清理,于是我习惯性执行了rm -rf ./*,却在数秒后被告知“参数列表过长”。在一番折腾过后,我终于通过取巧的办法完成了这一任务,也随着相关内核源码的…

collect的功能是什么?其底层如何实现的?_为什么你要用 Spring ?

前言现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Java就直接从Spring框架开始学习,导致产生…

m3u8合并mp4软件_m3u8格式转mp4究极办法!

你们来这个号这么久了!还没给你们分享过一些实用的干货。打今天起这个公众号将给大家推荐一些APP和实用的小软件和一些小教程。生命太短,没时间留给遗憾。若不是终点,都不要把自己留在原地,请一直微笑向前!我是帮忙坏哥…

android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...

先上效果图:制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类&…

vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录

本人一直都是在物理机环境下使用Anaconda,好处是提供了比较完全的机器学习包,还有方便的虚拟环境,缺点是体积太大。但如果直接用Anaconda中的根目录环境作为pycharm中的Python解释器,因为在运行程序前会不断加载根目录中的Python包…

css3弧形跑道效果_Css 实现漂亮弧形

在实现页面五花八门的有特色的ui时,我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢?用图片?好像不大现实,因为这样就要无故多加载一张图片了,这里我们来说说怎么用css的after伪类来实现弧形。先…

python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条线。并且为了增加乌龟画图的艺术价值…

教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...

方式一:运行截图数据库的sql语句:/*Navicat Oracle Data TransferOracle Client Version : 12.1.0.2.0Source Server : ORCZYTSource Server Version : 120100Source Host : localhost:1521Source Schema : C##ZYTTarget Server Type : ORACLETarget Ser…

python实现xmind_Python xmind库(生成框架图)

小编在测试日常工作中遇到一个费时的问题,如何将excel中的测试用例,生成测试框架图?经过查阅发现的python xmind库 将excel中的测试用例,生成测试框架图,分为2步 1.解析excel,取出excel中数据(此…

python代码解读软件_5种带你轻松分析Python代码的软件库

通常,人们会使用两种速度来衡量某种编程语言的优劣,即:开发速度和执行速度。对于Python而言,大家往往受益的是它能够快速地编写代码,而忽略了它是否能够快速地运行,并及时完成既定的任务。因此,…

mac ssh客户端_Electerm for Mac(ssh客户端)

Electerm for Mac是一款功能强大的,作为终端或ssh / sftp客户端(类似于xshell)为一体的工具,支持多平台(linux,mac,win),还有自定义终端样式,全局/会话代理,将书签/主题/快速命令同步到github s…

armbian nginx 部署博客_通过Git将Hexo博客部署到服务器

本文首发于我的个人博客https://orxing.top,欢迎来访服务器是用的阿里云ECS CentOS,本来是用来部署WordPress的,后来接触了Hexo,就把Hexo直接部署到了GitHub pages和Coding Pages上,但是最近发现Coding pages经常抽风&…

python 字符串格式化语法_Python基础语法--字符串格式化

PS:在学习到Python的字符串格式化一些个人的总结,利用字符串格式化可以更好的对代码结果进行格式化输出语法栗子 例子中通过接收用户输入的值,赋值给sex_input和age_input生成两个变量,并根据判断输出相应的语句,and是…

springmvc跳转html_SpringMVC基础(三)

本篇文章主要整理了数据处理、乱码处理和Json的相关知识。参考的狂神说的公众号以及视频。所有代码亲测有效。数据处理主要包括处理提交的数据以及将数据显示到前端。处理提交的数据一般有三种情况:(1)提交的域的名称和方法的参数名称一致时:RequestMapp…

查看本机所有请求_【松勤教育】Fiddler抓包-只抓APP的请求

fiddler抓手机app的请求,估计大部分都会,但是如何只抓来自app的请求呢?把来自pc的请求过滤掉,因为请求太多,这样会找不到重要的信息了。环境准备:1.电脑上已装fiddler2.手机和电脑在同一局域网一、设置1.fi…

icmp报文格式_TCP/IP(二):IP报文格式详解

1. IP 报文格式0bit是指位于最左边的最高位,31bit是指位于最右边的最低位,4个字节的32bit按照 bigendian(大端格式:低字节位于高地址)字节序传输:首先是0~7bit,其次 8~15bit,然后 16~23bit,最后…