当前位置: 首页 > news >正文

mybatis多表查询

多表查询有哪些情况

Mybatis 支持多表查询,常见的多表查询方式包括使用嵌套查询和关联查询

嵌套查询

嵌套查询是指在 SQL
语句中嵌套另外一个查询语句,可以用于在一个表中查询与另一表相关的数据。例如,在一个订单表中同时需要查询该订单所属用户的信息,可以使用嵌套查询。

假设我们有两个表,orders 表和 user 表,orders 表中有一个 user_id 字段,对应着 user 表中的 id 字段,下面是查询某个订单和对应的用户信息的 SQL 语句:

SELECT o.*, u.*
FROM orders o
INNER JOIN user u ON u.id = o.user_id
WHERE o.order_no = '001'

这里使用了 INNER JOIN 进行内连接,将 orders 表和 user 表连接在一起,查询条件为 o.order_no = ‘001’。SELECT 语句中指定了要返回的字段,由于两个表中可能有重复的字段,所以用 o.* 和 u.* 表示要返回的所有字段

在 Mybatis 中实现嵌套查询可以使用 resultMap 标签来定义查询结果映射,下面是一个示例:

<resultMap id="orderUserMap" type="Order"><id property="id" column="id"/><result property="orderNo" column="order_no"/><!-- 其他订单相关字段 --><association property="user" javaType="User"><id property="id" column="id"/><result property="username" column="username"/><!-- 其他用户相关字段 --></association>
</resultMap><select id="selectOrderWithUser" resultMap="orderUserMap">SELECT o.*, u.*FROM orders oINNER JOIN user u ON u.id = o.user_idWHERE o.order_no = #{orderNo}
</select>

其中, 定义了 Order 类和 User 类的属性映射,关键字 id 表示主键property 指定类属性名column 指定字段对应的列名

在 resultMap 中使用 标签来表示一个查询结果需要关联另外一个对象,这里用于关联订单和用户。property 指定类属性名,javaType 指定关联对象的类型,其他属性映射同上。

最后,在 中使用 resultMap 属性绑定映射关系,#{orderNo} 表示动态参数。

关联查询

关联查询是常用的一种多表查询方式,可以使用 Mybatis 提供的关联标签来实现。

假设我们有两个表,orders 表和 user 表,orders 表中有一个 user_id 字段,对应着 user 表中的 id 字段,下面是查询所有订单及对应用户的 SQL 语句:

SELECT o.*, u.*
FROM orders o
LEFT JOIN user u ON u.id = o.user_id

这里使用 LEFT JOIN 进行左连接,将 orders 表和 user 表连接在一起,查询所有记录。由于有可能存在订单没有对应用户,所以需要使用左连接进行查询。

在 Mybatis 中实现关联查询可以使用 association 和 collection 标签,它们分别用于表示一对一关联和一对多关联关系。下面我们分别来看一下:

一对一关联查询

首先定义 Order 类和 User 类,其中 Order 类中有一个 user 属性:

public class Order {private Integer id;private String orderNo;private Integer userId;private User user;// 省略 getter/setter
}

定义 OrderMapper 接口:

public interface OrderMapper {List<Order> selectAllOrdersWithUser();
}

然后在 OrderMapper.xml 文件中实现多表查询:

<select id="selectAllOrdersWithUser" resultMap="orderWithUserMap">SELECT o.*, u.*FROM orders oLEFT JOIN user u on u.id = o.user_id
</select><resultMap type="Order" id="orderWithUserMap"><id column="id" property="id"/><result column="order_no" property="orderNo"/><!-- 其他订单相关字段 --><association property="user" column="user_id" javaType="User" select="selectUserById"/>
</resultMap><select id="selectUserById" parameterType="int" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>

其中,resultMap 定义了 Order 类的属性映射使用 <association> 标签表示一对一关联column 表示关联条件字段select 表示关联查询的 SQL 语句

在上述示例中,我们定义了 selectUserById 这个查询语句,用于根据用户 id 查询用户信息。在 association 标签中指定了 select 属性后,Mybatis 会自动根据这个语句进行关联查询。

最后,我们只需要在 OrderMapper 接口中调用 selectAllOrdersWithUser() 方法即可完成多表查询:

List<Order> orders = orderMapper.selectAllOrdersWithUser();

一对多关联查询

在一对多关联查询中,需要定义一个中间表来存储两个实体之间的关联,例如定义 Order 类OrderItem 类,中间表是 order_item

首先定义 OrderItem 类和 Order 类,其中 Order 类中有一个 orderItems 属性

public class OrderItem {private Integer id;private Integer orderId;private String itemName;private Double itemPrice;
}public class Order {private Integer id;private String orderNo;private List<OrderItem> orderItems;// 省略 getter/setter
}

定义 OrderMapper 接口:

public interface OrderMapper {List<Order> selectAllOrdersWithItems();
}

然后在 OrderMapper.xml 文件中实现多表查询:

<select id="selectAllOrdersWithItems" resultMap="orderWithItemsMap">SELECT o.*, oi.*FROM orders oLEFT JOIN order_item oi on oi.order_id = o.id
</select><resultMap type="Order" id="orderWithItemsMap"><id column="id" property="id"/><result column="order_no" property="orderNo"/><!-- 其他订单相关字段 --><collection property="orderItems" ofType="OrderItem" ><id column="id" property="id"/><result column="item_name" property="itemName"/><result column="item_price" property="itemPrice"/><association property="order" column="order_id" javaType="Order" select="selectAllOrdersWithItems"/></collection>
</resultMap>

其中,resultMap 定义了 Order 类的属性映射,使用 <collection> 标签表示一对多关联,column 表示关联条件字段,select 表示关联查询的 SQL 语句。

在上述示例中,我们定义了 selectAllOrdersWithItems 这个查询语句,用于查询所有订单和订单明细信息。在 <collection> 标签中指定了 select 属性后,Mybatis 会自动根据这个语句进行关联查询。

最后,我们只需要在 OrderMapper 接口中调用 selectAllOrdersWithItems() 方法即可完成多表查询:

List<Order> orders = orderMapper.selectAllOrdersWithItems();

相关文章:

mybatis多表查询

多表查询有哪些情况 Mybatis 支持多表查询&#xff0c;常见的多表查询方式包括使用嵌套查询和关联查询 嵌套查询 嵌套查询是指在 SQL 语句中嵌套另外一个查询语句&#xff0c;可以用于在一个表中查询与另一表相关的数据。例如&#xff0c;在一个订单表中同时需要查询该订单所属…...

kafka 从入门到精通

kafka 安装 zookeeper模式 创建软件目录 mkdir /opt/soft cd /opt/soft下载 wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz解压 tar -zxvf kafka_2.13-3.4.0.tgz 修改目录名称 mv kafka_2.13-3.4.0 kafka配置环境变量 vim /etc/profileexport K…...

写PPT没有思路, 这些底层方法论让你灵感爆棚……

作为一个10年经验的策划人&#xff0c;以下是个人多年经验&#xff0c;看完绝对对你写PPT会有很大帮助&#xff01; 首先&#xff0c;有很多新手写PPT有一个不好的习惯&#xff0c;就是喜欢直接上手就打开PPT开始啪啪啪打字。 这是非常错误的&#xff0c;这就等于你是想到哪写…...

【小沐学Python】Python实现Web服务器(Flask+Vue+node.js,web单页增删改查)

文章目录 1、简介1.1 flask1.2 vue 2、开发2.1 新建flask项目2.2 安装flask库2.3 新建flask的主脚本2.4 新建Vue项目2.5 安装vue项目依赖项2.6 新增组件Ping.vue2.7 Ping.vue增加HTTP请求2.8 美化vue前端页面2.9 新增组件Books.vue2.10 flask增加路由Books2.11 Books.vue增加HT…...

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…...

工业识别与定位系统源码解决方案

工厂人员定位系统源码&#xff0c;工业领域定位系统源码 近年来人员定位系统在工业领域的发展势头迅猛&#xff0c;工业识别与定位成为促进制造业数字化的关键技术。通过实时定位可以判断所有的人、物、车的位置。实时定位系统要适用于复杂工业环境&#xff0c;单一技术是很难…...

PCL学习之滤波算法

前言 点云滤波作为常见的点云处理算法&#xff0c;一般是点云处理的第一步&#xff0c;对后续处理有很重要作用。滤波 有很多方面也有很多种功能&#xff0c;比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等 原始点云数据往往包含大量散列点、孤立点&#xff0c;在获取…...

第二章 链表

目录 一、移除链表元素二、设计链表三、反转链表四、两两交换链表中的节点五、删除链表倒数第N个节点六、链表相交七、环形链表Ⅱ 一、移除链表元素 Leetcode 203 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyHead new Lis…...

Spring Security OAuth2实现单点登录:简化多个系统之间的登录流程

Spring Security OAuth2实现单点登录&#xff1a;简化多个系统之间的登录流程 一、介绍OAuth21. OAuth2的定义和作用2. OAuth2的优点和使用场景 二、Spring Security1. Spring Security的介绍2. Spring Security的特点和优势 三、OAuth2与Spring Security的结合1. OAuth2在Spri…...

语义分析器

语义分析器&#xff08;Semantic Analyzer&#xff09;是编译器中的一个重要组成部分&#xff0c;它负责对源代码进行语义分析&#xff0c;检查源代码是否符合语义规范&#xff0c;并进行错误处理和类型推导等操作。 举个例子&#xff0c;假设有以下的源代码&#xff1a; int…...

爬虫基本原理

爬虫基本原理 1.1获取网页1.1.1提取信息1.1.2保存数据 1.2请求1.2.1 请求方法1.2.2 请求网址1.2.3 请求头1.2.4请求体1.3响应 1.1获取网页 爬虫首先要做的工作就是获取网页&#xff0c;这里就是获取网页的源代码。源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代…...

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…...

English Learning - L3 Lesson1 VOA-Color 译文

听碎 VOA NOW, THE VOA SPECIAL ENGLISH PROGRAM WORDS AND THEIR STORIES Every people has its own way of saying things, its own special expressions. Many everyday American expressions are based on colors. 各国人民都有自己说话的方式&#xff0c;有自己独特的表…...

如何在linux中配置JDK环境变量

在linux系统部署皕杰报表&#xff0c;因皕杰报表是一款纯java报表工具&#xff0c;运行时需要jre环境&#xff0c;所以要在服务器上配置三个jdk环境变量path、classpath、JAVA_HOME。 那么为什么要配置jdk环境变量呢&#xff1f;因为java软件运行时要用到一些java命令&#xff…...

横截面收益率(二) 阿尔法策略是如何构建的

资本资产定价模型自从首次被提出以来在金融经济学中一直处于中心地位。 在一系列简化假定条件下&#xff0c;资本资产定价模型表明&#xff0c;任何证券的收益率与该证券 的系统性风险&#xff08;或者贝塔值&#xff09;呈线性关系。因此&#xff0c;依据资本资产定价模型横截…...

【ConfluxNews】2023.5.15 警惕任何未经合约审计的项目

1.【网络状态】当前版本V2.2.3&#xff0c;全网算力≈8T&#xff0c;昨日交易次数20K&#xff0c;昨日新增账户0.17K&#xff0c;昨日新增合约0个&#xff1b; 2.【POS参数】总锁仓275M&#xff0c;节点总数284&#xff0c;年利率13.7%&#xff08;理论计算&#xff09;&#x…...

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…...

快速入门matlab——变量练习

学习目标&#xff1a;1.掌握matlab编程中最常用的几种变量类型 2.对变量类型的属性有所熟悉&#xff0c;不要求记忆&#xff0c;知道了解即可 3.要求熟练运用这几种变量类型创建自己的变量 clear all; % 清除Workspace中的所有…...

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…...

ChatGPT详细介绍

ChatGPT: 自然语言处理的强大工具 ChatGPT是一种基于人工智能的自然语言处理模型&#xff0c;它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构&#xff0c;具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话&#xff0c;并提供广泛的应用场景。 …...

【C/C++】EBO空基类优化介绍

空对象优化&#xff08;Empty Base Optimization&#xff0c;简称 EBO&#xff09;是 C 编译器的一种 优化技术&#xff0c;用于消除空类作为基类时占用的内存空间&#xff0c;从而避免浪费空间、提升结构体或类的存储效率。 1 什么是“空对象”&#xff1f; 一个**空类&#…...

PicSharp(图片压缩工具) v1.1.6

PicSharp 一个简单、高效、灵活的跨平台桌面图像压缩应用程序。软件基于Rust实现&#xff0c;高性能低资源&#xff0c;能快速扫描文件或目录&#xff0c;批处理图像。软件还具备组合压缩策略&#xff0c;TinyPNG提供最佳压缩比&#xff0c;但需要互联网连接&#xff0c;对大量…...

AC68U刷梅林384/386版本后不能 降级回380,升降级解决办法

前些时间手贱更新了路由器的固件&#xff0c;384.18版本。结果发现了一堆问题&#xff0c;比如客户端列表加载不出来&#xff0c;软件中心打不开等等。想着再刷一下新的固件&#xff0c;结果死活刷不上去。最后翻阅了大量前辈的帖子找到了相关的处理办法。现在路由器中开启SSH&…...

WPF技术体系与现代化样式

目录 ​​1 WPF技术架构解析​​ ​​1.1 技术演进与定位​​ ​​1.2 核心机制对比​​ ​​2 样式与资源系统​​ ​​2.1 资源(Resource)定义与作用域​​ ​​2.2 样式(Style)与触发器​​ ​​3 开发环境配置(.NET 8)​​ ​​3.1 安装流程​​ ​​3.2 项目结…...

Vue3 GSAP动画库绑定滚动条视差效果 绑定滚动条 滚动条动画 时间轴

介绍 GSAP 用于创建高性能、可控制的动画效果。由 GreenSock 团队开发&#xff0c;旨在提供流畅、快速、稳定的动画效果&#xff0c;并且兼容各种浏览器。 提供了多个插件&#xff0c;扩展了动画的功能&#xff0c;如 ScrollTrigger&#xff08;滚动触发动画&#xff09;、Dra…...

AI API、AI 聊天助手,两大服务助力应用智能化转型

网络效应、转换成本——这些一度定义了我们这个时代商业逻辑的规则&#xff0c;在 AI 时代迅速崩塌。创新性功能被无差别克隆包围&#xff0c;差异化优势在底层能力翻新中消散…… 更别说那些决策迟缓、行动无法言出法随的“后来者”&#xff0c;注定与市场窗口擦身而过。唯快…...

AI生成的基于html+marked.js实现的Markdown转html工具,离线使用,可实时预览 [

有一个markdown格式的文档&#xff0c;手头只有notepad的MarkdownPanel插件可以预览&#xff0c;但是只能预览&#xff0c;不能直接转换为html文件下载&#xff0c;直接复制预览的内效果又不太好&#xff0c;度娘也能找到很多工具&#xff0c;但是都需要在线使用。所以考虑用AI…...

Linux 文件系统与 I/O 编程核心原理及实践笔记

文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度&#xff1a;进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…...

使用Python和Flask构建简单的机器学习API

在机器学习项目中&#xff0c;将模型部署为一个Web API是一种常见的需求。这样可以方便地将模型集成到其他应用程序中&#xff0c;例如移动应用、Web应用或其他后端服务。Flask是一个轻量级的Python Web框架&#xff0c;非常适合用于构建简单的API。本文将通过一个具体的例子&a…...

OpenCV CUDA模块图像处理------图像融合函数blendLinear()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数执行 线性融合&#xff08;加权平均&#xff09; 两个图像 img1 和 img2&#xff0c;使用对应的权重图 weights1 和 weights2。 融合公式…...